第六章子程序结构
子程序---又称过程,是完成某种功能的程序模块,相当于高级语言的过程和函数。
一子程序的定义、调用和基本要求
(过程)的定义
格式:
过程名(子程序名) PROC FAR/NEAR
………
………过程主体
……….
RET
过程名 ENDP
对子程序定义的具体规定如下:
“子程序名”必须是一个合法的标识符,并前后二者要一致;
PROC和ENDP必须是成对出现的关键字,它们分别表示子程序定义开始和结束;
子程序的类型有近(NEAR)、远(FAR)之分,其缺省的类型是近类型;
如果一个子程序要被另一段的程序调用,那么,其类型应定义为FAR,否则,其类型可以是NEAR。显然,NEAR类型的子程序只能被与其同段的程序所调用;
子程序至少要有一条返回指令,也可有多条返回指令。返回指令是子程序的出口语句,但它不一定是子程序的最后一条语句;
子程序名有三个属性:段值、偏移量和类型。其段值和偏移量对应于子程序的入口地址,其类型就是该子程序的类型。
1)子程序(过程)调用:
调用格式:CALL DST
(1)段内直接调用(该调用直接在CALL后写子程序名)
调用格式:CALL DST
汇编格式:CALL NEAR PTR DST
结果:
(SP)←(SP)-2 ;(SP内容减2,指向新的栈顶)
(SP)+1和(SP)←(IP) ;(将IP内容存入栈顶字单元)
(IP)←(IP)+disp ;(实现段内转移)
例:
CALL PROCA
;执行时,将段内偏移地址加在IP上,找到PROCA
(2)段内间接调用(该调用的子程序入口地址在段内偏移地址,在一个通用REG或一个字存储单元中)
调用格式:CALL DST
汇编格式:CALL WORD PTR DST
结果:
(SP)←(SP)-2
SP)+1和(SP)←(IP)
(IP)←(EA)
例:
CALL BX
;(IP)←(BX),BX寄存器的内容是当前代码段中子程序的入口。
CALL PROCA
;(IP)←(PROCA),PROCA是数据段中的一个地址单元,其内容是当前代码段中子程序的的入口地址
(3)段间直接调用(该调用直接在CALL后写FAR的子程序名,或用属性修改运算符FAR将子程序的属性说明为FAR)
调用格式:CALL DST
汇编格式:CALL FAR PTR DST
结果:
(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个字节)
*即先保留返回地址,然后转移到由DST指定的子程序入口。
例:
CALL PROCA
;(CS)← SEG PROCA,
;(IP)← OFFSET PROCA,PROCA为其代码段中的过程名,具有FAR属性
CALL PTR FAR PROCB
;(CS)← SEG PROCB,
;(IP)← OFFSET PROCB,PROCB为其它代码段中的过程名,具有FAR属性序的的入口地址
(4)段间间接调用
调用格式:CALL DST
汇编格式:CALL DWORD PTR DST
结果:
(SP)←(SP)-2 ;(SP内容减2,指向新的栈顶)
(SP)+1和(SP)←(CS) ;(将CS内容存入栈顶字单元)
(SP)←(SP)-2 ;(SP内容减2,指向新的栈顶)
(SP)+1和(SP)←(IP) ;(将IP内容存入栈顶字单元
(IP)←(EA)
(CS)←(EA+2)
注:该调用在CALL中给出的是由4个字节组成的地址指针首地址,而子程序的入口地址在该地址指针中。低字存放子程序入口地址的段内偏移地址,高字存放段基址。
近调用指令进栈操作示意图
远调用指令进栈操作示意图
第6章子程序结构(1) 来自淘豆网m.daumloan.com转载请标明出处.