ARM程序状态寄存器Program State Register
在ARM模式中, 有16个数据寄存器和1或2个状态寄存器是可以随时访问的.在特权模式 (privileged mode) 下, 对应的特殊组寄存器才可以使用.
CPSR
当前程序状态寄存器 (Current Program State Register)
SPSR
保存的程序状态寄存器 (Saved Program State Register), 有6个,主要是在处理异常的时候使用.
每一种处理器模式下都有一个专用的物理寄存器作为备份的程序状态寄存器SPSR , 当特定的异常发生时,这个物理寄存器负责保存CPSR当前程序状态寄存器的内容, 当异常处理程序返回时,再将内容恢复到当前程序状态器中,继续向下执行原来程序.
结构解析
CPSR和保存它的SPSR寄存器因为都属于状态寄存器PSR,因此它们的结构相同,如下:
- 保存最近的逻辑或者算术操作的信息;
- 控制中断时使能;
- 设置处理器的工作模式;
状态寄存器的各个位的功能如下图:
其中,着重要注意的是高4位(28-31)和低8位(0-7).
注意:
- DNM(Do Not Modify):不同通过软件进行赋值;
- 条件标志位(Condition code flags): N,Z,C,V. 这些位可以通过逻辑或者算术操作, 或者 MSR
和 LDM
指令来操作. 处理器会测试这些标志位,以确定是否操作一些指令.
- N: 负数 ? 1 : 0
- Z: 运算结果为0 ? 1 : 0
- C: 进位标志.(4中情况)
1. 加法指令(包括CMN): 当结果产生了进位,则为1,表示无符号数运算发生溢出;
2. 减法指令(包括CMP): 当运算中发生了错位,为1, 表示运算发生下溢出;
3. 对已在操作数中包含移位操作的运算指令,C被置为被移位寄存器最后移出去的位;
4. 对于其他非加/减的运算指令,c一般不收影响;
- V: 溢出标志位: 对于加减法,当操作数和运算结果都是以二进制的补码表示的带符号的数,切运算结果超出了有符号运算的范围溢出,V=1.
- 控制位(低8位 I,F,T,M[4:0]),当发生异常时, 这些为的值将发生相应的变化.在特权模式下,也可以通过软件来修改这些位.用的比较多.
1. *中断禁止位* (I=1, IRQ禁止; F=1, FIQ禁止).
2. *状态控制位* (T=0, 处于ARM状态,即可执行32的ARM指令, 否则处于Thumb状态).
3. *模式控制位* ( M[4:0],这5位组合控制处理器处于什么工作模式)