欢迎来到天天文库
浏览记录
ID:33838297
大小:406.91 KB
页数:112页
时间:2019-02-28
《pc汇编语言程序设计 第8章》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第八章子程序设计第八章子程序设计8.1子程序的定义、调用和基本要求8.2调用程序和子程序之间的参数传递方式8.3子程序设计举例8.4子程序的嵌套和递归习题八第八章子程序设计8.1子程序的定义、调用和基本要求8.1.1过程(子程序)的定义 过程的定义由过程定义伪指令完成。过程定义伪指令的格式如下:……过程主体 …RET过程名ENDP第八章子程序设计过程名(子程序名)不能省略,其定义方法与标号和变量名类似。一个过程一经定义就有了FAR或NEAR的属性。通常如果调用程序与过程在同一个代码段内,则过程的属性定义为NE
2、AR;如果调用程序和过程不在同一个代码段内,则必须将过程定义为FAR属性。第八章子程序设计8.1.2过程调用与返回指令 对过程的正确调用和返回是保证有子程序的程序能正确运行的基础。通常调用子程序用CALL指令,由子程序返回用RET指令。CALL指令与RET指令配对出现。 1.过程调用指令CALL由于子程序与调用程序可以在一个段中,也可以不在同一段中,因此与JMP指令类似,这两条指令也有四种不同的寻址方式。第八章子程序设计(1)段内直接调用指令。 汇编格式:CALLNEARPTRDST执行的操作:(SP)←(S
3、P)-2(SP内容减2,指向新的栈顶)((SP)+1和(SP))←(IP)(将IP内容存入栈顶字单元)(IP)←(IP)+disp(实现段内转移)第八章子程序设计这条指令先把子程序的返回地址(即CALL指令的下一条指令地址)存入堆栈中,以便由子程序返回主程序。然后将子程序第一条指令的地址装入IP。指令中DST为转向地址,汇编后在机器指令中是以偏移量的形式给出的,偏移量等于转向地址和返回地址之间的差值。 这种调用方式直接在CALL指令后书写过程名,例如: CALLPROC-A;PROC-A为当前代码段中的过程
4、(子程序)名,CPU执行;此指令时,将段内偏移地址加在IP上,找到PROC-A第八章子程序设计(2)段内间接调用指令。 汇编格式:CALLWORDPTRDST执行的操作(SP)←(SP)-2((SP)+1和(SP))←(IP)(IP)←(EA)其中,EA是由DST的寻址方式所确定的有效地址。第八章子程序设计这种调用方式的子程序(过程)的入口地址(段内偏移地址)在一个通用寄存器或一个字存储单元中,例如: CALLBX;(IP)←(BX) ;BX寄存器的内容是当前代码段中子程序的入口地址CALLMEM_W;(IP
5、)←(MEM-W),MEM-W为数据段中的一个字单元地址, ;其内容是当前代码段中子程序的入口地址 第八章子程序设计(3)段间直接调用指令。 汇编格式:CALLFARPTRDST执行的操作:(SP)←(SP)-2(SP内容减2,指向新的栈顶)((SP)+1和(SP))←(CS)(将CS内容存入栈顶字单元)(SP)←(SP)-2(SP内容减2,指向新的栈顶)((SP)+1和(SP))←(IP)(将IP内容存入栈顶字单元)(IP)←转向偏移地址(指令的第2、3个字节)(CS)←转向段基址(指令的第4、5个字节)第
6、八章子程序设计即先保留返回地址,然后转移到由DST指定的子程序入口。由于调用程序和子程序不在同一个段内,因此,返回地址的保存以及转向地址的设置都必须涉及段基址的保护和设置。 这种调用方式直接在CALL指令后书写属性为FAR的过程(子程序)名,或用属性修改运算符PTR将过程的属性说明为“FAR”。例如: CALLPROC_B;(CS)←SEGPROC_B,(IP)←OFFSETPROC_B;PROC_B为其它代码段中的过程名,具有FAR属性CALLPTRFARPROC_C;(CS)←SEGPROC_C,(IP
7、)←OFFSETPROC_C;PROC_C为其它代码段中的过程名,具有FAR属性第八章子程序设计(4)段间间接调用指令。 汇编格式:CALLDWORDPTRDST执行的操作:(SP)←(SP)-2((SP)+1和(SP))←(CS)(SP)←(SP)-2((SP)+1和(SP))←(IP)(IP)←(EA)(CS)←(EA+2)其中,EA是由DST的寻址方式确定的有效地址。第八章子程序设计这种调用方式,在CALL指令中给出的是由四个字节组成的地址指针的首地址,而子程序的入口地址在该地址指针中:低字存放子程序入
8、口地址的段内偏移地址,高字存放段基址。例如:CALLDWORDPTRMEM-D;(CS)←(MEM_D+2,MEM-D+3),(IP)←(MEM_D,MEM_D+1);MEM_D为数据段中的一个双字单元地址,其低字存放有子程序入 ;口地址的段内偏移地址,高字存放有子程序的段基址 CALLDWORDPTR[BX] ;(CS)←((BX)+2,(BX)+3),(IP)←((BX),(BX)+1));BX
此文档下载收益归作者所有