第12章汇编语言与高级语言的连接ppt课件.pps

上传人:牧羊曲112 文档编号:2103760 上传时间:2023-01-10 格式:PPS 页数:69 大小:736KB
返回 下载 相关 举报
第12章汇编语言与高级语言的连接ppt课件.pps_第1页
第1页 / 共69页
第12章汇编语言与高级语言的连接ppt课件.pps_第2页
第2页 / 共69页
第12章汇编语言与高级语言的连接ppt课件.pps_第3页
第3页 / 共69页
第12章汇编语言与高级语言的连接ppt课件.pps_第4页
第4页 / 共69页
第12章汇编语言与高级语言的连接ppt课件.pps_第5页
第5页 / 共69页
点击查看更多>>
资源描述

《第12章汇编语言与高级语言的连接ppt课件.pps》由会员分享,可在线阅读,更多相关《第12章汇编语言与高级语言的连接ppt课件.pps(69页珍藏版)》请在三一办公上搜索。

1、第12章 汇编语言与高级 语言的连接,12.1 BASIC程序对汇编语言子程序的调用 12.2 C语言和汇编语言的相互调用12.3 FORTRAN和PASCAL等对 汇编的调用,12.1 BASIC程序对汇编语言子程序的调用,PC机各种版本的BASIC语言对汇编语言子程序的调用方法是相同的。它们都有实现调用的语句和函数,即CALL语句和USR函数。12.1.1 CALL语句 这个语句的功能是调用一个机器语言子程序。格式为:CALLnumvar(Variable,Variable),其中numvar是数字变量的名字,这个变量值指明被调用的汇编语言子程序在内存中的入口地址的偏移量,而入口地址的段地

2、址则由语句DEFSEG进行定义。Variable是变量的名字,它是由BASIC语言传送给汇编语言子程序的参数。例如:250 DEF SEG&H5000 260 LET X0 270 CALLX(A,B$,C),其中250行的DEFSEG语句把子程序装入的段地址设置为5000H;260行中的LET语句,将子程序装入当前段的偏移量赋给X,此处偏移量为o。因此,这个被调用的机器语言:子程序,是从绝对地址50000H单元开始执行的。变量A,B$,C作为传送给这个汇编语言子程序的参数。这个参数是BASIC语言通过堆栈向汇编语言传送的。BASIC语言要调用汇编语言子程序,要做两件事,首先给汇编语言确定在内

3、存中的装入地址的段地址值和段内偏移量值。此外还要向汇编语言子程序通过堆栈传送参数。,利用CALL指令调用汇编语言子程序,有两种方法。1.以数据形式装入汇编语言子程序 以BASIC语言的数据形式装入汇编语言子程序的机器代码,它是通过READ和DA-TA语句装入的,然后再使用CALL语句实现调用。,例121 把指令代码作为BACIC数据读入的程序:10 DEFINT AZ20 DEFSEG&H170030 FOR I0 TO 2140 READ J50 POKE I,J60 NEXT70 SUBRT080 A2:B3:C090 CALL SUBRT(A,B,C)100 PRINT C,110 EN

4、D120 DATA&H55,&H8B,SLHEC,81H8B,&H76130 DATA&HOA,SLH8B,&H04,&H8B,&H76140 DATA&H08,&H03,SIH04,&H8B,&H7E150 DATA&H06,&H89,&H05,&HSD,&HCA160 DATA SLH06,SLH00OKRUN5OK,从120行至160行提供了一个完成两个数相加的子程序,从这个例子中,可以看出这 种调用方式的步骤有四点:逐条地把要调用的汇编语言子程序的指令代码,以十六进制数的形式表示。将指令代码放在BASIC程序的DATA语句中作为数据。十六进制数前加&H符号。执行一个循环体,用READ语

5、句从DATA数据区中读出数据,用POKE语句将它存放到由DEFSEG语句指定的段地址的单元中。,定义段内偏移量SUBRT0,对传送给汇编语子程序的参数赋值,然后用CALL语句进行调用。利用DATA语句和READ语句读入汇编语言子程序的代码和调用该子程序时,受到汇编语言子程序代码长度的限制,当代码很长时,这种方法的程序书写和输入都比较麻烦,且容易出错,指令代码也不便于阅读和记忆。,2用BLOAD语句读入内存和用CALL语句调用 第二种方法是先将汇编语言子程序的机器代码以二进制文件的形式存放在磁盘上,然后用BLOAD语句读入内存,再以CALL语句进行调用。装入内存的段地址由DEFSEG语句指定,而

