交換指令把字或無符號字節(jié)的讀取和存儲組合在了一條指令中。這種組合指令通常用于不能被外部其他存儲器訪問(如:DMA訪問)打斷的存儲器操作。一般用于處理器之間或處理器與DMA控制器之間共享信息的互斥訪問。
二進制編碼格式匯編格式SWP{} {B} Rd,Rm,[Rn]
本指令將存儲器中地址為Rn處的字(B=0)或無符號字節(jié)(B=1)讀入寄存器Rd,同時,將Rm中同樣類型的數(shù)據(jù)存入存儲器中相同的位置。Rd和Rm可以相同,但與Rn應(yīng)該不同。另外,PC不能出現(xiàn)在該指令中。
舉例LDR R0,SEMAPHORE
SWPB R1,R1,[R0] ;交換字節(jié),將存儲器單元[R0]中的字節(jié)數(shù)據(jù)讀取到R1中,同時,將R1中的數(shù)據(jù)寫入到存儲器單元[R0]中
SWP R1,R2,[R3]; 交換字數(shù)據(jù),將存儲單元[R3]中的字數(shù)據(jù)讀取到R1中,同時,將R2中的數(shù)據(jù)寫入到存儲單元[R3]中。
?
狀態(tài)寄存器與通用寄存器之間的傳送指令ARM指令中有兩條指令,用于在狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù)。修改狀態(tài)寄存器一般是通過“讀取-修改-寫回”三個步驟的操作來實現(xiàn)的。 這兩條指令分別是:
MRS指令用于將狀態(tài)寄存器的內(nèi)容傳送到通用寄存器中,它主要用于以下3種場合:
這里R用來區(qū)分是將CPSR還是SPSR拷貝到目的寄存器Rd,全部32位都被拷貝。
匯編格式MRS{} Rd,CPSR|SPSR
舉例:
MRS R0,CPSR ;將CPSR傳送到R0
MRS R3,SPSR ;將SPSR傳送到R3
注意事項:
不能通過該指令修改CPSR中的T控制位,直接將程序狀態(tài)切換到Thumb狀態(tài),必須通過BX等指令實現(xiàn)程序狀態(tài)切換。
在用戶或系統(tǒng)模式下沒有可以訪問的SPSR,所以SPSR形式在這些模式下不能用。
當修改CPSR或SPSR時,必須注意保存所有未使用位的值。
這條指令不影響條件標志碼。
操作數(shù)可以是一個寄存器Rm也可以是帶循環(huán)移位的8位有效立即數(shù),在域屏蔽的控制下傳送到CPSR或SPSR。
域屏蔽控制PSR中4字節(jié)的更新,其中第16位控制PSR[7:0]是否更新,第17位控制PSR[15:8],第18位控制PSR[23:16],第19位控制PSR[31:24]。使用立即數(shù)時,只有PSR[31:24]可選擇。
匯編格式MSR{} CPSR_f | SPSR_f,#<32-bit immediate>MSR{} CPSR_| SPSR_,Rm
這里的表示下列情況之一:
舉例:
MSR CPSR_f,#0xF0000000 ;設(shè)置所有標志位
MRS R0,CPSR ;將CPSR傳送到R0
ORR R0,R0,#0x200000000 ;設(shè)置R0的第29位
MSR CPSR_f,R0 ;傳送回CPSR
MRS R0,CPSR ;將CPSR傳送到R0
BIC R0,R0,#0x1F ;低5位清0
ORR R0,R0,#0x12 ;設(shè)置為IRQ模式
MSR CPSR_c,R0 ;傳送回CPSR
注意事項:
在用戶模式下不能對CPSR[23:0]做任何修改。
在用戶或系統(tǒng)模式下沒有SPSR,所以應(yīng)盡量避免在這些模式下訪問SPSR。
在嵌套的異常中斷處理中,當退出中斷處理程序時,通常通過MSR指令將事先保存了的SPSR內(nèi)容恢復到當前程序狀態(tài)寄存器CPSR中。
在修改的狀態(tài)寄存器位域中包括未分配的位時,避免使用立即數(shù)方式的MSR指令。
不能通過該指令直接修改CPSR中的T控制位直接將程序狀態(tài)切換到Thumb狀態(tài),必須通過BX等指令來完成程序狀態(tài)的切換。
參考文獻:
孟祥蓮.嵌入式系統(tǒng)原理及應(yīng)用教程(第2版)[M].北京:清華大學出版社,2017.
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