子程序

调用指令

子程序调用格式:CALL 子程序名

  • 子程序与分支程序的最大区别是子程序执行完要返回到主程序,也就是返回到CALL指令的下一条继续执行。
  • 在子程序中用RET指令作为返回指令。

段内调用

(1) 段内直接调用
格式:CALL OPR
执行的操作:先保存断点:SP <—SP-2,将CALL的下一条指令的IP入栈;再将子程序名OPR代表的偏移地址—>IP,转到子程序执行。
功能:子程序名直接写在指令中,作段内调用。
(2)段内间接调用
格式:CALL WORD PTR OPR
执行的操作:先将断点处的IP入栈保存;再将寄存器或存储单元中的一个字—>IP。
功能:子程序的偏移地址由寄存器或存储单元指出,作段内调用。

段间调用

(1) 段间直接远调用
格式:CALL FAR PTR OPR
执行的操作:先将CALL的下一条指令CS和IP分别入栈;再把程序的偏移地址—>IP,子程序的段地址—>CS。
功能:子程序名用FAR PTR直接写在指令中,作跨段调用。
(2)段间间接调用
格式:CALL DWORD PTR OPR
执行的操作:先将CALL的下一条指令CS和IP分别入栈;再将存储单元(EA)—>IP,(EA+2)—>CS。
功能:子程序地址保存在双字单元中,第一个字作为偏移地址,第二个字作为段地址,作跨段调用。

返回指令

格式: RET [n]

功能:用于子程序中,返回到主程序的断点处继续执行。执行时,将断点从栈中弹出,修改IP或修改IP、CS。
执行的操作:
(1)段内返回又称为近返回,弹出的断点仅修改IP;
(2)段间返回又称为远返回,弹出断点的偏移地址→(IP),再弹出断点的段地址→(CS);
(3)如果是RET n 指令,表示弹出断点后,再将堆栈指针SP+n之后再返回。

过程定义

伪指令PROC

过程定义伪指令格式为:
子程序名 PROC 属性
……
子程序名 ENDP

  • PROC和ENDP必须成对使用,表示子程序的开始和结束。
  • 属性是指子程序的类型属性,分为NEAR近程属性和FAR远程属性。属性隐含为NEAR型。

现场保护

在进入子程序时,把某些主程序需要用到的寄存器保存起来,称为现场保护。一般采用PUSH指令入栈保存的方法。
在子程序返回主程序之前,将堆栈中保存的内容用POP指令弹出到相关的寄存器中,称为恢复现场。