显然,由于先进后出的原则,这些数据在先前存放的C、B、A中的数据之前弹出堆栈。
堆栈的功能是怎样实现的呢?首先,堆栈其实就是一段普通的RAM存储空间,只是这段空间相对独立不另作他用。8080微处理器设置了一个专门的16位寄存器对这段存储空间寻址,这个特殊的寄存器称为堆栈指针(SP,Stack Pointer)。
在我们所举的例子中,对于8080来说使用PUSH和POP对寄存器操作实际上是不准确的。在8080中,执行PUSH指令实际上是把16位的数据保存到堆栈,执行POP指令是把这些数据从堆栈中取回至寄存器。因此,对于上面的如PUSHC,POPC等指令,我们对其进行如下的修改。
PUSH BC 指令将寄存器 B 和 C 中的数据保存到堆栈,而 POP BC 则将这些数据从堆栈取回到寄存器B和C中,并且保持原来的顺序。最后一行指令中的PSW代表程序状态字,如前所述,这是一个8位的寄存器,用于保存标志位。最后一行的PUSH和POP指令的操作对象实际上是累加器和PSW,即压入和弹出堆栈的数据由累加器和PSW中的内容组成。如果你想把所有寄存器中的数据及全部标志位都保存到堆栈,可以使用下面的指令:
PUSH PSW
PUSH BC
PUSH DE
PUSH HL
堆栈是怎样工作的呢?我们假设堆栈指针是8000h,当执行PUSH BC指令时将会引发以下操作。
堆栈指针减1,变为7FFFh。
19 两种典型的微处理器
POP E POP D POP C
293