6、段内偏移量的开始位置则由BLOAD语句给出。其形式为:BLOADSUBRTEXE,0 其中。为段内偏移量的开始值。,例122 用BLOAD语句装入磁盘文件的方式调用汇编语言子程序。10 A2:B3:C0 20 DEF SEG&H27E0 30 BLOAD,SUBRTEXE,0 40 SUBRT0 50 CALLSUBRT(A,B,C)60 PRINTC 70 END 其中A,B,C为整型变量的表示形式。,例123 汇编子程序如下:NAME EX123 CSEG SEGMENT ASSUME CS:CSEGSUBRT PROC FAR PUSH BP MOV BP,SP MOV SI,BP+10

7、 MOV AX,SI MOV SI,BP+8,ADDAX,SI MOVDI,BP+6 MOVDI,AX POP BP RET 6SUBRT ENDPCSEG ENDS END,以上程序是实现两个数相加的汇编语言子程序。它是以文件名SUBRTEXE存放在磁盘上的。这种调用方法的特点是:BAS解释程序将CALL语句解释为以远调用的方式调用汇编语言子程序。BASIC解释程序在CALL SUBRT(A,B,C)语句执行时,按A、B、C的次序分别将它们压入堆栈,因此在CALL语句执行完毕时,SP指针向低地址方向移动了10个字节。,汇编语言子程序的入口处有一条指令PUSHBP,其作用是把BP的值保护起来,

8、以便用指令MOVBP,SP将堆栈指针送至BP中,以BP作为堆栈的基址指针从堆栈中取出参数。例如本例中,变量A在BP+10中;变量B在BP+8中;结果C应存于BP+6单元中,实际上A、B、C在此处是参数的地址。,在汇编子程序结束前,应用指令POP:BP,恢复BP现场,用RET 6(一般情况下为RETn)使BASIC存入堆栈中的参数作废,同时把栈指针调整到调用开始时的位置上。此处的n为参数的个数乘2,例如本例中有3个参数,故n应为6。BASIC堆栈如图121所示。,图 12.1,12.1.2 USR函数 这是PC机为BASIC语言调用汇编语言子程序设置的一个函数.它提供了CALI+语句之外的调用汇

9、编语言子程序的一种方法。函数的功能是用自变量调用指定的汇编语言子程序。函数的格式:VUSRn(arg),其中n是一位十进制数.它的范围在09之间。这个数字是由相应的DEFUSR语句指定的。如果n被缺省掉.就认为是USR0。圆括号中的arg是任意数字表达式或字符串变量.它是汇编语言子程序的变量。例如:20 DEFUSR0&HF000 30 AUSR0(C2)40 BUSR0(C3),例中30行用自变量C2调用函数USR0。40行用自变量C3再次调用USR0函数.每调用一次函数USR0.则相应地由USR0函数调用个汇编语言子程序。20行指定的USR0的值为F000H.它是子程序的入口地址的段内偏移

10、量.段的基地址仍由DEF SEG语句指定。,12.2 C语言和汇编语言的相互调用,若用C语言来编写程序.不但编程比较容易.而且效率也比较高;而汇编语言不易编写.但它的效率更高.也最适用于直接对计算机硬件进行控制。如果把这两种语言混合起来编程.能够得到最优的程序质量。,从C语言中调用汇编语言子程序的具体方法应该随着C编译程序的不同而有所不同。本节在理论上的阐述是适合于所有的C编译程序的.但所举的例子是使用MicrosoftC编译程序3.0版或4.0版及MASMV5.0宏汇编.它们是PC机上最为流行的C编译和宏汇编。12.2.1 汇编语言子程序调用方法 1.一个实例 C语言主程序名为addlto2

