焦點要聞:嵌入式:交換指令之SWP,MRS,MSR

2022-12-23 10:21:08 來源:51CTO博客

存儲器與寄存器交換指令(SWP)

交換指令把字或無符號字節的讀取和存儲組合在了一條指令中。這種組合指令通常用于不能被外部其他存儲器訪問(如: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

MRS指令用于將狀態寄存器的內容傳送到通用寄存器中,它主要用于以下3種場合:

通過“讀-修改-寫”修改狀態寄存器的內容。MRS用于將狀態寄存器的內容讀到通用寄存器中,以便修改。當異常中斷允許嵌套時,需要在進入異常中斷后,嵌套中斷發生之前,保存當前處理器模式的SPSR。這是需要先通過MRS指令讀出SPSR的值,然后用其他指令將SPSR的值保存起來。當進程切換時,也需要保存當前寄存器的值。

MRS的二進制編碼

這里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

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

這里的表示下列情況之一:

c---控制域,對應PSR[7:0]x---擴展域,對應PSR[15:8](在當前ARM中未使用)s---狀態域,對應PSR[23:16](在當前ARM中未使用)f---標志位域,對應PSR[31:24]

舉例:

設置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.

標簽: 狀態寄存器 通用寄存器 程序狀態

上一篇:openssl-1.1.1n安裝
下一篇:快看點丨Python之面向對象版學員管理系統