轉載: http://www.cnblogs.com/xmphoenix/archive/2012/02/29/2372984.html
MSR指令
MSR指令的格式爲:
MSR{條件} 程序狀態寄存器(CPSR或SPSR)_<域>,操作數
MSR指令用於將操作數的內容傳送到程序狀態寄存器的特定域中。其中,操作數可以爲通用寄存器或立即數。<域>用於設置程序狀態寄存器中需要操作的位,32位的程序狀態寄存器可分爲4個域:
位[31:24]爲條件標誌位域,用f表示;
位[23:16]爲狀態位域,用s表示;
位[15:8]爲擴展位域,用x表示;
位[7:0]爲控制位域,用c表示;
該指令通常用於恢復或改變程序狀態寄存器的內容,在使用時,一般要在MSR指令中指明將要操作的域。
指令示例:
MSR CPSR,R0 ;傳送R0的內容到CPSR
MSR SPSR,R0 ;傳送R0的內容到SPSR
MSR CPSR_c,R0 ;傳送R0的內容到SPSR,但僅僅修改CPSR中的控制位域
原文:http://mcs.szu.edu.cn/user/qmtsang/Article_53737
-------------------------------------------------------------------------------------------------------------------------在啓動代碼裏,我們會看到如 msr
cpsr_cxsf,r0這樣的代碼。
用MSR指令對PSR進行操作的時候,爲了設定操作的範圍,避免對某些位的操作而影響其他部分而定義了這幾個FLAG。
具體指令如下:
MSR{cond} <psr>_<fields>, #immed_8r
MSR{cond} <psr>_<fields>, Rm
<fields>的具體含義如下:
specifies the field or fields to be moved. <fields> can be one or more of:
c - control field mask byte (PSR[7:0])
x - extension field mask byte (PSR[15:8])
s - status field mask byte (PSR[23:16)
f - flags field mask byte (PSR[31:24]).
msr cpsr_cxsf,r1 ;這裏的cxsf表示從低到高分別佔用的4個8bit的數據域
指令中有時還有出現cpsr_cf,
cpsr_all,
cpsr_c等,這裏:
c 指 CPSR中的control field ( PSR[7:0])
f 指 flag field (PSR[31:24])
x 指 extend field (PSR[15:8])
s 指 status field ( PSR[23:16])
其中cpsr的位表示爲:
31 30 29 28 --- 7 6 - 4 3 2 1 0
N Z C V I F M4 M3 M2 M1 M0
0 0 0 0 0 User26 模式
0 0 0 0 1 FIQ26 模式
0 0 0 1 0 IRQ26 模式
0 0 0 1 1 SVC26 模式
1 0 0 0 0 User 模式
1 0 0 0 1 FIQ 模式
1 0 0 1 0 IRQ 模式
1 0 0 1 1 SVC 模式
1 0 1 1 1 ABT 模式
1 1 0 1 1 UND 模式
深入分析:
對於MSR(寄存器到狀態寄存器)的指令,
MSR CPSR, r0
MSR CPSR_all, r0
MSR CPSR_flg, r0
都是已經過時的表示方法。
對於MRS(狀態寄存器到寄存器)的指令,
MRS R0, CPSR 等同於MRS R0,
CPSR_cxsf
MRS R0, CPSR_all 會有waring
MRS R0, CPSR_flg 會有錯誤
在ADS中使用c,f,x,s表示cpsr的各個部分是推薦的。從指令來說:
MSR CPSR_f, r0機器碼爲0xe128f000
MSR CPSR_c, r0機器碼爲0xe121f000
MSR CPSR_x, r0機器碼爲0xe122f000
MSR CPSR_s, r0機器碼爲0xe124f000
可見機器碼中用bit[29:16]4bit表示是f,c,x,s的。所以能夠在機器執行的時候,
給予不同的執行結果。爲了代碼向後兼容性,建議使用f,c,x,s尾綴。