模式转换指令分析 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尾缀。

你可能感兴趣的:(模式转换指令分析 msr cpsr_cxsf,r0)