11、.汇编语言子程序名为add.asm.主程序调用子程序是为了求l加2的和.并用printf()函数将结果打印出来。,由于C编译程序总是自动地在所定义的函数和变量名前再加一个下划线,例如C语言程序中定义了一个变量abc,则编译完成后这个变量的名字变成了abc。在汇编语言中如果想引用这个名字时,则也使用名字ABC。反过来,如果在汇编语言中定义了一个变量名为XY,则在C语言中引用这个变量时,应该使用变量XY。由于C语言在调用函数名add(1,2)时,汇编语言子程序的名字应为add,所以过程名在汇编语言中应写成add。,2.C语言调用汇编语言子程序的规则(1)编写汇编过程的步骤 建立过程;进入过程;分配

12、局部数据(任选的);保存寄存器值;存取参数;返回值(任选的);退出过程。,(2)建立过程 建立一般的汇编过程用PROCENDP伪指令便可以了。在这里,则应将过程名add用PUBLIC指示符说明为公用的符号。此外,为了使其中的数据为其它模块公用,也应说明为PUBLIC。如果要存取全程的数据,则必须用EXTRN说明。,对于段名的设置有一些专门的规定,这与C语言的内存模式有关,这些模式有小模式、中模式、紧凑模式、大模式和巨模式5种。对于小模式,只产生代码段和数据段两个段,这两个段都被限制在64KB以内。在小模式中,所有的调用都为近(NEAR)调用,所有的指针都是16位指针,对于个别不在代码段的函数,

13、可用关键字FAR来调用。对于个别不在数据段内的数据可以用FAR或HUGE关键字来修正指针。上例是一个小模式下的过程例子。在小模式中,代码段指定用TEXT段名,且用PUBLIC,CODE,说明,这也是C编译产生的段名,如表121所示。,表12.1 C编译产生的段名,表12.1中的DATA、CONST、BSS、STACK几个段被组合成一个名为DGROUP的组,在正常操作时,DS和SS都指向这个组的起点。此外,这个组的开头还有一个名为NULL的段,这个段用于存放编译程序拷贝数和检测无效指针。如果在程序运行之前和程序运行之后检查NULL段,发现内容已经改变,则说明出现了严重的错误。最常见的错误是程序间

14、接地往0指针写了什么东西。这时会显示“NULLPointerAssignment”信息。显然这个DGROUP组的总字节不能超过64KB。图12.2给出了MicrosohC编译产生的段的存放示意图。,图 12.2,(3)进入过程 C程序在调用汇编语言子程序前,把要传给被调用函数的参数入栈,且按参数表中的逆顺序把参数压入堆栈。这样,参数表中的第一个参数总是最后一个被压入,因而也就被存在堆栈的顶部。有时,参数表中的第一个参数就是为了说明实际参数的个数有多少,这时就必须把这个数放在堆栈的栈顶处。因为只有这个位置是固定的,取得了这个数以后,也就知道随后有多少个参数。,有些类型的变量是先转换成另一类型后才

15、压入堆栈的。将C中的字符型(char)转换成整型(int);无符号数的字符型(unsignedchar)转换成无符号整型(unsignedint);浮点型的(float)转换成双精度型(double)。结构即structure类型,它是按逆顺序整个压入堆栈的。对于数组,压入堆栈的是指向数组的指针。近指针是16位,远指针是32位,先压入段寄存器值,后压入偏移量。下面的表12.2列出了压入参数时各个参数所占的字节数。,表12.2 C程序参数压栈时参数类型及字节数,有了表122所给的各类参数在堆栈中所占的字节数,汇编语言子程序就能很方便地取得有关参数。这只要在进入过程后,编写下列两条指令:PUSH

16、BP MOV BP,SP 首先将BP内容压栈保护,并将SP内容送BP,然后,就可以方便地以BP为基数寄存器取得堆栈中的有关参数。,(4)分配局部数据(任选的)汇编过程可以采用类似于高级语言使用局部数据的方法。为建立局部数据空间,满足出入堆栈所要求的数值,将SP的内容减少偶数个字节作为堆栈上的局部数据空间。这个空间在过程结束前还应恢复。,最后的两条MOV指令,将局部数据中的变量初始化为o,这些变量从未有任何汇编程序指示符正式说明,既然被设置为局部数据,程序员必须记住它们。局部变量又称为动态堆栈或自动变量。,(5)保存寄存器值 对于任一Microsoft高级语言调用过程,应当保存SI、DI、SS和

