在启动代码里,我们会看到如 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]).
原文:http://mcs.szu.edu.cn/user/qmtsang/Article_53737
关于CPSR_cxsf
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尾缀。