资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,7,章 子程序设计,汇编语言程序设计,本章主要教学内容,本章主要教学目的及要求,1.,理解掌握子程序调用与返回指令;,2.,掌握子程序设计的基本过程和设计方法;,3.,能熟练设计子支程序。,1.,子程序调用与返回指令。,2.,子程序设计的基本过程和设计方法。,7.1,概述,7.1.1,子程序设计的概念,含义,:,被独立出来的程序段称为子程序或过程,主程序与子程序之间的关系,主程序,子程序,CALL SUB1,(,断点,1,:,),CALL SUB2,(,断点,2,:,),HTL,SUB1:,RET,SUB2:,RET,7.1.2,子程序的特性,(,1),功能独立,(,2,)通用性,(,3,)可浮动性,(,4,)可递归和可重入性,7.1.3,子程序的优点,(,1,)简化了程序设计过程,使程序设计时间大量节省。,(,2,)缩短了程序的长度,节省了计算机汇编源程序的时间和程序的,存储空间。,(,3,)增加了程序的可读性,便于对程序的修改、调试。,(,4,)方便了程序的模块化、结构化和自顶向下的程序设计。,7.2,子程序调用和返回指令,7.2.1,子程序调用指令,类型,段内调用,主程序和子程序处在同一代码段,只改变,IP,值,段间调用,主程序和子程序处不在同一代码段,既改变,IP,值也改变,CS,值,段内直接调用,格式,:CALL DST/NEAR PTR DST,功能,:(1),SPSP-2,(,SP,),IP,(2)IPIP+D16,段内间接调用,格式,:CALL DST/WORD PTR DST,功能,:(1),SPSP-2,(,SP,),IP,(2)IP(EA),例:,CALL MULL,段间直接调用,格式,:CALL FAR PTR DST,功能,:(1),SP SP-2,(,SP,),CS,SP SP-2,(,SP,),IP,(2)IP,子程序偏移地址,CS,子程序段地址,例:,CALL BX,CALL WORD PTR SI,段间直接调用,格式,:CALL DWORD PTR DST,功能,:(1),SP SP-2,(,SP,),CS,SP SP-2,(,SP,),IP,(2)IP,(,EA,),CS,(,EA+2,),例:,CALL FAR PTR MULL,例:,CALL DWORD PTR BX,从栈顶弹出一个字数据送入,IP,7.2.2,返回指令,功能:,从堆栈的栈顶弹出数据作为返回地址,含义:实现,子程序执行完后要返回主程序的指令,分类:,段内返回和段间返回,从栈顶弹出两个字数据分别送入,IP,和,CS,类型,段内返回,RET,格式,:,RET,功能:,IP,(,SP,),SPSP+2,RET n,格式,:,RET,n,功能:,IP,(,SP,),SP SP+2 SP,SP+n,段间返回,RET,格式,:,RET,功能:,IP,(,SP,),SP SP+2,CS,(,SP,),SP SP+2,RET n,格式,:RET,n,功能:,IP,(,SP,),SP SP+2,CS,(,SP,),SP SP+2,SP,SP+n,7.3,子程序的定义、调用和返回,7.3.1,子程序定义,1.,子程序定义伪指令,格式:,子程序名,PROC NEAR/FAR,RET,子程序名,ENDP,说明:,(,1,)主程序和子程序在同一代码段中,定义为,NEAR,型。,(,2,)主程序和子程序不在同一代码段中,定义为,FAR,型。,(,3,)可将主程序定义为,FAR,型,看作是,DOS,调用的一个过程。,2.,子程序调用方法说明,包括:,(,1,)子程序名;,(,2,)子程序功能;,(,3,)占用寄存器;,(,4,)入口参数;,(,5,)输出参数;,(,6,)子程序调用示例。,3.,现场保护和现场恢复,现场保护,:,在子程序的功能实现前把将要用到的寄存器中的原有内,容保存起来,现场恢复,:,子程序的功能实现后,将数据取出再送回原来的寄存器中,例:子程序,SUB1,中用到了寄存器,AX,、,BX,、,CX,、,DX,,则可能的现场保护和现场恢复如下:,SUB1 PROC,PUSH AX,;现场保护,PUSH BX,PUSH CX,PUSH DX,;子程序功能段,POP DX,;现场恢复,POP CX,POP BX,POP AX,RET,SUB1 ENDP,注意,:,现场保护应与现场恢复的顺序正好相反。,4.,子程序的设计方法,(,1,)利用过程定义伪指令声明;,(,2,)利用,RET,指令返回主程序;,(,3,)对堆栈的压入和弹出操作要成对使用;,(,4,)现场保护和现场恢复;,(,5,)应安排在代码段的主程序之外,也可以放在主程序开始之前;,(,6,)允许嵌套和递归;,(,7,)可以与主程序共用一个数据段,也可以使用不同的数据段;,(,8,)编写可以很灵活,但一定要保证堆栈操作的正确性;,(,9,)处理好子程序和主程序间的参数传递问题(见,7.4,节);,(,10,)提供必要的子程序说明信息。,子程序定义应用举例,【,例,7-1】,求两个数的最大公约数子程序,子程序调用方法说明:,;子程序名:,MCDST,;功 能:求两个正整数的最大公约数;,;入口参数:,AX,和,BX,中存放两个正整数;,;出口参数:,CX,中存放求得的最大公约数;,;寄存器占用:使用,AX,、,BX,、,CX,、,DX,寄存器,,CX,中内容被改变,,AX,、,BX,、,DX,中的内容保持不变。,子程序清单:,MCDST PROC NEAR/FAR,PUSH AX,;保护现场,PUSH BX,PUSH DX,AGAIN:XOR DX,DX,;,AX,值扩展到,DXAX,中,DIV BX,;商存入,AX,,余数存入,DX,AND DX,DX,JZ EXIT,;余数为,0,转,EXIT,MOV AX,BX,;余数不为,0,更新被除数,MOV BX,DX,;更新除数,JMP AGAIN,;继续循环,EXIT:MOV CX,BX,;最大公约数存入,CX,POP DX,;恢复现场,POP BX,POP AX,RET,;返回主程序,MCDST ENDP,7.3.2,子程序的调用与返回,调用子程序指令:,CALL,返回主程序指令:,RET,【,例,7-2】,以下程序用于计算,=,m!/(n,!*(,m-n,)!),的值(,m,、,n,为自然数,且,mn,)。(假设阶乘乘积大小不超过两个字节),N送CX,调用,SUB1,子程序,AX(即n!)送BX,M送CX,调用,SUB1,子程序,AX/BX(即m!/n!)送BX,mn送CX,调用,SUB1,子程序,AX,(,即,(mn)!,)送,BX,AX/BX(即m!/n!/(mn)!)送AX,存储,AX,Y,N,SUB1,子程序开始,1,送,AX,AX*CX送AX,CX1送AX,CX=0,返回,开始,结束,DATA SEGMENT,M EQU 8,N EQU 3,RES DW?,DATA ENDS,CODE SEGMENT,ASSUME CS:CODE,DS:DATA,START:MOV AX,DATA,MOV DS,AX,MOV CX,N,CALL SUB1,;调子程序计算,n!,MOV BX,AX,MOV CX,M,CALL SUB1,;调子程序计算,m!,DIV BX,;,m!/n,!,送,AX,MOV BX,AX,MOV CX,M,SUB CX,N,CALL SUB1,;调用子程序,计算,(,m-n,)!,XCHG BX,AX,DIV BX,;,m!/n,!/(,m-n,)!,送,AX,MOV RES,AX,MOV AH,4CH,INT 21H,SUB1 PROC,;计算阶乘的子程序,MOV AX,1,NEXT:MUL AX,CX,LOOP NEXT,RET,SUB1 ENDP,CODE ENDS,END START,7.4,子程序的参数传递方法,入口参数:主程序调用子程序前,把要加工的数据传给子程序,这,些数据称为入口参数,出口参数:,子程序执行完后,要把执行结果传回主程序,这些数据,称为出口参数,参数传递方式:寄存器传递、堆栈传递和存储单元传递,7.4.1,通过寄存器传递参数,含义:主程序把入口参数送入某些寄存器,然后调用子程序,子程序中,直接使用存放入口参数的寄存器进行处理。子程序处理完数据,,将执行结果作为出口参数存入寄存器中,回到主程序,主程序对,存放在寄存器中的出口参数进行相应处理,特点:方便、直观,适于参数较少的情况,注意:,用于传递出口参数的寄存器不能进行现场保护和恢复,通过寄存器传递参数应用举例,【,例,7-3】,以,BCDBUF,为首地址的内存中存放着若干单元的用,BCD,码表示的十进制数,每一个单元中存放两位,BCD,码,要求把它们分别转换为,ASCII,码,存放在,ASCBUF,为首地址的单元中,且高,4,位,BCD,码转换成得,ASCII,码放在地址较高的单元。并且要求边转换边显示这些,ASCII,码,DATA SEGMENT,BCDBUF DB 12H,24H,96H,87H,71H,79H,56H,34H,63H,45H,COUNT EQU$-BCDBUF,ASCBUF DB 20 DUP(?),DATA ENDS,STACK SEGMENT PARA STACK STACK,STAPN DB 100 DUP(?),TOP EQU LENGTH STAPN,STACK ENDS,CODE SEGMENT,ASSUME CS:CODE,DS:DATA,SS:STACK,START:MOV AX,DATA,MOV DS,AX,MOV ES,AX,MOV AX,STACK,MOV SS,AX,MOV AX,TOP,MOV SP,AX,MOV SI,OFFSET BCDBUF,;,BCD,码的内存区首地址,MOV DI,OFFSET ASCBUF,;,ASCII,码的内存区首地址,MOV CX,COUNT,;组合,BCD,码个数,CLD,;,DF=0,,按地址递增方式,LP:LODSB,;取一个组合,BCD,码,MOV BL,AL,;暂存,AND AL,0FH,;屏蔽高,4,位,OR AL,30H,;,BCD,码低位转换为,ASCII,码,MOV DL,AL,;存入,DL,STOSB,;存入,ASCII,码存储区,CALL DISP,;调用显示子程序,MOV AL,BL,;取回,BCD,码,PUSH CX,;保存计数值,MOV CL,4,SHR AL,CL,;取,BCD,码高,4,位,OR AL,30H,;,BCD,码高位转为,ASC,码,MOV DL,AL,;存入,DL,STOSB,;存入,ASCII,码存储区,CALL DISP,;调用显示子程序,POP CX,;弹出计数值,LOOP LP,;计数不为,0,则继续,MOV AH,4CH,;为,0,则返回,DOS,INT 21H,;子程序名:,DISP,;功能:显示,ASCII,码字符,;入口参数:,ASCII,码在,DL,中,DISP PROC,;子程序定义开始,MOV AH,2,;显示,ASCII,码,INT 21H,MOV DL,MOV AH,2,INT 21H,RET,;返回主程序,DISP ENDP,CODE ENDS,END START,【,例,7-4】,将给定的一组字数据,X,、,Y,代入,Z=,(,X+Y,),2-X,),4,公式中,计算相应的,Z,值,保护,BX,、,CX,寄存器内容,BX=AX,AX=(AX+DX)*2-BX)*4,恢复,CX,、,BX,寄存器内容,(a),主程序框图,(b),子程序框图,Y,N,取数据区,X,、,Y,、,Z,的首地址分别送,SI,、,DI,、,BX,,,数据个数送,CX,AX=SI,DX=DI,调,SUBR,子程序,CX=0,BX=AX,SI=SI=2,DI=DI+2 BX=BX+2,CX=CX-1
展开阅读全文