2024年3月24日发(作者:)

堆栈数据的进出原则

MCS-51单片机汇编语言中,没有SP这条指令,只有针

对SP操作的指令。51单片机中SP是堆栈指针寄存器,存放

着当前堆栈地址。堆栈用于存储子程序调用、中断程序调用时

程序返回的地址,或者用来临时保存某一寄存器的值。除了初

始化堆栈时直接给SP赋值,SP显式存在,其它的对SP有影

响的指令,对SP的操作都是隐式的,就是说SP并不出现在

指令操作数当中。例如: MOV SP,#80H ;初始堆栈指针,

(SP)=80HLCALL XXXX;调用XXXX处的子程序,下一条

指令PC值压栈,(SP)=(SP)+2NOP;子程序返回时,RET

指令从堆栈中弹出PC值,所以会返回到这里,(SP)=(SP)

-2PUSH ACC;累加器A的内容压栈保存,(SP)=(SP)

+1POP B;堆栈内保存的累加器A的内容弹出到B寄存器中,

(SP)=(SP)-1使用PUSH、POP指令使用堆栈,要注意进

出栈的匹配,否则将引起不可预期的后果。另外如果把30H

赋给了SP,称为设置栈底。以后:PUSH ACC ,就把

ACC的内容存放到31H单元;PUSH PSW ,就把PSW的

内容存放到32H单元;PUSH B ,就把B的内容存放到

33H单元。……弹出时,要用POP指令。利用堆栈,就不用

管具体的内容存放在什么单元了,SP会自动管理。

51单片机push入栈操作有两个步骤,首先定义堆栈指针

SP,然后再执行push指令。入栈操作的注意事项是所压数据

并不是存入SP指针指示的地址,而是SP+1单元。

pop操作只有一步,不需要定义SP指针,它和push指令

是配对使用的,有几个push就必须有几个pop,而且出栈是

遵循先入后出原则操作的。

堆栈寻址:操作数存放在堆栈中,隐含使用堆栈指针

(SP)作为操作数地址。堆栈是存储器(或专用寄存器组)

中一块特定的按“后进先出(LIFO)”原则管理的存储区,该

存储区中被读/写单元的地址是用一个特定的寄存器给出的,

该寄存器称为堆栈指针(SP)