msr指令用於將通用暫存器的內容或乙個立即數傳送到狀態暫存器中。
指令的源運算元為通用暫存器時,指令編碼格式如下:
指令的源運算元為立即數時,指令編碼格式如下:
其中:
if
conditionpassed
(cond) then
if opcode[25]
==1operand =
8_bit_immediate rotate_right (rotate_imm *2)
else
/* opcode[25] == 0 */
operand = rm
if r ==
0 then
if field_mask[0]
==1 and inaprivilegedmode
() then
cpsr[7:
0]= operand[7:
0]if field_mask[1]
==1 and inaprivilegedmode
() then
cpsr[15:
8]= operand[15:
8]if field_mask[2]
==1 and inaprivilegedmode
() then
cpsr[23:
16]= operand[23:
16]if field_mask[3]
==1cpsr[31:
24]= operand[31:
24]else
/* r == 1 */
if field_mask[0]
==1 and currentmodehasspsr
() then
cpsr[7:
0]= operand[7:
0]if field_mask[1]
==1 and currentmodehasspsr
() then
cpsr[15:
8]= operand[15:
8]if field_mask[2]
==1 and currentmodehasspsr
() then
cpsr[23:
16]= operand[23:
16]if field_mask[3]
==1 and currentmodehasspsr
() then
cpsr[31:
24]= operand[31:
24]
msr指令通常用於恢復狀態暫存器的內容或者改變狀態暫存器的內容。
當退出異常中斷處理程式時,如果事先儲存了狀態暫存器的內容(如在巢狀的異常中斷處理中)通常通過msr指令將事先儲存的狀態暫存器內容恢復到狀態暫存器中。
當需要修改狀態暫存器的內容時,通過"讀出-修改-寫回"指令序列完成。寫回操作也是通過msr指令完成的。
考慮到指令執行的效率,通常在msr指令中指定指令將要修改的位域。例如,下面的指令序列將處理器模式切換到特權模式,這裡只修改狀態暫存器的控制位域,所以在指令中指定該位域。
mrs r0,cpsr ;讀取cpsr
bic r0,r0,#0x1f ;修改,去除當預處理器模式
orr r0,r0,#0x13 ;修改,設定特權模式
msr cpsr_c, r0 ;寫回,僅僅修改cpsr中的控制位域
但是,當程序切換到應用場合時,應指定spsr_fsxc,這樣,將來arm擴充套件了當前未用的一些位後,程式還可以正常執行。
當欲修改的狀態暫存器位域中包含未分配的位時,最好不要使用立即數方式的msr指令。乙個例外的情況是,可以使用立即數方式的msr指令修改狀態暫存器中的條件標誌位位域。
劉帥嵌入式系統 乘法指令
arm有兩類乘法指令 一類為32位的乘法指令,即乘法操作的結果為32位 另一類為64位的乘法指令,即乘法操作的結果為64位。兩類指令共有以下6條。mul指令實現兩個32位的數 可以為無符號,也可以為有符號 的乘積,並將結果存放到乙個32位的暫存器中,同時可以根據運算結果設定cpsr暫存器中相應的條件...
劉帥嵌入式系統 UMLAL指令
umlal指令實現兩個32位的無符號數的64位乘積結果與 rdhi 和 rdlo 中的64位無符號數相加,加法結果的高32位存放到乙個32位暫存器中,乘積結果的低32位存放到另乙個32位的暫存器 rdlo 中,同時可以根據運算結果設定cpsr暫存器中相應的條件標誌位。其中 if conditionp...
劉帥嵌入式系統 TEQ相等測試指令
teq指令將 shifter operand 表示的數值與暫存器 rn 的值按位做邏輯異或操作,根據操作的結果更新cpsr中相應的條件標誌位。其中 if conditionpassed then alu out rn eor shifter operand n flag alu out 31 z f...