|
Jan
21
|
|
过程调用指令有段内调用(近调用)和段间调用(远调用)之分。
与之对应,过程返回指令也有段内返回(近返回)和段间返回(远返回)之分。
过程有远近类型之分。
1. 过程调用指令
首先把子程序的返回地址(即CALL指令的下一条指令的地址)压入堆栈,以便执行完子程序后返回调用程序(主程序)
(1) 段内直接调用
CALL DST
具体操作:
SP <= SP – 2
[SP] <= IP
IP <= IP +disp
(2) 段内间接调用
CALL OPRD
具体操作:
SP <= SP – 2
[SP] <= IP
IP <= (OPRD)
该指令只把返回地址的偏移部分压入堆栈保存
OPRD是16位通用寄存器操作数,则把寄存器的内容送IP,若OPRD是字寄存器操作数,则把字存储单元的内容送IP
(3) 段间直接调用
CALL 过程名
具体操作:
SP <= SP -2
[SP] <= CS
SP <= SP – 2
[SP] <= IP
IP <= 过程入口地址的偏移
CS <= 过程入口地址的段值
(4)段间间接调用
CALL OPRD
OPRD是双字存储器操作数
具体操作:
SP <= SP -2
[SP] <= CS
SP <= SP – 2
[SP] <= IP
IP <= OPRD的低字值
CS <= OPRD的高字值
2. 过程返回指令
(1)段内返回指令
RET
具体操作:
IP <= [SP]
SP <= SP+2
(2)段间返回指令
RET
具体操作
IP <= [SP]
SP <= SP+2
CS <= [SP]
SP <= SP+2
(3)段内带立即数返回指令
RET 表达式
IP <= [SP]
SP <= SP+2
SP <= SP+data
先从堆栈弹出一个字作为返回地址,再额外根据data修改堆栈指针。
(4)段间带立即数返回指令
RET 表达式
先从堆栈弹出两个字,分别送到指令指针IP和代码段寄存器CS
再额外修改堆栈指针,即把表达式的结果加到SP
3. 过程定义语句
过程名 PROC [NEAR | FAR]
…
…
过程名 ENDP
默认类型为NEAR,过程名亦有段值,偏移和类型三个属性
过程名的类型就是过程的类型
4. 主程序与子程序间的参数传递
(1)利用寄存器传递参数
适用于传递的参数较少的情况
(2)利用约定存储单元传送参数
可用于参数较多的情况
(3)堆栈传递参数

