现场保护和现场恢复的实现方法

2008-10-22     作者:        编辑:齐瑞瑞   点击进入论坛

  计算机 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:
描       述: