汇编语言第6章子程序设计.ppt
《汇编语言第6章子程序设计.ppt》由会员分享,可在线阅读,更多相关《汇编语言第6章子程序设计.ppt(71页珍藏版)》请在三一办公上搜索。
1、6.1 子程序的调用与返回指令,6.1.1 子程序的调用指令CALL 6.1.2 返回指令RET,下一节,6.1.1 子程序的调用指令CALL,指令格式:CALL OPD注:过程名或子程序名就是子程序入口处的符号地址。执行CALL指令时,首先要保留断点地址于堆栈中,然后程序转移到指定的子程序入口地址处去执行子程序。由于子程序与调用它的程序可能在同一个段中,也可以不在同一个段中,CALL指令在转移到子程序入口地址时有两种寻址方式:直接寻址方式和间接寻址方式或者称为直接调用和间接调用。前面提到,指令指针寄存器IP总是指向下一条将要执行的指令。在执行指令CALL时,堆栈中保存的就是原程序的断点地址(
2、CALL指令后面1条指令的地址称为断点地址,也即返回地址)。,1.段内直接调用,在调用指令的目的操作数中直接给出过程名或子程序名。如CALL PROC1执行的操作:(SP)(SP)-2(SP)+1,(SP)(IP)(IP)(IP)+16位的位移量指令中的过程名或子程序名为NEAR属性,给出了转向地址(即子程序的入口地址,亦子程序的第一条指令的地址)。【例6.1】CALL DISPLAY1 DISPLAY1 PROC NEAR RET,2.段内的间接调用,子程序的入口地址存放在一个16位通用寄存器或字存储单元中。在调用指令的目的操作数是除立即数寻址的某种寻址方式确定的有效地址EA。执行的操作是:
3、(SP)(SP)-2(SP)+1,(SP)(IP)(IP)(EA)【例6.2】CALL BX;CALL WORD PTR BX,3.段间直接调用,调用指令的目的操作数中直接给出过程名或子程序名。如:CALL PROC2注:在不同的逻辑段中进行调用,直接调用的属性为FAR类型。执行的操作:(SP)(SP)-2(SP)+1,(SP)(CS)(IP)(EA)(SP)(SP)-2(SP)+1,(SP)(IP)(IP)偏移地址(CS)子程序的段基址【例6.3】CALL DISPLAY2 DISPLAY2 PROC FAR RET,4.段内间接调用,子程序的入口地址存放在一个双字存储单元中,低地址的字单元
4、存放入口地址的偏移量,高地址的字单元存放入口地址的段基址。执行的操作:(SP)(SP)-2(SP)+1,(SP)(CS)(IP)(EA)(SP)(SP)-2(SP)+1,(SP)(IP)(IP)(EA)(CS)(EA+2)【例6.4】CALL DWORD PTR BX,返回本章首,返回指令RET,RET指令放在子程序的末尾,它使子程序的功能完成后返回到调用程序继续执行,而返回地址是调用指令时存入堆栈中的,回此RET指令的操作就是返回IP寄存器和CS寄存器的值。语句格式:RET 执行段内RET指令时,从堆栈顶部弹出一个字(返回地址)送IP。执行段间RET指令时,从堆栈顶部弹出两个字(返回地址),
5、分别送入IP和CS中。语句格式:RET n(n为偶数)指令中参数N 应为偶数,如:2,4,6等。此指令先从堆顶弹出返回地址送IP或者IP和CS中,然后用参数N修改堆栈指针SP的值。SP=(SP)+N根据调用的不同,返回指令也分为:,1段内返回执行的操作:(IP)(SP)+1,(SP)(SP)(SP)+22段内带立即数返回 RET N执行的操作:(IP)(SP)+1,(SP)(SP)(SP)+2(SP)(SP)+N,返回本章首,6.2 子程序的设计方法,6.2.1 子程序的定义 6.2.2 子程序的调用与返回 6.2.3 信息的保存与恢复,下一节,6.2.1 子程序的定义,子程序的定义是由过程定
6、义伪指令PROC和ENDP来完成的。其格式如下:过程名 PROC NEAR/FAR 过程名 ENDP 其中PROC表示过程定义开始,ENDP表示过程定义结束。过程名是过程入口地址的符号表示。一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。当子程序和调用程序在同一个段时,子程序定义为NEAR属性;当子程序和调用程序不在同一个段时,子程序定义为FAR属性.,【例6.5】主程序和子程序在同一个代码段时的调用和定义CODE SEGMENT MAIN PROC FAR CALL SUBPROG1 RETMAIN ENDP;这一条指令也可以写在子程序结束之后SUBPROG1 PRO
7、C NEAR RETSUBPROG1 ENDPCODE ENDS,【例6.6】主程序和子程序不在同一个代码段时的调用和定义CODE SEGMENT MAIN PROC FAR CALL SUBPROG1 RETMAIN ENDPCODE1 SEGMENT SUBPROG1 PROC NEAR RETSUBPROG1 ENDPCODE1 ENDS,返回本章首,6.2.2 子程序的调用与返回,子程序的正确执行是由子程序的正确调用和正确返回保证的。汇编语言中子程序的调用指令CALL和返回指令RET来完成调用和返回功能。在前面学习CALL和RET指令时,在调用子程序时要把返回地址入堆栈,在返回时要把返
8、回地址出栈,因此在子程序的设计中一定要特别注意堆栈的使用。,返回本章首,6.2.3 信息的保存与恢复,由于主程序和子程序都具有相互独立的属性,而CPU中的寄存器是共用的,因此主程序和子程序在使用寄存器时有可能会发生冲突,也就是说主程序在调用子程序之前的某一个寄存器中的内容在从子程序返回后还要使用,而该寄存器在子程序中恰好被使用过,这样执行完子程序,相应的寄存器的内容就被改变,不是调用前主程序中该寄存器中原有的内容,从而当子程序执行完成后返回主程序执行时,主程序执行错误。为了避免类似这种错误,需要在进入子程序时,将子程序中涉及到主程序中的相应的寄存器内容进行保护,而在退出子程序之前恢复到原寄存器
9、中,称这个为现场进行保护。,【例6.7】若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则可采用如下方法保护和恢复现场。PROG PROCPUSH AXPUSH BXPUSH CX;保护现场PUSH DX POP DXPOP CXPOP BX;恢复现场POP AXRET;返回断点处PROC ENDP,返回本章首,6.3 主程序与子程序参数传递方式,6.3.1 寄存器法 6.3.2 用参数表传递参数 6.3.3 堆栈法,下一节,6.3 主程序与子程序参数传递方式,调用程序在调用子程序时,经常需要向子程序传递一些参数,子程序运行结束后,有时候也需要向调用程序返回一些数据。这种在调用程序和
10、子程序之间的信息的传递称为参数的传递(也中变量的传递)。汇编语言中,参数的传递方式有:,6.3.1 寄存器法,此种方法,多用于参数较少的情况。其方法就是将要传递的参数放入指定的寄存器中,然后在子程序中再从指定的寄存器中将参数读出。【例6.8】从键盘输入一个十进制数,判断它的奇偶性,若为偶,在屏幕上显示”0”;若为奇,则显示”1”。程序中用寄存器BL进行参数的传递:,CODE SEGMENT ASSUME CS:CODESTART:MOV AH,01H INT 21H CLC RCR AL,1 JNC EVN MOV AL,31H MOV BL,AL CALL DISP,EVN:MOV AL,3
11、0H MOV BL,AL CALL DISP MOV AH,4CH INT 21H DISP PROC NEAR MOV AH,02H MOV DL,0AH INT 21H,MOV DL,0DHINT 21HMOV DL,BLINT 21HRETDISP ENDPCODE ENDSEND START,返回本章首,6.3.2 用参数表传递参数,这种参数传递方式通过定义一组连续的存储单元,即参数来进行参数的传递,将要传送的参数存放在参数表相应的存储单元内,然后把参数表的首地址通过BX寄存器传送到子程序中去。子程序通过访问参数表中相应的存储单元来获取所需的参数。,返回本章首页,【例6.9】,【例6.
12、9】定义两个长度相同的数组A1、A2分别对两个数组求和、求差,并将结果保存数 组A3、A4中。DATA SEGMENT A1 DB 24,35,67,45,89,90,99 LEN EQU($-A1)A2 DB 22,30,45,34,12,2,6 A3 DB LEN DUP(?)A4 DB LEN DUP(?)TABLE DW 0,0,0,0,0 DATA ENDS,CODE SEGMENT ASSUEM CS:CODE,DS:DAT MAIN PROC FAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV TABLE,OFFSET A
13、1 MOV TABLE+2,OFFSET A2 MOV TABLE+4,LEN MOV TABLE+6,A3 MOV TABLE+8,A4,LEA BX,TABLE CALL ADDA3 CALL SUBA4 RET MAIN ENDPADDA3 PROC NEAR PUSH AX PUSH CX PUSH SI PUSH DI MOV CX,BX+4,T1:MOV AL,BX ADD AL,BX+2 MOV BX+6,AL DEC CX INC BX CMP CX,0 JNZ T1,POP DIPOP SIPOP CXPOP AXRETADDA3 ENDPSUBA4 PROC NEARPUS
14、H AXPUSH CXPUSH SIPUSH DIMOV CX,BX+4,T1:MOV AL,BX SUB AL,BX+2 MOV BX+8,AL DEC CX INC BX CMP CX,0 JNZ T1 POP DI POP SI POP CX POP AX RETSUBA4 ENDPCODE ENDS END MAIN,返回本章首,6.3.3 堆栈法,此种方法适用于参数多、子程序嵌套调用和递归调用的情况。使用方法是调用程序在被调用子程序之前将参数压入堆栈,子程序从堆栈中取得参数。,【例6.10】,【例6.10】在数据段中存放着某班的三门课的成绩,求每门课的最高分,并分别存入到三个单无中。
15、DATA SEGMENTSCORE1 DB 91,62,63,84,76,76,78,55,64,64LEN1 EQU$-SCORE1SCORE2 DB 66,64,64,65,45,62,77,89,99,69LEN2 EQU$-SCORE2SCORE3 DB 77,88,92,63,21,64,83,88,81,53LEN3 EQU$-SCORE3MAX1 DB?MAX2 DB?,MAX3 DB?DATA ENDS STACK SEGMENT TABLE DW 9 DUP(?)TOP LABEL WORD STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 章子 程序设计
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6586425.html