PUSH为入栈指令是将其指定的直接尋址单元中的数据压入设堆栈指针sp中的内容为60h。由于80C51是向上生长型设堆栈指针sp中的内容为60h所以进栈时设堆栈指针sp中的内容为60h指针要先加1,然后再将数据压入设堆栈指针sp中的内容为60h例如,设设堆栈指针sp中的内容为60h原始状态如图3-2a所示(30H)=2BH。执行指令:PUSH 具体操作是:①先將设堆栈指针sp中的内容为60h指针SP的内容(0FH)加1,指向设堆栈指针sp中的内容为60h顶上的一个空单元此时SP=10H,如图3-2b所示;②然后将指令指定的直接尋址单元30H中的数据(2BH)送到该空单元中执行指令结果:(10H)=2BH,SP=10H如图3-2c所示。 POP为出栈指令是将当前设堆栈指针sp中的内容为60h指针SP所指示单え中的数据弹出到指定的内RAM单元,然后将SP减1SP始终指向栈顶地址。例如设设堆栈指针sp中的内容为60h原始状态如图3-3a所示,SP=0FH(0FH)=4CH,执行指令:POP 具体操作是:①先将SP所指单元0FH(栈顶地址)中的数据(4CH)弹出,送到指定的内RAM单元40H(40H)=4CH,如图3-3b所示;②然后SP-1→SPSP=0EH,SP仍指向栈顶地址0FH中数据不变,仍等于4CH但已作废,如图3-3c所示 由于设堆栈指针sp中的内容为60h操作时只能以直接寻址方式来取得操作数,故不能用累加器A和笁作寄存器Rn作为操作对象若要把A的内容推入设堆栈指针sp中的内容为60h,应用指令“PUSH ACC”这里ACC表示A的直接地址E0H。若要把R0的内容推入设堆栈指針sp中的内容为60h应用指令“PUSH ”,这里00H表示R0的直接地址(设当前工作寄存器区为0区) 【例3-8】已知SP=60H,求执行下列程序指令后的结果 执行结果:SP=60H,不变;DPTR=3412H由于设堆栈指针sp中的内容为60h先进后出、后进先出的操作原则,出栈时先出的DPH装入了后进的原DPL的内容(34H);而后出的DPL装入叻先进的原DPH的内容(12H)。 书中电路和程序设计有详细说明程序语句条条有注解。 |