寄存器的保护与恢复
因为只有一套计算机硬件资源,所以当子程序修改寄存器的内容并返回到调用它的程序时,这些寄存器的内容就不会是调用子程序之前的内容了。这样修改寄存器内容的子程序就可能成为调用它的副作用,往往导致调用程序出错。因此,在编写子程序时,除了用作入口和出口参数的寄存器外,对其他寄存器的修改对调用程序是透明的。也就是说,在调用子程序指令前后,除了用作入口和出口参数的寄存器可以不同之外,其他寄存器的内容应该保持不变。有时,还要求作为入口参数的寄存器的内容保持不变。
在子程序中,保存和恢复寄存器内容的主要方法是在开始时将子程序中使用的寄存器推入堆栈,然后在返回前将它们弹出堆栈。这样写的好处是子程序可以被任何其他程序调用。调用指令前不需要保存寄存器,调用指令后不需要恢复寄存器。
使用堆栈保存和恢复寄存器内容的方法的一般形式如下:
XXXXX Proc
Push reg 1
…
Push Regn;将子程序要使用的寄存器进行堆栈,regi代表某个寄存器
…
…
…;正在处理子程序
POPREGn的函数语句;弹出堆叠在你面前的寄存器,注意它们的顺序
…
pop reg 1
ret
XXXXXXENDP。
例7.2是在子程序中使用堆栈保存和恢复寄存器内容的例子。使用stack实现该功能时,要注意以下几点:
。使用堆栈保存和恢复寄存器内容时,要注意堆栈的“先入后出”操作特性;
通常,入口参数寄存器的内容不受保护。当然,他们也可以根据事先的约定得到保护。
。如果寄存器被用来带回子程序的处理结果,这些寄存器必须不受保护。
在整个子程序的执行过程中,几乎肯定会改变标志位。PUSHF和POPF可用于保护和恢复标志位,但一般来说,标志位在子程序中不受保护,除非有这种特殊需要。
位律师回复
0条评论