arm 程序状态寄存器

ARM 283浏览

3.2.3 程序状态寄存器


当前程序状态寄存器CPSR(Current Program Status Register)可以在任何微处理器模式下被访问,它包含条件码标志、中断控制、当前处理器模式以及其他状态和控制信息。图3.3显示CPSR的各个位含义。

图3.3  程序状态寄存器

3.2.3.1 条件码标志


CPSR最高4位:N(Negative)、Z(Zero)、C(Carry)和V(oVerflow)称为条件标志位。程序中的算术或逻辑指令可以根据其执行结果修改这些条件标志位,之后的条件执行指令可以根据这些条件标志决定相应的指令是否被执行。各条件标志位的具体含义如下:

(1)N(符号位)

该位设置为当前指令运行结果的BIT[31]的值。当两个由补码表示的有符号整数运算时,N=1表示运算的结果为负数;N=0表示结果为正数或零。

(2)Z(零标志位)

如果指令的运算结果为0,则Z=1(通常用来表示比较的结果为“相等”);否则Z=0。

(3)C(进、借位标志)

表示运算是否有进位、借位等。下面分4种情况讨论C的设置方法。

l         在加法指令中(包括比较指令CMN),当结果产生了进位,则C=1,表示无符号数运算发生上溢出;其他情况下C=0。

l         在减法指令中(包括比较指令CMP),当运算中发生错位(即无符号数运算发生下溢出),则C=0,;其他情况下C=1。

l         对于在操作数中包含移位操作的运算指令(非加/减法指令),C被设置成被移位寄存器最后移出去的位。

l         对于其他非加/减法运算指令,C的值通常不受影响。

(4)V(溢出标志位)

l         对于加/减运算指令,当操作数和运算结果都是以二进制的补码表示的带符号的数时,V=1表示符号位溢出。

l         对于非加/减法指令,通常不改变标志位V的值(具体可参照ARM指令手册)。尽管以上C和V的定义看起来颇为复杂,但使用时在大多数情况下用一个简单的条件测试指令即可,不需要程序员计算出条件码的精确值即可得到需要的结果。

3.2.3.2  Q标志位


在带DSP指令扩展的ARM v5E及更高版本中,CPSR[27]用于指示增强的DSP指令是否发生了溢出或饱和。当 QADD, QDADD, QSUB or QDSUB时发生饱和,或者SMLAxy or SMLAWx 的结果超出32-bits时Q位被置位。该位一旦置位就不能使用上述指令来修改标识位,而必须使用MSR 指令写CPSR来清除。

在ARM v5以前的版本及ARM v5的非E系列处理器中未定义Q标志位。

3.2.3.3中断控制位


I=1时,IRQ被禁止;I=0时,IRQ中断使能。

F=1时,FIQ被禁止;F=0时,FIQ中断使能。

在程序中可以通过修改I、F位来禁止或使能IRQ和FIQ。

3.2.3.4状态控制位


T 位是处理器的状态控制位,主要用于ARM体系带T的版本,在非T系列的ARM版本中,T位将始终为0。当T=0时,处理器处于ARM状态(即正在执行32位的ARM指令)。当T=1时,处理器处于Thumb状态(即正在执行16位的Thumb指令)。

不能通过直接修改CPSR的T为来改变处理器的状态,因为直接修改CPSR的T位结果不可预知。必须通过状态切换指令BX、BLX指令来修改T位。

可以使用指令显式的在ARM状态和Thumb状态之间切换;另外异常发生时,处理器会自动的进入到ARM状态,异常发生前是ARM状态还是Thumb状态可以通过SPSR的T位来判断。

CPSR第24位为J位,被支持J变种的ARM微处理器支持,J = 1处理器处于Jazelle状态,执行8位的JAVA字节码指令。在Jazelle状态中,处理器并不是执行8位的指令预取,而是执行32位的高性能预取(4-byte)。另外,在Jazelle状态我们不提及PC,因为‘Jazelle PC’ 被自动保存在r14中。

3.2.3.5模式控制位


M[4∶0]为模式控制位,这些位的组合确定了处理器处于哪种状态。表3.2给出了各个模式对应的M值。只有表中列出的M值组合是有效的,其它组合无效。

表3.2  CPSR/SPSR状态控制位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及更高版本)

ARM微处理器的每种异常模式都有一个专用的物理寄存器SPSR(Saved Program Status Register),作为程序状态寄存器的备份寄存器。当特定的异常发生时,硬件自动将CPSR寄存器的内容保存到相应异常模式的SPSR寄存器中;当异常处理程序返回时,再将其内容恢复到当前程序状态寄存器。

由于用户模式和系统模式不属于异常中断模式,所以它们没有SPSR寄存器。当在用户模式或系统模式中访问SPSR,将会产生不可预知的结果。

3.2.3.6 CPSR/SPSR寄存器的访问、修改


对于状态寄存器的修改要遵守以下原则:

l         不修改和使用状态寄存器中未定义的位:这些在当前ARM版本中未使用的状态位,在之后的版本中可能会被用作新的用途。如果我们使用了这些位,在新的处理器中程序可能会无法正确运行。所以我们不应该使用状态寄存器中为未定义的位,应该保证这些位不被改变。

l         通常要遵循读取->修改->写会的原则:这个原则保证了我们在修改状态寄存器的某些位是保证其它位不受影响。

如图3.3所示,ARM微处理器中按8位一组,将状态寄存器(CPSR/SPSR)分为4个可分别写的区。各个区的含义如下:

l         控制(c)BIT[0-7]:CPSR的低8位(I、F、T及M[4∶0])统称为控制位。当异常发生时,这些位的值将由硬件自动改变。另外,当在特权模式时,可以通过软件编程来修改这些位的值。

l         扩展(x)BIT[8-15]:保留为将来使用。

l         状态(s)BIT[16-23]:保留为将来使用。

l         标识(f)BIT[24-31]:数据处理指令的运算结果会对CPSR的条件标志位产生影响,如:比较和测试指令(CMN、CMP、TEQ、TST);在算术、逻辑运算和数据传输指令中,目的寄存器不是R15时,可以通过在这些指令末尾加标志“S”来通知处理器指令的执行结果影响标志位。