17、DS的值(除BP以外,它已经保存)。因此,下推过程改变这些寄存器中的某几个的值,一般在建立结构指针BP以及分配局部数据(如果有的话)以后,保护有关的寄存器。例如:PUSH BP MOV BP,SP SUB SP,4 PUSH SI PUSH DI,(6)存取参数 对于远过程,返回地址为4个字节,因此,以BP为基数,访问第一个参数的有效地址应为BP+6。对于近过程,这个有效地址应为BP+4。所以,在addasm中,由于是近过程,取第一个参数时,用MOVAX,正BP+4,与第二个参数相加时,用ADDAX,正BP+6实现。,(7)送返回值(任选的)MicrosoftBASIC、C、FORTRAN和P

18、ASCAL等高级语言共同接受返回值的类似约定。当要送回的数据是简单的(即没有数组或结构的类型)和不大于4个字节时,约定是相同的。这包含所有NEAR和FAR地址类型(换句话说,所有指针和所有参数按引用传送)。1个字节的返回值由AI。传送;2个字节的返回值由AX传送;4个字节的返回值由DX:AX传送。,其中DX为高16位数据(或段基址),AX为低16位数据(或偏移量)。当返回值大于4个字节时,由BASIC或C调用的过程先分配送回值的空间,然后,把它们的地址放在DX:AX中。建立返回值空间的简便方法是简单地在数据段中说明它。对于由FORTRAN和PASCAL调用的过程,必须用特殊的约定以便送回浮点值

19、、记录和数组以及多于4个字节的值。具体规定说明如下。,为建立长返回值的接口,FORTRAN和PASCAL模块在其调用过程之前采取以下措施:首先在堆栈段的某些地方建立空间以保存实际返回值。当调用汇编过程时,传送额外的参数,此参数包含实际返回值的偏移地址。此参数直接放在返回地址之上(即此参数是最后一个被压入堆栈的)。,送回值的段地址包含在SS和DS中。额外参数(包含送回值的偏移地址)总是定位在BP+6,此外,它的出现自动把所有其它参数的位移加2。如果按下列步骤去做,汇编过程将成功地送返回长值。把返回值的数据放到由返回值的偏移地址所指向的位置上。把返回值偏移(定位在BP+6)复制到AX中,并把SS复

20、制到DX,形成DX:AX的返回值地址。,按下述方法返回。(8)从过程返回 返回时,通常要解决以下几个问题:如果已保护了任一寄存器如SS堆栈。DS、SI或DI,必须按入栈时相反的次序弹出 如果在过程开始分配局部数据空间,SP的值必须用MOVSP,BP恢复。用POPBP指令恢复BP值。,在使用RET指令时,应使用RETn的形式,此处的n为参数个数的2倍。这是C语言以外的调用所要求的。C调用将自动进行调整,例如addasm中,采用了RET返回。,POWER2 PROC PUSH BP MOV BP,SP MOVAX,EBP+4 MOVCX,EBP+6 SHL AX,CL POP BP RETPOWE

21、R2 ENnPTEXT ENDS END,count+inC;return(retvalUe);如果以C程序作参考,用等效的汇编语言程序列出来,内容如下:;首先列出段和组TEXT SEGMENT BYTE PUBLICCODE,TEXT ENDS。BSS SEGMENT WORD PUBLIC,BSS,BSS ENDS,DATA SEGMENT WORD PUBLIC,DATA,DATA ENDSCONST SEGMENT WORDPUBLIC,CONST,CONST;ENDSDGROUP GROUP CONST,,;注意变量yi1astinc和count只和这个C模块有关,与外部模块无关。参

22、数inc和自动变量retValue在此处没有加以声明,它们是在运行时分配在堆栈中的。在调用retNext函数前,应用EXTRN伪指令说明:ASSUME CS:TEXT EXTRN retNext:NEAR;调用前,用EXTRN指明retNext为外部;引用 由汇编调用C的指令将在下面列出其清单。,可以看到,对int类型,汇编语言中都定义为字类型,并用DW定义。inc和返回参数retValue,则由程序运行时分配在堆栈中。以下是汇编语言对C函数retNext的调用:,12.2.4 在C语言程序行间嵌入汇编指令 例12.5 C语言与汇编语言混合编程 main()int I.j char*s pri

