/*
* 程序状态寄存器
*/
CPSR(当前程序状态寄存器)可以在任何处理器模式下被访问。每一种模式下都有一个专用的物理状态寄存器,
称为SPSR(备份程序状态寄存器)。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。
在异常退出时,可以用 SPSR中保存的值来恢复CPSR。CPSR的具体格式如下。
31 30 29 28 27 26 7 6 5 4 3 21 0
N Z C V Q DNMLRAZ I F I M4 M3 M M0
1)条件标志位
N(Negative)、Z(Zero)、C(Carry)及V(oVerflow)统称为条件标志位。
大部分的ARM指令可以依据CPSR中的这些标志位来选择性地执行。
N 本位设置成当前指令运算结果的bit[31]的值
当两个补码表示的有符号整数运算时,N=1表示运算的结果为负数,N=0 表示结果为正数或零
Z
Z=1表示运算结果是0,Z=0表示运算结果不是零
对于CMP指令,Z=1表示进行比较的两个数大小相等
C
在加法指令中(包括比较指令CMN),结果产生进位了,则C=1,表示无符号数运算发生上溢出,其他情况下C=0
在减法指令中(包括比较指令CMP),结果产生借位了,则C=0,表示无符号数运算发生下溢出,其他情况下C=1
对于包含移位操作的非加/减法运算指令,C中包含最后一次被溢出的位的数值,
对于其他非加/减法运算指令,C位的值通常不受影响
V
对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出
其他的指令通常不影响V位
2)Q标志位
在ARM v5的E系列处理器中,CPSR的bit[27]称为Q标志位,主要用于指示增强的DSP指令是否发生了溢出,
同样的,SPSR的bit[27]也称为Q标志位,用于在异常中断发生时保存和恢复CPSR中的Q标志位。
3)CPSR中的控制位
CPSR的低8位I、F、T及M[4:0]统称为控制位,当异常中断发生时这些位发生变化。
在特权级的处理器模式下,软件可以修改这些控制位。
① I中断禁止位
当I=1时禁止IRQ中断。
当F=1时禁止FIQ中断。
通常一旦进入中断服务程序可以通过置位I和F来禁止中断,但是在本中断服务程序退出前必须恢复原来I、F位的值。
② T控制位,用来控制指令执行的状态,即说明本指令是ARM指令还是Thumb指令。
对于不同版本的ARM处理器,T控制位的含义是有些不同的。
对于ARM v3及更低的版本和ARM v4的非T系列版本的处理器,没有ARM和Thumb指令的切换,所以T始终为0。
对于ARM v4及更高版本的T系列处理器,T控制位含义如下。
当T=0,表示执行ARM指令。
当T=1,表示执行Thumb指令。
对于ARM v5及更高的版本的非T系列处理器,T控制位的含义如下。
当T=0表示执行ARM指令。
当T=1表示强制下一条执行的指令产生为定义指令中断。
③ M 控制位
控制位M[4:0]称为处理器模式标识位
M[4:0]
处理器模式
可访问的寄存器
0b10000
User
PC,R14~R0,CPSR
0b10001
FIQ
PC,R14_fiq~R8_fiq,R7~R0,CPSR,SPSR_fiq
0b10010
IRQ
PC,R14_irq~R13_irq,R12~R0,CPSR,SPSR_irq
0b10011
Supervisor
PC,R14_svc~R13_svc,R12~R0,CPSR,SPSR_svc
0b10111
Abort
PC,R14_abt~R13_abt,R12~R0,CPSR,SPSR_abt
0b11011
Undefined
PC,R14_und~R13_und,R12~R0,CPSR,SPSR_und
0b11111
System
PC,R14~R0,CPSR(ARM v4及更高版本)
④CPSR的其他位用于将来ARM版本的扩展,程序可以先不操作这些位。