6.1.2 子程序的调用和返回
子程序的正确调用和正确返回可以保证过程的正确执行,这一功能由8086的CALL和RET指令完成。
为保证其正确性,除PROC的属性要正确选择外,还应该注意子程序运行期间的堆栈状态。
由于CALL时已使返回地址入栈,所以RET时应该使返回地址出栈。如果子程序中不能正确使用堆栈而造成执行RET前SP并未指向进入子程序时的返回地址,则必然会导致运行出错,因此子程序中对堆栈的使用应该特别小心,以免发生错误。
6.1.3 保存与恢复寄存器(见左例)
由于调用程序(又称主程序)和子程序经常是分别编制的,所以它们所使用的寄存器往往会发生冲突。
如果主程序在调用子程序之前的某个寄存器内容在从子程序返回后还有用,而子程序又恰好使用了同一个寄存器,这就破坏了该寄存器的原有内容,因而会造成程序运行错误,这是不允许的。为避免这种错误的发生,在一进入子程序后,就应该把子程序所需要使用的寄存器内容保存在堆栈中,而在退出子程序前把寄存器内容恢复原状。
一般说来,子程序中用到的寄存器是应该保存的。但是,如果使用寄存器在主程序和子程序之间传送参数的话,则这种寄存器就不一定需要保存,特别是用来向主程序回送结果的寄存器,就更不应该因保存和恢复寄存器而破坏了应该向主程序传送的信息。
|