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