本帖最后由 zl2168 于 2016-9-12 07:06 编辑
⒋ 堆栈操作指令
PUSH direct ;SP+1→SP,(direct)→(SP)
POP direct ;(SP)→(direct),SP-1→SP
说明:⑴ PUSH为入栈指令,是将其指定的直接寻址单元中的数据压入堆栈。由于80C51是向上生长型堆栈,所以进栈时堆栈指针要先加1,然后再将数据压入堆栈。例如,设堆栈原始状态如图3-2a所示,(30H)=2BH。执行指令:PUSH 30H。具体操作是:①先将堆栈指针SP的内容(0FH)加1,指向堆栈顶上的一个空单元,此时SP=10H,如图3-2b所示;②然后将指令指定的直接寻址单元30H中的数据(2BH)送到该空单元中。执行指令结果:(10H)=2BH,SP=10H,如图3-2c所示。
⑵ POP为出栈指令,是将当前堆栈指针SP所指示单元中的数据弹出到指定的内RAM单元,然后将SP减1,SP始终指向栈顶地址。例如,设堆栈原始状态如图3-3a所示,SP=0FH,(0FH)=4CH,执行指令:POP 40H。具体操作是:①先将SP所指单元0FH(栈顶地址)中的数据(4CH)弹出,送到指定的内RAM单元40H,(40H)=4CH,如图3-3b所示;②然后SP-1→SP,SP=0EH,SP仍指向栈顶地址,0FH中数据不变,仍等于4CH,但已作废,如图3-3c所示。
⑶ 由于堆栈操作时只能以直接寻址方式来取得操作数,故不能用累加器A和工作寄存器Rn作为操作对象。若要把A的内容推入堆栈,应用指令“PUSH ACC”,这里ACC表示A的直接地址E0H。若要把R0的内容推入堆栈,应用指令“PUSH 00H”,这里00H表示R0的直接地址(设当前工作寄存器区为0区)。
【例3-8】已知SP=60H,求执行下列程序指令后的结果。
MOV DPTR,#1234H ;DPTR=1234H,DPH=12H,DPL=34H
PUSH DPH ;SP+1→SP,SP=61H,(DPH)→(SP),(SP)=(61H)=12H
PUSH DPL ;SP+1→SP,SP=62H,(DPL)→(SP),(SP)=(62H)=34H
MOV DPTR,#5678H ;DPTR=5678H
POP DPH ;DPH=(62H)=34H,SP-1→SP,SP=61H
POP DPL ;DPL=(61H)=12H,SP-1→SP,SP=60H
执行结果:SP=60H,不变;DPTR=3412H。由于堆栈先进后出、后进先出的操作原则,出栈时,先出的DPH装入了后进的原DPL的内容(34H);而后出的DPL装入了先进的原DPH的内容(12H)。 以上摘自张志良编著 《80C51单片机实用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9
书中电路和程序设计有详细说明,程序语句条条有注解。
|