现场保护和现场恢复的实现方法
计算机 CPU 中的寄存器个数是有限的。主程序在调用子程序之前,肯定要使用各个寄存器。在子程序运行时,肯定也需要使用这些寄存器。这就产生了问题:主程序和子程序都是使用相同的这一组寄存器。如果在主程序调用子程序时,不对它所使用的寄存器内容加以保护,那么从子程序返回主程序时,就无法将它们恢复到主程序调用子程序前的状态,因此也就无法保证主程序能在原有的基础上继续执行下去。
通常,把主程序调用子程序时各个寄存器的状态,称为主程序的现场。很明显,在主程序调用子程序时,必须对主程序的现场进行保护;在子程序执行完毕返回主程序之前,必须对主程序的现场加以恢复。只有这样,才能确保主程序在调用子程序的前后,能在相同的环境下工作,才能保证它正确地运行。这就是在程序设计中采用子程序结构时的“现场保护”和“现场恢复”问题。现场保护的原则是:除了用来存放输出参数外的寄存器,凡是子程序需要使用的寄存器,在进入时都应该加以保护。
现场保护和现场恢复是利用堆栈和堆栈指令 PUSH 和 POP 来实现的。现场保护时,是将各个寄存器的内容进栈;现场恢复时,是将各个寄存器的内容出栈。在此,最为重要的是要记住堆栈操作“先进后出”的原则,即现场保护时,各个寄存器进栈顺序的逆序才是现场恢复时出栈的次序,绝对不能搞错。
例如,下面是一个名为 GRSC 的子程序框架。
GPSC PROC
PUSH AX ;保护现场
PUSH BX
PUSH CX
PUSH DX
┋
POP DX ;恢复现场
POP CX
POP BX
POP AX
RET
GPSC ENDP
从框架中可以看出,进到该子程序时,先是通过 4 条 PUSH 指令,依次将寄存器 AX,BX,CX 和 DX 进栈,以保护它们在主程序时的工作状态。在子程序的功能完成后,通过 4 条 POP 指令,将原先保护在栈里的内容送回各个寄存器,从而恢复主程序的现场。这里,寄存器进栈的顺序是 AX→BX→CX→DX,而出栈的顺序则是 DX→CX→BX→AX。
| 寻找产品: | |||
| 姓 名: | 电 话: | ||
| 公 司: | E-mail: | ||
| 描 述: | |||







