由于计算机的硬件资源只有⼀套,当⼦程序修改了寄存器的内容后,返回到调⽤它的程序时,这些寄存器的内容也就不会是调⽤⼦程序前的内容。这样,⼦程序修改寄存器内容就可能变成了调⽤它的副作⽤,这种副作⽤常常会导致调⽤程序的出错。为此,在编写⼦程序时,除了能对作为⼊⼝和出⼝参数的寄存器进⾏修改外,对其它寄存器的修改对调⽤程序来说都要是透明的,也就是说,在调⽤⼦程序指令的前后,除了作为⼊⼝和出⼝参数的寄存器内容可以不同外,其它寄存器的内容要保持不变。有时,也要求作为⼊⼝参数的寄存器内容保持不变。
在⼦程序中,保存和恢复寄存器内容的主要⽅法是:在⼦程序的开始把它所⽤到的寄存器压进栈,在返回前,再把它们弹出栈。这样编写的好处是该⼦程序可以被任何其它程序来调⽤。在调⽤指令前,不需要保存寄存器,在调⽤指令后,也⽆需恢复寄存器。
利⽤堆栈来保存和恢复寄存器内容⽅法的⼀般形式如下:
XXXXXPROC
PUSHREG1
…
PUSHREGn;把⼦程序要使⽤的寄存器压栈,REGi代表某个寄存器
…
…
…;⼦程序的处理功能语句
POPREGn;把前⾯压栈的寄存器弹出,注意它们的次序
…
POPREG1
RET
XXXXXENDP
例7.2就是⼀个在⼦程序中利⽤堆栈来保存和恢复寄存器内容的例⼦。利⽤堆栈来实现此项功能时,应注意以下⼏点:调用子程序的例子
、⽤堆栈保存和恢复寄存器的内容,要注意堆栈“先进后出”的操作特点;
、通常情况下不保护⼊⼝参数寄存器的内容,当然,也可以根据事先的约定⽽对它们加以保护;
、如果⽤寄存器带回⼦程序的处理结果,那么,这些寄存器就⼀定不能加以保护;
、整个⼦程序的执⾏⼏乎肯定要改变标志位,可⽤PUSHF和POPF来保护和恢复标志位,但⼀般在⼦程序中不保护标志位,除⾮有此特殊需要
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论