1.11 程序状态寄存器
当前程序状态寄存器(Current Program Status Register,CPSR)可以在任何处理器模式下被访问,它包含下列内容。
(1)ALU(Arithmetic Logic Unit,算术逻辑单元)状态标志的备份。
(2)当前的处理器模式。
(3)中断使能标志。
(4)设置处理器的状态。
每一种处理器模式下都有一个专用的物理寄存器做备份程序状态寄存器(Saved Program Status Register,SPSR)。当特定的异常中断发生时,这个物理寄存器负责存放当前程序状态寄存器的内容。当异常处理程序返回时,再将其内容恢复到当前程序状态寄存器。
CPSR寄存器(和保存它的SPSR寄存器)中的位分配如图1-7所示。
图1-7 程序状态寄存器格式
下面给出各个状态位的定义。
1.标志位
N(Negative)、Z(Zero)、C(Carry)和 V(o Verflow)通称为条件标志位。这些条件标志位会根据程序中的算术指令或逻辑指令的执行结果进行修改,而且这些条件标志位可由大多数指令检测以决定指令是否执行。
在ARM 4T架构中,所有的ARM指令都可以条件执行,而Thumb指令却不能。
各条件标志位的具体含义如下。
(1)N。
本位设置成当前指令运行结果的bit[31]的值。当两个由补码表示的有符号整数运算时,N = 1表示运算的结果为负数,N = 0表示结果为正数或零。
(2)Z。
Z = 1表示运算的结果为零,Z = 0表示运算的结果不为零。
(3)C。
下面分4种情况讨论C的设置方法。
① 在加法指令中(包括比较指令CMN),当结果产生了进位,则C = 1,表示无符号数运算发生上溢出;其他情况下C = 0。
② 在减法指令中(包括比较指令CMP),当运算中发生错位(即无符号数运算发生下溢出),则C = 0;其他情况下C = 1。
③ 对于在操作数中包含移位操作的运算指令(非加/减法指令),C被设置成被移位寄存器最后移出去的位。
④ 对于其他非加/减法运算指令,C的值通常不受影响。
(4)V。
下面分两种情况讨论V的设置方法。
① 对于加/减运算指令,当操作数和运算结果都是以二进制的补码表示的带符号的数时,且运算结果超出了有符号运算的范围是溢出。V = 1表示符号位溢出。
② 对于非加/减法指令,通常不改变标志位V的值(具体可参照ARM指令手册)。
尽管以上C和V的定义看起来颇为复杂,但使用时在大多数情况下用一个简单的条件测试指令即可,不需要程序员计算出条件码的精确值即可得到需要的结果。
2.Q标志位
在带DSP指令扩展的ARM v5及更高版本中,bit[27]被指定用于指示增强的DAP指令是否发生了溢出,因此也就被称为Q标志位。同样,在SPSR中bit[27]也被称为Q标志位,用于在异常中断发生时保存和恢复CPSR中的Q标志位。
在ARM v5以前的版本及ARM v5的非E系列处理器中,Q标志位没有被定义,属于待扩展的位。
3.控制位
CPSR的低8位(I、F、T及M[4:0])统称为控制位。当异常发生时,这些位的值将发生相应的变化。另外,如果在特权模式下,也可以通过软件编程来修改这些位的值。
(1)中断禁止位。
I = 1,IRQ被禁止。
F = 1,FIQ被禁止。
(2)状态控制位。
T位是处理器的状态控制位。
T = 0,处理器处于ARM状态(即正在执行32位的ARM指令)。
T = 1,处理器处于Thumb状态(即正在执行16位的Thumb指令)。
当然,T位只有在T系列的ARM处理器上才有效,在非T系列的ARM版本中,T位将始终为0。
(3)模式控制位。
M[4:0]作为位模式控制位,这些位的组合确定了处理器处于哪种状态。如表1-6所示列出了其具体含义。
只有表1-6中列出的组合是有效的,其他组合无效。
表1-6 状态控制位M[4:0]
4.IF-THEN标志位
CPSR中的bits[15:10,26:25]称为IF-THEN标志位,它用于对Thumb指令集中if-then-else这一类语句块的控制。
其中IT[7:5]定义为基本条件,如图1-8所示。
IT[4:0]被定义为IF-THEN语句块的长度。
图1-8 IF-THEN标志位[7:5]的定义
5.E位/A位/GE[19-16]位的定义
A表示异步异常禁止位。
E表示大小端控制位,0表示小端操作,1表示大端操作。注意,该位在预取阶段是被忽略的。
GE[19-16]用于表示在SIMD指令集中的大于、等于标志。在任何模式下该位可读可写。