栈是一个一头开放的线性数据结构,固定端为栈底,活动(或开放)端为栈顶。数据的存放只能从开放端进行(有点象叠放的书只能从上面放或取,不能从中间抽或插)。这样的结构涉及到两个问题,其一是栈底的定位,这是栈初始化必须做的,其二是栈顶操作,一般要求存取成对地配合操作。
在MCS-51中初始(复位)栈底定位在RAM地址8(SP为7),如果RAM中仅使用BANK0中的R0..R7就不用考虑栈底重定位。但这种情况太少,多数还是要在复位后根据RAM的使用情况对栈底进行重新定位(重设SP致栈底减一)。
设置完栈底后就可以使用栈来暂存数据或传输参数了和创建局部变量(由于MCS-51的RAM有限,后两重情况基本没用)了。在使用中只要注意PUSH和POP的配套成对使用,一般不回出现问题(除非超出了RAM的容量)。栈使用最多的是子程序(包括中断服务程序)中的寄存器和程序状态字PSW等运行现场状态的保护。一般形式为:
sub: ; or isr push reg0 push reg1 ... push reg7 push psw
...
pop psw pop reg7 ... pop reg1 pop reg0 ret ; or reti
在程序中也可以利用栈来暂存一些数据,如:
push ACC ; save A
...
pop ACC ; restore A
或
push B ; save B
...
pop B ; restore B
等等
总之必须有存有取,存取配对。 |