《汇编语言子程序设计.ppt》由会员分享,可在线阅读,更多相关《汇编语言子程序设计.ppt(39页珍藏版)》请在第壹文秘上搜索。
1、第7章 子程序设计汇编语言程序设计汇编语言程序设计本章主要教学内容本章主要教学目的及要求1.理解掌握子程序调用与返回指令;2.掌握子程序设计的基本过程和设计方法;3.能熟练设计子支程序。1.子程序调用与返回指令。2.子程序设计的基本过程和设计方法。第7章 子程序设计汇编语言程序设计汇编语言程序设计7.1 概述7.1.1 子程序设计的概念含义:被独立出来的程序段称为子程序或过程主程序与子程序之间的关系主程序子程序CALL SUB1(断点1:)CALL SUB2(断点2:)HTLSUB1:RET SUB2:RET 第7章 子程序设计汇编语言程序设计汇编语言程序设计7.1.2 子程序的特性(1)功能
2、独立(2)通用性(3)可浮动性(4)可递归和可重入性7.1.3 子程序的优点(1)简化了程序设计过程,使程序设计时间大量节省。(2)缩短了程序的长度,节省了计算机汇编源程序的时间和程序的 存储空间。(3)增加了程序的可读性,便于对程序的修改、调试。(4)方便了程序的模块化、结构化和自顶向下的程序设计。第7章 子程序设计汇编语言程序设计汇编语言程序设计7.2 子程序调用和返回指令7.2.1 子程序调用指令类型段内调用主程序和子程序处在同一代码段,只改变IP值段间调用主程序和子程序处不在同一代码段,既改变IP值也改变CS值段内直接调用格式: CALL DST/NEAR PTR DST 功能:(1)
3、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
4、 FAR PTR MULL 例:CALL DWORD PTR BX 第7章 子程序设计汇编语言程序设计汇编语言程序设计从栈顶弹出一个字数据送入IP7.2.2 返回指令 功能:从堆栈的栈顶弹出数据作为返回地址含义:实现子程序执行完后要返回主程序的指令分类:段内返回和段间返回从栈顶弹出两个字数据分别送入IP和CS类型段内返回RET格式: RET 功能:IP(SP) SPSP+2RET n格式: RET n功能:IP(SP) SP SP+2 SP SP+n段间返回RET格式: RET 功能:IP (SP) SP SP+2 CS (SP) SP SP+2RET n格式: RET n功能:IP (SP)
5、 SP SP+2 CS (SP) SP SP+2 SP SP+n第7章 子程序设计汇编语言程序设计汇编语言程序设计7.3 子程序的定义、调用和返回7.3.1 子程序定义1.子程序定义伪指令格式: 子程序名 PROC NEAR/FAR RET 子程序名 ENDP说明: (1)主程序和子程序在同一代码段中,定义为NEAR型。 (2)主程序和子程序不在同一代码段中,定义为FAR型。 (3)可将主程序定义为FAR型,看作是DOS调用的一个过程。第7章 子程序设计汇编语言程序设计汇编语言程序设计2.子程序调用方法说明包括:(1)子程序名;(2)子程序功能;(3)占用寄存器;(4)入口参数;(5)输出参数
6、;(6)子程序调用示例。第7章 子程序设计汇编语言程序设计汇编语言程序设计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注意:现场保护应与现场恢复的顺序正好相反。第7章 子程序设计汇编语言程序设计汇
7、编语言程序设计4.子程序的设计方法(1)利用过程定义伪指令声明;(2)利用RET指令返回主程序;(3)对堆栈的压入和弹出操作要成对使用;(4)现场保护和现场恢复;(5)应安排在代码段的主程序之外,也可以放在主程序开始之前;(6)允许嵌套和递归;(7)可以与主程序共用一个数据段,也可以使用不同的数据段;(8)编写可以很灵活,但一定要保证堆栈操作的正确性;(9)处理好子程序和主程序间的参数传递问题(见7.4节);(10)提供必要的子程序说明信息。第7章 子程序设计汇编语言程序设计汇编语言程序设计子程序定义应用举例【例7-1】求两个数的最大公约数子程序子程序调用方法说明: ;子程序名:MCDST ;
8、功 能:求两个正整数的最大公约数; ;入口参数: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 ;继续循环
9、EXIT:MOV CX,BX ;最大公约数存入CX POP DX ;恢复现场 POP BX POP AX RET ;返回主程序MCDST ENDP第7章 子程序设计汇编语言程序设计汇编语言程序设计7.3.2子程序的调用与返回调用子程序指令:CALL返回主程序指令:RET【例7-2】以下程序用于计算=m!/(n!*(m-n)!)的值(m、n为自然数,且mn)。(假设阶乘乘积大小不超过两个字节)N送CX调用SUB1子程序AX(即n!)送BXM送CX调用SUB1子程序AX/BX(即m!/n!)送BXmn送CX调用SUB1子程序AX(即(mn)!)送BXAX/BX(即m!/n!/ (mn)!)送AX存
10、储AXYNSUB1子程序开始1送AXAX*CX送AXCX1送AXCX=0返回开始结束第7章 子程序设计汇编语言程序设计汇编语言程序设计DATA SEGMENT M EQU 8 N EQU 3 RES DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: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
11、;调用子程序,计算(m-n)! XCHG BX,AX DIV BX ;m!/n!/ (m-n)! 送AX MOV RES,AX MOV AH,4CH INT 21HSUB1 PROC ;计算阶乘的子程序 MOV AX,1NEXT:MUL AX,CX LOOP NEXT RETSUB1 ENDPCODE ENDS END START第7章 子程序设计汇编语言程序设计汇编语言程序设计7.4 子程序的参数传递方法 入口参数:主程序调用子程序前,把要加工的数据传给子程序,这 些数据称为入口参数出口参数:子程序执行完后,要把执行结果传回主程序,这些数据 称为出口参数参数传递方式:寄存器传递、堆栈传递和存
12、储单元传递 第7章 子程序设计汇编语言程序设计汇编语言程序设计7.4.1 通过寄存器传递参数含义:主程序把入口参数送入某些寄存器,然后调用子程序,子程序中 直接使用存放入口参数的寄存器进行处理。子程序处理完数据, 将执行结果作为出口参数存入寄存器中,回到主程序,主程序对 存放在寄存器中的出口参数进行相应处理特点:方便、直观,适于参数较少的情况注意:用于传递出口参数的寄存器不能进行现场保护和恢复第7章 子程序设计汇编语言程序设计汇编语言程序设计通过寄存器传递参数应用举例【例7-3】以BCDBUF为首地址的内存中存放着若干单元的用BCD码表示的十进制数,每一个单元中存放两位BCD码,要求把它们分别
13、转换为ASCII码,存放在ASCBUF为首地址的单元中,且高4位BCD码转换成得ASCII码放在地址较高的单元。并且要求边转换边显示这些ASCII码第7章 子程序设计汇编语言程序设计汇编语言程序设计DATA SEGMENTBCDBUF DB 12H,24H,96H,87H,71H,79H,56H,34H,63H,45HCOUNT EQU $-BCDBUF ASCBUF DB 20 DUP(?) DATA ENDSSTACK SEGMENT PARA STACK STACKSTAPN DB 100 DUP (?)TOP EQU LENGTH STAPNSTACK ENDS CODE SEGMEN
14、T ASSUME CS:CODE, DS:DATA,SS:STACKSTART: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码低位转换为ASC
15、II码 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中
16、DISP PROC ;子程序定义开始 MOV AH,2 ;显示ASCII码 INT 21H MOV DL, MOV AH,2 INT 21H RET ;返回主程序DISP ENDPCODE ENDS END START第7章 子程序设计汇编语言程序设计汇编语言程序设计【例7-4】将给定的一组字数据X、Y代入Z=(X+Y)2-X)4公式中,计算相应的Z值保护BX、CX寄存器内容BX=AXAX=(AX+DX)*2-BX)*4恢复CX、BX寄存器内容 (a)主程序框图 (b)子程序框图YN取数据区X、Y、Z的首地址分别送SI、DI、BX,数据个数送CXAX=SI,DX=DI调SUBR子程序CX=0BX=AX,SI=SI=2,DI=DI+2 BX=BX+2,CX=CX-1开始返回开始结束第7章 子程序设计汇编语言程序设计汇编语言程序设计DATA SEGMENTX DW 5,3,8,9,2,5,3,4,7,1Y DW 1,5,7,0,4,3,1,4,8,1Z DW 10 DUP (?) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START:MO