资源描述:
《汇编语言程序设计教程 教学课件 作者 王庆生 7.ppt》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、第7章子程序设计为了使程序结构更加清晰,把程序需要完成的任务分解为若干个子任务,把每个子任务设计成一个相对独立的程序,称为子程序,也称为过程。7.1子程序结构7.1.1过程定义与过程结构7.1.2保护和恢复现场寄存器7.1.1过程定义与过程结构过程定义伪指令Procedure_NamePROCAttribute┇Procedure_NameENDP如:mainprocfar/near┇mainendp过程名是标识符,起到标号的作用,是子程序入口的符号地址。过程的属性可以是FAR或NEAR类型。对过程属性的确定原则是:NEAR为近,是段内调用。FAR类型为远,是跨段调用。如调用程序和
2、子程序在同一代码段,则使用NEAR属性;如调用程序和子程序不在同一代码段,则使用FAR属性。主程序的过程定义属性应为FAR。例7.1调用程序和子程序在同一个代码段,调用程序和子程序并列。mainprocfar…callsubr…retmainendpsubrprocnear…retsubrendp调用程序和子程序在同一个代码段,调用程序和子程序相互嵌套。mainprocfar…callsubr…retsubrprocnear…retsubrendpmainendp例7.2调用程序和子程序不在同一个代码段。code1segment…mainprocfar…callsubr…retma
3、inendpcode1ends…code2segment…callsubr…subrprocfar…retsubrendpcode2ends7.1.2保存和恢复现场寄存器子程序调用CALL:首先将返回地址压栈,然后把子程序的入口地址送入IP/CS寄存器。子程序返回RET:将堆栈里保存的返回地址送回IP/CS寄存器。在子程序中对主程序的现场实施保护和恢复在进入子程序后,对将要使用的寄存器,先保存这些寄存器的值,在子程序退出前恢复这些寄存器的值。保存和恢复寄存器7.2子程序的参数传递入口参数(调用参数):主程序传递给子程序。出口参数(返回参数):子程序返回给主程序。传递的参数:值传递和
4、地址传递。7.2.1用寄存器传递参数用寄存器传递参数就是约定某些寄存器存放将要传递的参数。该方法简单,执行的速度也很快。但由于寄存器数量有限,不能用于传递很多的参数。例7.3从键盘输入一个十进制数(小于65536的正数),显示输出该数的十六进制形式。通过寄存器传送变量。算法分析1.输入的十进制数整合成二进制数;2.整合的方法A(n)=A(n-1)*10+B(n);3.二进制数转化为十六进制显示。程序结构框图DTOB子程序流程图dtohexsegmentassumecs:dtohexmainprocfarpushdsxorax,axpushaxcalldtob;十进制数键盘输入整合为
5、二进制callcrlf;输出回车换行callbtoh;二进制转为十六进制显示retmainendpdtobprocnearmovbx,0input:movah,1;键盘输入int21hsubal,30h;把ascii码转变为数值jlexit;如不是数则退出cmpal,9jgexit;如不是数则退出cbw;扩展为字xchgax,bx;交换寄存器movcx,10mulcx;a(n)=a(n-1)×10xchgax,bx;交换寄存器addbx,ax;a(n)=a(n)+b(n)jmpinputexit:retdtobendpbtohprocnearmovch,4;准备输出4位十六进制数s
6、hift:movcl,4;每次需移4位rolbx,clmoval,blandal,0fh;取最右4位addal,30h;转为asciicmpal,39hjledig;是0~9则转digaddal,7;是A~Fdig:movdl,al;显示movah,2int21hdecchjnzshiftretbtohendpcrlfprocnearmovdl,0dhmovah,2int21hmovdl,0ahmovah,2int21hretcrlfendpdtohexendsendmain7.2.2用变量传递参数参数较多时可以用约定的变量在过程间传递参数。例7.4键盘输入字符串到缓冲区后,对缓冲
7、区内容降序排序并输出。datasegmentbuffdb16;缓冲区大小numbdb?;输入的字节数arrydb16dup(?);缓冲区内容dataendscodesegmentassumecs:code,ds:datamainprocfarpushdssubax,axpushaxmovax,datamovds,axcallorderretmainendporderprocnearleadx,buff;输入缓冲区movah,10int21hmovcl,numb;实际输