资源描述:
《第6章 高级汇编语言和模块化程序设计ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第6章高级汇编语言和模块化程序设计6.1子程序6.2宏6.3多模块程序设计6.4结构和记录6.1子程序1堆栈2子程序的概念3子程序格式和有关指令子程序的格式调用与返回指令4子程序设计方法5子程序的嵌套与递归调用6子程序应用举例返回本章1堆栈进栈/出栈指令寄存器入栈寄存器出栈堆栈:以字为单位、按照先今后出的方式存取的内存。堆栈用来传递参数、临时存放数据、保存和恢复寄存器。返回本节进栈/出栈指令入栈指令语句格式:PUSHR16
2、M16
3、SEG功能:堆栈指针减2,将寄存器、段寄存器或存储器中的一个字数据压入堆栈。出栈指令语句格式:POPR16
4、M16
5、SEG功能
6、:将栈顶元素弹出送至某一寄存器、段寄存器(除CS外)或存储器,堆栈指针加2。返回本节寄存器入栈格式:PUSHA功能:所有16位寄存器(AX、BX、CX、DX、SI、DI、SP、BP)依次入栈,SP做相应的移动。指令执行后,([SP])-16→SP格式:PUSHAD功能:所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP)依次入栈,SP做相应的移动。指令执行后,([SP])-32→SP返回本节寄存器出栈格式:POPA功能:栈顶内容依次出栈存于各16位寄存器(AX、BX、CX、DX、SI、DI、SP、BP)中,同时,SP做相应的移
7、动。指令执行后,([SP])+16→SP格式:POPAD功能:栈顶内容依次出栈存于各32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP)中,同时,SP做相应的移动。指令执行后,([SP])+32→SPPUSHA和POPA的执行图示返回本节执行前PUSHASPSPAXCXDXBX原SPBPDISIPOPASPAXCXDXBX原SPBPDISI2子程序的概念在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又
8、称过程。调用子程序的程序称为主调程序或主程序。//主程序……ST:……CALLS1断点……//子程序S1S1PROCST:…………RETS1ENDP子程序的特点1、功能独立2、通用性3、可浮动性:子程序可放在存储区任意地址4、可递归性:子程序调用其自身5、可重入性:子程序可被中断,在中断处理中又被中断服务程序调用,且都能提供正确结果。子程序的优点1、简化程序设计过程,节省设计时间2、缩短程序长度,节省汇编时间和程序执行空间3、增加程序可读性,便于修改与调试4、方便程序模块化、结构化和自顶向下程序设计方法返回本节调用与返回指令过程的正确执行由子程序的正确调用
9、和返回保证。主程序中,通过CALL指令完成子程序调用,将CALL指令的下一条地址入栈保存,并修改IP为子程序的入口地址,即转子程序处执行。子程序中,通过RET指令完成子程序的返回,IP为栈顶出栈的内容,即转到主程序中调用语句的下一条语句处执行。1)段内调用与返回2)段间调用与返回调用与返回指令1)段内调用与返回*调用格式CALL[NEARPTR]子程序名功能:PUSH(IP),(IP)子程序入口的偏移地址CALLWORDPTR通用寄存器或存储器功能:PUSH(IP),(IP)(IP)+D16注意:定义子程序的要求子程序是NEAR型,且与调用程序定义在同
10、一代码段内*返回功能RET(IP)POP()RETEXP(IP)POP(),(SP)(SP或ESP)+D16调用与返回指令2)段间调用与返回*调用格式CALL[FARPTR]子程序名功能:PUSH(CS),PUSH(IP),(IP)子程序入口的偏移地址CALLDWORDPTR存储器功能:PUSH(CS),PUSH(IP),(IP)(EA)(CS)(EA+2或4)*返回RET功能:(IP)POP(),(CS)POP()RET表达式功能:(IP)POP(),(CS)POP()(SP或ESP)(SP或ESP)+D16子程序的调用与返回DAT
11、ASEGMENTMEQU8NEQU3RESDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,NCALLSUB1MOVBX,AXMOVCX,MCALLSUB1DIVBXMOVBX,AXSUBCX,NCALLSUB1XCHGBX,AXDIVBXMOVRES,AXMOVAX,4C00HINT21HSUB1PROCMOVAX,1NEXT1:MULCXLOOPNEXT1RETSUB1ENDPCODEENDSENDSTART例:计算HTOASCproc;将AL低4位表达的一
12、位16进制数转换为ASCII码andal,0fhcmpal,9jb