
交換指令把字或無符號字節的讀取和存儲組合在了一條指令中。這種組合指令通常用于不能被外部其他存儲器訪問(如:DMA訪問)打斷的存儲器操作。一般用于處理器之間或處理器與DMA控制器之間共享信息的互斥訪問。
(資料圖)
SWP{} {B} Rd,Rm,[Rn]
本指令將存儲器中地址為Rn處的字(B=0)或無符號字節(B=1)讀入寄存器Rd,同時,將Rm中同樣類型的數據存入存儲器中相同的位置。Rd和Rm可以相同,但與Rn應該不同。另外,PC不能出現在該指令中。
LDR R0,SEMAPHORESWPB R1,R1,[R0] ;交換字節,將存儲器單元[R0]中的字節數據讀取到R1中,同時,將R1中的數據寫入到存儲器單元[R0]中 SWP R1,R2,[R3]; 交換字數據,將存儲單元[R3]中的字數據讀取到R1中,同時,將R2中的數據寫入到存儲單元[R3]中。
ARM指令中有兩條指令,用于在狀態寄存器和通用寄存器之間傳送數據。修改狀態寄存器一般是通過“讀取-修改-寫回”三個步驟的操作來實現的。 這兩條指令分別是:
狀態寄存器到通用寄存器的傳送指令(MRS)通用寄存器到狀態寄存器的傳送指令(MSR)MRS指令用于將狀態寄存器的內容傳送到通用寄存器中,它主要用于以下3種場合:
通過“讀-修改-寫”修改狀態寄存器的內容。MRS用于將狀態寄存器的內容讀到通用寄存器中,以便修改。當異常中斷允許嵌套時,需要在進入異常中斷后,嵌套中斷發生之前,保存當前處理器模式的SPSR。這是需要先通過MRS指令讀出SPSR的值,然后用其他指令將SPSR的值保存起來。當進程切換時,也需要保存當前寄存器的值。這里R用來區分是將CPSR還是SPSR拷貝到目的寄存器Rd,全部32位都被拷貝。
MRS{} Rd,CPSR|SPSR
舉例:
MRS R0,CPSR ;將CPSR傳送到R0 MRS R3,SPSR ;將SPSR傳送到R3
注意事項:
不能通過該指令修改CPSR中的T控制位,直接將程序狀態切換到Thumb狀態,必須通過BX等指令實現程序狀態切換。
在用戶或系統模式下沒有可以訪問的SPSR,所以SPSR形式在這些模式下不能用。
當修改CPSR或SPSR時,必須注意保存所有未使用位的值。這條指令不影響條件標志碼。
MSR的二進制編碼如下:
操作數可以是一個寄存器Rm也可以是帶循環移位的8位有效立即數,在域屏蔽的控制下傳送到CPSR或SPSR。
域屏蔽控制PSR中4字節的更新,其中第16位控制PSR[7:0]是否更新,第17位控制PSR[15:8],第18位控制PSR[23:16],第19位控制PSR[31:24]。使用立即數時,只有PSR[31:24]可選擇。
其匯編格式如下:
MSR{} CPSR_f | SPSR_f,#<32-bit immediate>MSR{ } CPSR_ | SPSR_ ,Rm
這里的
舉例:
設置N、Z、C和V標志位MSR CPSR_f,#0xF0000000 ;設置所有標志位僅設置C標志位,保存N、Z和V
MRS R0,CPSR ;將CPSR傳送到R0 ORR R0,R0,#0x200000000 ;設置R0的第29位 MSR CPSR_f,R0 ;傳送回CPSR從監控模式切換到IRQ模式
MRS R0,CPSR ;將CPSR傳送到R0 BIC R0,R0,#0x1F ;低5位清0 ORR R0,R0,#0x12 ;設置為IRQ模式 MSR CPSR_c,R0 ;傳送回CPSR
注意事項:
在用戶模式下不能對CPSR[23:0]做任何修改。
在用戶或系統模式下沒有SPSR,所以應盡量避免在這些模式下訪問SPSR。
在嵌套的異常中斷處理中,當退出中斷處理程序時,通常通過MSR指令將事先保存了的SPSR內容恢復到當前程序狀態寄存器CPSR中。
在修改的狀態寄存器位域中包括未分配的位時,避免使用立即數方式的MSR指令。
不能通過該指令直接修改CPSR中的T控制位直接將程序狀態切換到Thumb狀態,必須通過BX等指令來完成程序狀態的切換。
參考文獻:
孟祥蓮.嵌入式系統原理及應用教程(第2版)[M].北京:清華大學出版社,2017.