本帖最后由 zl2168 于 2016-9-12 07:06 編輯
⒋ 堆棧操作指令
PUSH direct ;SP+1→SP,(direct)→(SP)
POP direct ;(SP)→(direct),SP-1→SP
說明:⑴ PUSH為入棧指令,是將其指定的直接尋址單元中的數(shù)據(jù)壓入堆棧。由于80C51是向上生長型堆棧,所以進(jìn)棧時堆棧指針要先加1,然后再將數(shù)據(jù)壓入堆棧。例如,設(shè)堆棧原始狀態(tài)如圖3-2a所示,(30H)=2BH。執(zhí)行指令:PUSH 30H。具體操作是:①先將堆棧指針SP的內(nèi)容(0FH)加1,指向堆棧頂上的一個空單元,此時SP=10H,如圖3-2b所示;②然后將指令指定的直接尋址單元30H中的數(shù)據(jù)(2BH)送到該空單元中。執(zhí)行指令結(jié)果:(10H)=2BH,SP=10H,如圖3-2c所示。
圖3-2 入棧操作.jpg (96.89 KB, 下載次數(shù): 138)
下載附件
2016-9-12 06:49 上傳
⑵ POP為出棧指令,是將當(dāng)前堆棧指針SP所指示單元中的數(shù)據(jù)彈出到指定的內(nèi)RAM單元,然后將SP減1,SP始終指向棧頂?shù)刂贰@纾O(shè)堆棧原始狀態(tài)如圖3-3a所示,SP=0FH,(0FH)=4CH,執(zhí)行指令:POP 40H。具體操作是:①先將SP所指單元0FH(棧頂?shù)刂罚┲械臄?shù)據(jù)(4CH)彈出,送到指定的內(nèi)RAM單元40H,(40H)=4CH,如圖3-3b所示;②然后SP-1→SP,SP=0EH,SP仍指向棧頂?shù)刂罚?font face="Times New Roman">0FH中數(shù)據(jù)不變,仍等于4CH,但已作廢,如圖3-3c所示。
圖3-3 出棧操作.jpg (97.46 KB, 下載次數(shù): 134)
下載附件
2016-9-12 06:49 上傳
⑶ 由于堆棧操作時只能以直接尋址方式來取得操作數(shù),故不能用累加器A和工作寄存器Rn作為操作對象。若要把A的內(nèi)容推入堆棧,應(yīng)用指令“PUSH ACC”,這里ACC表示A的直接地址E0H。若要把R0的內(nèi)容推入堆棧,應(yīng)用指令“PUSH 00H”,這里00H表示R0的直接地址(設(shè)當(dāng)前工作寄存器區(qū)為0區(qū))。
【例3-8】已知SP=60H,求執(zhí)行下列程序指令后的結(jié)果。
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
執(zhí)行結(jié)果:SP=60H,不變;DPTR=3412H。由于堆棧先進(jìn)后出、后進(jìn)先出的操作原則,出棧時,先出的DPH裝入了后進(jìn)的原DPL的內(nèi)容(34H);而后出的DPL裝入了先進(jìn)的原DPH的內(nèi)容(12H)。 以上摘自張志良編著 《80C51單片機(jī)實(shí)用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9
書中電路和程序設(shè)計(jì)有詳細(xì)說明,程序語句條條有注解。
|