资源描述:
《汇编语言第六章子程序结构.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、在程序设计中,可以发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。调用子程序的程序称为主调程序或主程序。第6章子程序结构7/24/20211ch6子程序的基本结构包括以下几个部分:(1)子程序定义(2)保护现场和恢复现场(3)子程序体(4)子程序返回子程序的结构7/24/20212ch6子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下:过程名PROC[NEAR/FAR]┆过程名ENDP其中PROC表示过程定义开始,ENDP表示过程定义结束。过
2、程名是过程入口地址的符号表示。一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性(NEAR和FAR)。6.1.1子程序的定义6.1子程序的设计方法7/24/20213ch61.如果调用程序和过程在同一代码段中,则使用NEAR属性;MAINPROCFAR…CALLSUBR1RETMAINENDP;SUBR1PROCNEAR…RETSUBR1ENDPMAINPROCFAR…CALLSUBR1RETSUBR1PROCNEAR…RETSUBR1ENDPMAINENDP例6.1过程嵌套定义7/24/20214ch62.如果调用程序和过程不在同一代码段中,则使用FAR属性
3、;SEGXSEGMENT…SUBTPROCFAR…RETSUBTENDP…CALLSUBT…SEGXENDS;SEGYSEGMENT…CALLSUBT…SEGYENDS例6.27/24/20215ch66.1.2子程序的调用和返回调用:CALL[far/nearptr]过程名返回:RET[n]7/24/20216ch66.1.3保护现场和恢复现场例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则可采用如下方法保护和恢复现场。PROGPROCPUSHAXPUSHBXPUSHCX;保护现场PUSHDX┆POPDXPOPCXPOPBX;恢复现场POPAXRET;返回断点
4、处PROCENDP7/24/20217ch66.1.4主程序与子程序参数传递方式1通过寄存器传送参数这是最常用的一种方式,使用方便,但参数很多时不能使用这种方法。例6.3十进制到十六进制转换的程序。程序要求从键盘取得一个十进制数,然后把该数以十六进制的形式在屏幕上显示出来。开始调用DECIBIN调用CRLF调用BINIHEX调用CRLF结束从键盘取得十进制数,保存到BX中显示回车和换行用十六进制形式显示BX中的数7/24/20218ch6Decihexsegmentassumecs:DecihexMainprocfarRepeat:pushdsxorax,axpushaxcall
5、decibincallcrlfcallbinihexcallcrlfretMainendpDecibinprocnearmovbx,0Newchar:movah,1int21hsubal,30hjlexitcmpal,9jgexitcbwxchgax,bxmovcx,10mulcxxchgax,bx;每次乘的addbx,ax;结果在BX中jmpnewcharExit:retDecibinendp7/24/20219ch6Binihexprocnearmovch,4Rotate:movcl,4rolbx,clmovdl,blanddl,0fhadddl,30hcmpdl,3ahjl
6、printadddl,7hPrint:movah,2int21hdecchjnzrotateretBinihexendpCrlfprocnearmovah,2movdl,odhint21hmovdl,oahint21hretCrlfendpDecihexendsendrepeat7/24/202110ch6如果过程和调用过程在同一源文件(同一模块)中,则过程可直接访问模块中的变量。例6.4_1主程序MAIN和过程PROADD在同一源文件中,要求用过程PROADD累加数组的所有元素,并把和(不考虑溢出的可能性)送到指定的存储单元中去7/24/202111ch6DATASEGMENT
7、ARYDW100DUP(?)COUNTDW100SUMDW?DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATASTART:PUSHDSSUBAX,AXPUSHAXMOVAX,DATA…CALLNEARPTRPROADD…RETMAINENDPPROADDPROCNEARPUSHAXPUSHCXPUSHSIPUSHDILEASI,ARYMOVCX,COUNTXORAX,AXNEXT:ADDAX,[SI]ADDSI,2LOOPNEX