劉帥嵌入式系統 MSR指令

2021-09-22 21:39:41 字數 2230 閱讀 9474

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