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