由前面的内容可知,栈指针指向当前可用于栈的RAM位置。当数据压入栈后,SP自增;相反,当数据从栈中弹出到寄存器中时,SP自减。当数据压入栈后,SP自增的原因是为了确保栈是朝着RAM位置7FH处增长,即从低地址向高地址增长。如果数据压入栈后栈指针自减,则使用的就是RAM位置7、6、5等,这些是组0(即默认的寄存器组)的R7到R0。压入数据后指针自增,也确保栈不会到达RAM底部0的位置,结果就是将栈空间使用完。然而,对于栈的默认设置有一个问题,因为当8051上电之后,SP=07,即栈的首个位置是RAM中的08位置,但它是属于寄存器组1的寄存器R0的,也就是说,寄存器组1和栈使用的是同样的存储空间。如果一个程序需要使用寄存器组1和组2时,就必须重新分配RAM空间给栈。例如,可分配RAM位置地址60H甚至更高的位置地址给栈,如例2-10所示。
例2-10给出下面指令的栈和栈指针。