模式轉換指令分析 msr cpsr_cxsf,r0

轉載: 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尾綴。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章