假设你正在编写一个汇编语言程序,需要用到寄存器A、B、C来存储数据。在编写程序的过程中,你注意到程序需要做一个小的计算,并且该计算也需要用到寄存器A、B、C。你希望在完成该计算之后仍然回到原来的地方,并且仍然使用寄存器A、B、C中原先存放的数据。
为了保存寄存器A、B、C原先存放的数据,可以简单地把这些数据保存到存储器中不同的地址中,需要进行的计算完成之后,再把这些数据从存储器转移到寄存器。但这种方式需要记录数据存放的地址。有了堆栈的概念之后,我们可以用一种更清晰的方式来处理这个问题,即把这些寄存器中的数据依次存放到堆栈中。
PUSH A PUSH B PUSH C
稍后将具体解释这些指令实际的意义。现在需要知道的是,这些指令以某种方式把寄存器中的内容保存到先进后出存储器。这些指令执行之后,寄存器中原有的数据将妥善地保存下来,你就可以放心地使用这些寄存器进行别的工作了。为了取回原来的数据,可以使用POP指令把它们从堆栈中弹出,当然弹出的顺序和原来压入的顺序是相反的。相应的POP指令如下所示。
POP C POP B POP A
再次谨记:后进先出。如果POP指令的顺序弄错了,将会引起严重的错误。
我们可以在程序中多次用到堆栈而不会引起混乱,这是堆栈机制的一个特殊优势。例如,在我们要编写的程序中已经把寄存器A、B、C中的数保存到了堆栈,在程序的另一段又需要把寄存器C、D、E中的数保存到堆栈,可以使用下面的指令:
PUSH C PUSH D PUSH E
当然,在该段程序中还需要使用一些指令将保存到堆栈中的数据取回至寄存器,这些指令是:
编码隐匿在计算机软硬件背后的语言
292