23、ntf(“please input:i=“scanf(%d”,&I)asm mov ax,i,asm mov cl,2;asm mul clasm mov j,ax;printf(“the result is:%d*2=%d”,I,j);retch();,汇编指令的功能为负责将键盘输入的值d乘2。编译方法:MASMEXE改名为TASMEXE放在TC子目录中。用TCCEXE编译,连接格式为TCCBL臀关关文件名库文件名.,12.3 FORTRAN和PASCAL等对汇编的调用,FORTRAN对汇编语言调用时,首先说明其调用的过程为FAR,然后遵守如下3条约定:在退出汇编子程序时,过程必须重置SP为

24、自变量放入堆栈前它所具有的值,即用指令RETSIZE完成。SIZE是所有参数的总长度。,以自变量在FORTRAN源代码中出现的同一顺序把自变量放在堆栈中。第一个参数在存储器中最高的地址处,即它被第一个压入堆栈。如果FORTRAN模块用大的或巨型存储模型编译,则FORTRAN参数按引用作远地址传送。如果FORTRAN模块用中模型编译,则作为近地址传送。FORTRAN通过堆栈传送的参数被汇编程序取用时,由于是远调用,因而返回地址是4个字节。假设FORTRAN为大模型,有两个参数时,堆栈图如图12.3所示。,图12.3,图 12.4,12.3.3 FOXBASE调用汇编语言 若用FOXBASE或FO

25、XPRO数据库管理系统,也可调用汇编语言子程序。由FOXBASE向汇编语言传送参数时,是以字符形式按参数顺序传送参数的,参数的地址由DS,BX指向,并以ASCH码值0来表示结束。当参数为字符型表达式或变量时,DS:BX所指向的是第一个字符的存储地址,参数区存储的是各字符的ASCH码值。当采用数字型变量时,DS:BX指向变量值低字节,参数区,存储的是参数的变量值。若为整数,则占用两个字节,反之占用4个字节。在FOXBASE中,用以下3条命令完成对汇编语言子程序的调用:(1)LOAD(二进制文件,BIN)(2)CALL二进制模块WITH(字符表达式变量(3)RELEASEMODULE 其中命令(1

26、)将指定的二进制文件调入内存成为二进制模块,一旦二进制文件被调入,其对应的二进制模块就可以被CALL命令反复调用,直至退出FOXBASE或由命令RELEASEMODULE对模块进行释放,以便留出空间给新的模块。,由LOAD命令装入的二进制文件的长度不能超过32KB。FOXBASE最多可同时装入5个二进制文件。二进制文件和汇编子程序命令文件都是由汇编语言生成的,前者的扩展名为,BIN,后者的扩展名为EXE或COM。后者运行时,必须有一个程序前缀PSP,所以文件中第一条可执行的指令代码必须位于代码段相对位置100H处。而二进制文件没有这个限制。,EXE或,COM文件可由FOXBASE的RUN或J命

27、令指定的DOS命令来运行。FOXBASE在系统初始化时会在内存的某个区域开辟一空间,作为运行由RUN!命令指定的DOS命令使用。这一区域的大小直接影响到DOS命令的执行。如果太小将导致运行失败。该区域的范围可由参数MAXMEM来说明,其值为8KB64KB。如果在应用系统中需要用到RUN!命令执行DOS命令,那么应在FOXBASE系统配置文件CONFIGFX中设定MAXMEM的大小。,如果不设置,将取默认值64KB。但是影响RUN!命令所执行的不仅是MAXMEM参数的设置,还有实际内存容量的问题。如果汉字系统占用过多的内存,例如在CCDOS 213H汉字系统下,如果将所有软字库调入常规内存,那么

28、在运行FOXBASE时,由于汉字操作系统和FOXBASE本身都需占用相当多的内存,往往就没有剩余空间留给MAXMEM,即RUN!命令的运行区。因此,RUN!命令在这种情况下往往不能成功地执行。,一般的,EXE文件,可由EXE2BINEXE程序将其转换为二进制文件。例如有一汇编语言源程序为CEVGA,ASM,经汇编、连接后生成可执行命令CEVGAEXE,则,CEXE2BIN CEVGA CEVGABIN 可将EXE文件转换为CEVGA,BIN文件,然后再将CEVGAEXE删除。调用二进制文件时应注意以下4个问题:生成二进制文件的汇编语言程序不得增加或减少传送参数,应保证参数区结束符位置不变,这一

29、结束符为空字符,其对应的ASCII码值为0。,汇编语言生成的二进制文件是以子程序形式被FOXBASE调用的,而且采用的是远调用的方式。因此,汇编语言程序结束返回处应采用远返回指令RETFAR。FOXBASE调用二进制模块时,DS:BX指向传送参数存储区第一个字节。这里,DS是FOXBASE的数据段寄存器,在汇编语言设计时,应注意在程序开始处保护DS和BX,如果程序中使用附加段寄存器ES的话,还应该保护ES,在返回前恢复它。汇编语言中如果有变量和数据缓冲区,应注意在寄存器寻址时,DS寄存器的值是否是本程序的设定段值;当有目的寻址时,还应注意ES寄存器的值。一般应对DS及ES进行装填。,例126

30、FOXBASE调用汇编程序建立文本窗口。文本窗口是屏幕上的个矩形区,其大小和显示属性都是可以指定的。文本窗口的建立就是根据指定矩形区域左上角及右下角坐标和显示属性(背景色和前景色)在当前屏幕上开辟一矩形区域,以设定的属性显示数据,并在该区域指定的窗口处命名。完成以上功能不能由FOXBASE的命令来实现,只能通过调用汇编语言程序生成的二进制文件进行。运用BIOS的中断INTl0H可以较好地完成这一功能。其基本步骤为:,建立窗口文件,并将座标值送PARA区。计算文本窗口属性值并送PARA区。计算窗口长度和宽度并送PARA区。清文本窗口。初始化窗口显示区,令显示光标位于窗口左将PARA区数据写入文件

31、,并关闭。设汇编语言子程序名为CWINDOWASM。,MOV CX,10 MOV AH,40H INT 21H POP BX;关闭文件 MOV AH,3EH INT 21H ENDL:POP BX POP ES POP DS RET PARA DB 10 DUP(0)CW ENDP CWIN ENDS END,以上程序经汇编、连接、转换后形成二进制文件CWINmWBIN,从而可以由FOXBASE用调用命令CALL进行调用。调用格式为:CALL CWINDOWWITHCHR(X1)+CHR(Y1)+CHR(X2)+CHR(Y2)+CHR(CF)+CHR(CB)+WN,调用参数共7个,其中X1、Y

32、1分别为左上角的列座标及行座标值;X2、Y2分别为窗口右下角的列座标与行座标值;CF为窗口数据显示前景色号;CB为窗口数据显示背景色号;WN为窗口名。该汇编语言子程序将根据该窗口名在当前目录中建立一个同名文件与其对应,内含窗口参数。在窗口显示输出时要反复读该文件,取得各类窗口参数。,FOXBASE的CH37PRG将在屏幕中央建立一个文本窗口,该窗口所占屏幕矩形左上角坐标为(5,20),右下角座标为(20,60),显示前景色号为5,背景色号为2,窗口名为WINDOWl,前景色为品红色,背景色为绿色。CH37 PRG程序如下:SET TALK OFF LOAD CWINDOW;装入二进制模块,CA

33、LLCWINDOW WITHCHR(20)+CHR(5)+CHR(60)+CHR(20)+CHR(5)+CHR(2)+,WINDOWl,WAIT”SETCOLORTO 6+CLEAR;清屏幕 4,18SAY吓,+REPlICATE(,一,20)+,下,K1 DOWHILE K16 i 4+K,18SAY,1+SPACE(40)+,l,Q KK十1 ENDDO,ROW()+l,18SAYL,十REPLICATE(,一,20)十 CAlL CWINDOW WITH CHR(20)+CHR(5)+CHR(60)+CHR(20)+CHR(5)+CHR(2)+,WINDOWl,WAT”RELEASEMODULECWINDOW;清除二进制模块 SETCOlORTO 7 RETURN m上程序第一次建立窗口时将在屏幕上以窗口背景色显示文本窗口区。按任一键后清屏幕,并显示一带黄色边框的窗口。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号