堆棧操作指令
堆棧指令是FX系列中新增的基本指令,用于多重輸出電路,為編程帶來便利、在FX系列PLC中有11個存儲單元,它們專門用來存儲程序運算的中間結(jié)果,被稱為棧存儲器。
堆棧是計算機中一種先進后出的數(shù)據(jù)結(jié)構,由棧區(qū)和棧頂指針組成。
堆棧有兩種操作,壓棧(進棧)和彈棧(出棧),他們均只能在棧頂進行。
堆棧指令是FX系列中新增的基本指令,用于多重輸出電路,為編程帶來便利、在FX系列PLC中有11個存儲單元,它們專門用來存儲程序運算的中間結(jié)果,被稱為棧存儲器。
指令說明:
(1)MPS(進棧指令)。將運算結(jié)果送入棧存儲器的第一段,同時將先前送入的數(shù)據(jù)依次移到棧的下一段。
(2)MRD(讀棧指令)。將棧存儲器的第一段數(shù)據(jù)(最后進棧的數(shù)據(jù))讀出且該數(shù)據(jù)繼續(xù)保存在棧存儲器的第一段,棧內(nèi)的數(shù)據(jù)不發(fā)生移動。
(3)MPP(出棧指令)。將棧存儲器的第一段數(shù)據(jù)(最后進棧的數(shù)據(jù))讀出且該數(shù)據(jù)從棧中消失,同時將棧中其它數(shù)據(jù)依次上移。
(4)堆棧指令沒有目標元件。
(5)MPS和MPP必須配對使用。
(6)由于棧存儲單元只有11個,因此棧的層次最多11層。
堆棧是片內(nèi)RAM區(qū)中的一塊連續(xù)的字節(jié)存儲單元,遵循“先入后出、后入先出”的使用原則。堆棧操作分為“入?!焙汀俺鰲!眱煞N,入棧操作通過PUSH指令將數(shù)據(jù)放入堆棧,而出棧操作通過POP指令將數(shù)據(jù)從堆棧中取出。一般情況下,堆棧操作指令PUSH和POP應該成對出現(xiàn),并且滿足堆棧“先入后出、后入先出”的使用原則。堆棧通常用于子程序和中斷服務處理程序的調(diào)用、返回操作及參數(shù)傳遞和現(xiàn)場保護,也可以用于存放程序執(zhí)行時產(chǎn)生的臨時數(shù)據(jù)。
PUSH指令和POP指令只能進行字節(jié)類型的數(shù)據(jù)傳送,而且指令中唯一的操作數(shù)必須采用直接尋址方式,其格式見表3-3。
堆棧操作中用到的特殊功能寄存器SP被稱為堆棧指針。堆棧操作時,SP中的數(shù)被當作片內(nèi)RAM存儲單元的地址。MCS-51單片機在入棧操作時SP增加、出棧時SP減小,這樣的堆棧被稱為“向上生長型”的堆棧。而入棧時SP減小、出棧時SP增大的堆棧被稱為“向下生長型”的堆棧。堆棧操作前,SP初始值所指向的片內(nèi)RAM存儲單元被稱為“棧底”,每次堆棧操作后,SP所指向的片內(nèi)RAM存儲單元被稱為“棧頂”。
【例3-25】堆棧操作指令。程序段及指令執(zhí)行時片內(nèi)RAM中的數(shù)據(jù)存放情況如下:
本例給出了指令執(zhí)行過程中片內(nèi)RAM中數(shù)據(jù)變化的情況,讀者應將其與程序指令對照分析,并注意堆棧操作過程中SP的變化。
【例3-26】錯誤堆棧操作指令舉例。以下4條指令均是錯誤的。
本例指令錯誤的原因是:在指令①和②中,A和R0都是寄存器,屬于寄存器尋址方式,而堆棧操作指令的操作數(shù)只能是直接尋址的;在指令③中,DPTR由DPH和DTL兩個特殊功能寄存器構成,而DPTR本身不是特殊功能寄存器,不符合堆棧操作指令對操作數(shù)尋址方式的要求;在指令④中,立即數(shù)不能作堆棧操作指令的操作數(shù)。
交換指令
交換指令的功能是交換操作數(shù)的存放位置,指令語法格式見表3-4。
數(shù)據(jù)交換指令是實現(xiàn)兩個操作數(shù)據(jù)之間的位置互換的指令,這兩個操作數(shù)可以是兩個寄存器操作數(shù),或一個寄存器操作數(shù)與一個存儲器操作數(shù),或兩個存儲器操作數(shù),在多處理機中,也可以是一個寄存器操作數(shù)和一個共享存儲器操作數(shù)。數(shù)據(jù)交換指令實現(xiàn)了數(shù)據(jù)的雙向傳送,一條數(shù)據(jù)交換指令起到了三條數(shù)據(jù)傳送指令的作用。
【例3-27】交換指令舉例。指令如下:
在本例中,若假設指令執(zhí)行之前,(A)=0AFH、(R5)=23H、(B)=51H、(72H)=67H、(R0)=18H、(18H)=9EH,則上述6條指令執(zhí)行的結(jié)果分別如下:
①(A)=23H,(R5)=(0AFH)
②(A)=51H,(B)=(0AFH)
③(A)=67H,(72H)=(0AFH)
④(A)=9EH,((R0))=(18H)=(0AFH)
⑤(A)=0AEH,((R0))=(18H)=(9FH)
⑥(A)=0FAH