您好,欢迎访问三七文档
第7章子程序设计汇编语言程序设计本章主要教学内容本章主要教学目的及要求1.理解掌握子程序调用与返回指令;2.掌握子程序设计的基本过程和设计方法;3.能熟练设计子支程序。1.子程序调用与返回指令。2.子程序设计的基本过程和设计方法。第7章子程序设计汇编语言程序设计7.1概述7.1.1子程序设计的概念含义:被独立出来的程序段称为子程序或过程主程序与子程序之间的关系主程序子程序CALLSUB1(断点1:)CALLSUB2(断点2:)HTLSUB1:RETSUB2:RET第7章子程序设计汇编语言程序设计7.1.2子程序的特性(1)功能独立(2)通用性(3)可浮动性(4)可递归和可重入性7.1.3子程序的优点(1)简化了程序设计过程,使程序设计时间大量节省。(2)缩短了程序的长度,节省了计算机汇编源程序的时间和程序的存储空间。(3)增加了程序的可读性,便于对程序的修改、调试。(4)方便了程序的模块化、结构化和自顶向下的程序设计。第7章子程序设计汇编语言程序设计7.2子程序调用和返回指令7.2.1子程序调用指令类型段内调用主程序和子程序处在同一代码段,只改变IP值段间调用主程序和子程序处不在同一代码段,既改变IP值也改变CS值段内直接调用格式:CALLDST/NEARPTRDST功能:(1)SP←SP-2(SP)←IP(2)IP←IP+D16段内间接调用格式:CALLDST/WORDPTRDST功能:(1)SP←SP-2(SP)←IP(2)IP←(EA)例:CALLMULL段间直接调用格式:CALLFARPTRDST功能:(1)SP←SP-2(SP)←CSSP←SP-2(SP)←IP(2)IP←子程序偏移地址CS←子程序段地址例:CALLBXCALLWORDPTR[SI]段间直接调用格式:CALLDWORDPTRDST功能:(1)SP←SP-2(SP)←CSSP←SP-2(SP)←IP(2)IP←(EA)CS←(EA+2)例:CALLFARPTRMULL例:CALLDWORDPTR[BX]第7章子程序设计汇编语言程序设计从栈顶弹出一个字数据送入IP7.2.2返回指令功能:从堆栈的栈顶弹出数据作为返回地址含义:实现子程序执行完后要返回主程序的指令分类:段内返回和段间返回从栈顶弹出两个字数据分别送入IP和CS类型段内返回RET格式:RET功能:IP←(SP)SP←SP+2RETn格式:RETn功能:IP←(SP)SP←SP+2SP←SP+n段间返回RET格式:RET功能:IP←(SP)SP←SP+2CS←(SP)SP←SP+2RETn格式:RETn功能:IP←(SP)SP←SP+2CS←(SP)SP←SP+2SP←SP+n第7章子程序设计汇编语言程序设计7.3子程序的定义、调用和返回7.3.1子程序定义1.子程序定义伪指令格式:〈子程序名〉PROCNEAR/FAR┆┆RET〈子程序名〉ENDP说明:(1)主程序和子程序在同一代码段中,定义为NEAR型。(2)主程序和子程序不在同一代码段中,定义为FAR型。(3)可将主程序定义为FAR型,看作是DOS调用的一个过程。第7章子程序设计汇编语言程序设计2.子程序调用方法说明包括:(1)子程序名;(2)子程序功能;(3)占用寄存器;(4)入口参数;(5)输出参数;(6)子程序调用示例。第7章子程序设计汇编语言程序设计3.现场保护和现场恢复现场保护:在子程序的功能实现前把将要用到的寄存器中的原有内容保存起来现场恢复:子程序的功能实现后,将数据取出再送回原来的寄存器中例:子程序SUB1中用到了寄存器AX、BX、CX、DX,则可能的现场保护和现场恢复如下:SUB1PROCPUSHAX;现场保护PUSHBXPUSHCXPUSHDX┆;子程序功能段POPDX;现场恢复POPCXPOPBXPOPAXRETSUB1ENDP注意:现场保护应与现场恢复的顺序正好相反。第7章子程序设计汇编语言程序设计4.子程序的设计方法(1)利用过程定义伪指令声明;(2)利用RET指令返回主程序;(3)对堆栈的压入和弹出操作要成对使用;(4)现场保护和现场恢复;(5)应安排在代码段的主程序之外,也可以放在主程序开始之前;(6)允许嵌套和递归;(7)可以与主程序共用一个数据段,也可以使用不同的数据段;(8)编写可以很灵活,但一定要保证堆栈操作的正确性;(9)处理好子程序和主程序间的参数传递问题(见7.4节);(10)提供必要的子程序说明信息。第7章子程序设计汇编语言程序设计子程序定义应用举例【例7-1】求两个数的最大公约数子程序子程序调用方法说明:;子程序名:MCDST;功能:求两个正整数的最大公约数;;入口参数:AX和BX中存放两个正整数;;出口参数:CX中存放求得的最大公约数;;寄存器占用:使用AX、BX、CX、DX寄存器,CX中内容被改变,AX、BX、DX中的内容保持不变。子程序清单:MCDSTPROCNEAR/FARPUSHAX;保护现场PUSHBXPUSHDXAGAIN:XORDX,DX;AX值扩展到DXAX中DIVBX;商存入AX,余数存入DXANDDX,DXJZEXIT;余数为0转EXITMOVAX,BX;余数不为0更新被除数MOVBX,DX;更新除数JMPAGAIN;继续循环EXIT:MOVCX,BX;最大公约数存入CXPOPDX;恢复现场POPBXPOPAXRET;返回主程序MCDSTENDP第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!)送BXm—n送CX调用SUB1子程序AX(即(m—n)!)送BXAX/BX(即m!/n!/(m—n)!)送AX存储AXYNSUB1子程序开始1送AXAX*CX送AXCX—1送AXCX=0返回开始结束第7章子程序设计汇编语言程序设计DATASEGMENTMEQU8NEQU3RESDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,NCALLSUB1;调子程序计算n!MOVBX,AXMOVCX,MCALLSUB1;调子程序计算m!DIVBX;m!/n!送AXMOVBX,AXMOVCX,MSUBCX,NCALLSUB1;调用子程序,计算(m-n)!XCHGBX,AXDIVBX;m!/n!/(m-n)!送AXMOVRES,AXMOVAH,4CHINT21HSUB1PROC;计算阶乘的子程序MOVAX,1NEXT:MULAX,CXLOOPNEXTRETSUB1ENDPCODEENDSENDSTART第7章子程序设计汇编语言程序设计7.4子程序的参数传递方法入口参数:主程序调用子程序前,把要加工的数据传给子程序,这些数据称为入口参数出口参数:子程序执行完后,要把执行结果传回主程序,这些数据称为出口参数参数传递方式:寄存器传递、堆栈传递和存储单元传递第7章子程序设计汇编语言程序设计7.4.1通过寄存器传递参数含义:主程序把入口参数送入某些寄存器,然后调用子程序,子程序中直接使用存放入口参数的寄存器进行处理。子程序处理完数据,将执行结果作为出口参数存入寄存器中,回到主程序,主程序对存放在寄存器中的出口参数进行相应处理特点:方便、直观,适于参数较少的情况注意:用于传递出口参数的寄存器不能进行现场保护和恢复第7章子程序设计汇编语言程序设计通过寄存器传递参数应用举例【例7-3】以BCDBUF为首地址的内存中存放着若干单元的用BCD码表示的十进制数,每一个单元中存放两位BCD码,要求把它们分别转换为ASCII码,存放在ASCBUF为首地址的单元中,且高4位BCD码转换成得ASCII码放在地址较高的单元。并且要求边转换边显示这些ASCII码第7章子程序设计汇编语言程序设计DATASEGMENTBCDBUFDB12H,24H,96H,87H,71H,79H,56H,34H,63H,45HCOUNTEQU$-BCDBUFASCBUFDB20DUP(?)DATAENDSSTACKSEGMENTPARASTACK‘STACK’STAPNDB100DUP(?)TOPEQULENGTHSTAPNSTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXMOVAX,TOPMOVSP,AXMOVSI,OFFSETBCDBUF;BCD码的内存区首地址MOVDI,OFFSETASCBUF;ASCII码的内存区首地址MOVCX,COUNT;组合BCD码个数CLD;DF=0,按地址递增方式LP:LODSB;取一个组合BCD码MOVBL,AL;暂存ANDAL,0FH;屏蔽高4位ORAL,30H;BCD码低位转换为ASCII码MOVDL,AL;存入DLSTOSB;存入ASCII码存储区CALLDISP;调用显示子程序MOVAL,BL;取回BCD码PUSHCX;保存计数值MOVCL,4SHRAL,CL;取BCD码高4位ORAL,30H;BCD码高位转为ASC码MOVDL,AL;存入DLSTOSB;存入ASCII码存储区CALLDISP;调用显示子程序POPCX;弹出计数值LOOPLP;计数不为0则继续MOVAH,4CH;为0则返回DOSINT21H;子程序名:DISP;功能:显示ASCII码字符;入口参数:ASCII码在DL中DISPPROC;子程序定义开始MOVAH,2;显示ASCII码INT21HMOVDL,’’MOVAH,2INT21HRET;返回主程序DISPENDPCODEENDSENDSTART第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=0[BX]=AX,SI=SI=2,DI=DI+2BX=BX+2,CX=CX-1开始返回开始结束第7章子程序设计汇编语言程序设计DATASEGMENTXDW5,3,8,9,2,5,3,4,7,1YDW1,5,7,0,4,3,1,4,8,1ZDW10DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,XLEADI,YLEABX,ZMOVCX,Y-XSHRCX,1REAPT:MOVAX,[SI]MOVDX,[DI]CALLSUBRMOV[BX],AXADDSI,2ADDDI,2ADDBX,2LOOPREAPTEXIT:MOVAH,4CHINT21HSUBRPROCNEARPUSHBXPUSHCXMOVBX,AXADDAX,DX;AX=X+YSALAX,1;AX=(X+Y)×2SUBAX,BX;AX=(X+Y)×2-XMOVCL,2SALAX,CL;AX=((X+Y)×2-X)×4POPCXPOPBXRETSUBRENDPCODEENDSENDSTART第7章子程序设计汇编语言程序设计7.4.2通过堆栈传递参数含义:主程序把入口参数压栈保存,然后调用子程序,子程序从堆栈中弹出入口参数进行处理。子程序处理完数据后将执行结果作为出口参数压栈保存,回到主程序,主程序从堆栈中弹出出口参数进行相应处理第7章子程序设计汇编语言程序设计通过堆栈传递参数应用举例【例7-5】将例7-3改为用堆栈传递参数DATASEGMENTBCDBUFDB12H,24H,96H,87H,7
本文标题:汇编语言子程序设计
链接地址:https://www.777doc.com/doc-3973832 .html