ARM处理器的状态寄存器(主要是 CPSR - Current Program Status Register)是处理器的“控制中心”和“状态报告员”,它是一个非常重要的32位寄存器,在程序执行的每一刻都扮演着核心角色。

我们可以把它想象成一个汽车的仪表盘和方向盘的组合:
- 仪表盘部分:实时显示当前的状态信息,比如车速(标志位)、发动机是否运转(模式)、是否亮了故障灯(异常标志)。
- 方向盘部分:允许你控制汽车的行为,比如切换到运动模式(改变处理器模式)、打开巡航控制(使能/禁用中断)。
下面我们从两个核心维度来分解CPSR的作用:控制和状态。
控制作用 (方向盘部分)
这部分允许软件(或硬件异常)动态地改变处理器的工作方式。
处理器模式
这是CPSR最核心的控制功能之一,ARM处理器有多种工作模式,以区分不同程序的执行权限和上下文。

- 用户模式:正常的程序执行模式,不能直接访问CPSR来改变模式或禁用中断,这是为了保护操作系统内核不被普通程序破坏。
- FIQ模式:快速中断模式,用于处理对速度要求极高的中断(如硬盘数据传输)。
- IRQ模式:普通中断模式,用于处理一般的外部设备中断。
- 管理模式:管理模式,这是操作系统的核心模式,通过执行
SWI指令(软中断)进入,用于进行系统调用和特权操作。 - 中止模式:用于处理存储器访问错误,如页面错误。
- 未定义模式:当处理器执行到一个它不认识的指令时,会进入此模式,通常用于协处理器仿真。
- 系统模式:与管理模式类似,但它运行在用户模式下,可以不受限制地访问CPSR。
作用:通过切换模式,ARM处理器可以实现特权级别的管理和保护,当用户程序需要执行一个只有内核才能做的操作时,它会触发一个SWI指令,处理器自动切换到管理模式,执行完内核代码后再切回用户模式,这确保了系统的稳定和安全。
中断使能控制
CPSR中有两位专门用于控制处理器的中断响应能力。
- I (Interrupt) 位:控制IRQ(普通中断)的使能。
I = 0:IRQ中断被使能,处理器可以响应。I = 1:IRQ中断被禁止,处理器忽略所有IRQ中断请求。
- F (Fast Interrupt) 位:控制FIQ(快速中断)的使能。
F = 0:FIQ中断被使能。F = 1:FIQ中断被禁止。
作用:在执行临界区代码(修改一个共享数据结构时)时,操作系统会暂时设置I=1来禁止中断,防止在代码执行过程中被中断打断,导致数据不一致,执行完毕后再恢复I=0。
T 位
这个位决定了ARM处理器的工作状态。
- T = 0:处理器工作在 ARM状态,执行标准的32位ARM指令。
- T = 1:处理器工作在 Thumb状态,执行16位的Thumb指令,代码密度更高,适合存储空间受限的应用。
作用:T位使得ARM处理器可以在ARM和Thumb指令集之间无缝切换,这对于优化代码大小和性能至关重要,一个内存密集型的UI界面可以用Thumb指令来节省空间,而一个计算密集型的算法可以用ARM指令来获得更高性能。
状态作用 (仪表盘部分)
这部分由处理器在执行指令后自动更新,反映了指令执行的结果和当前的状态,供后续指令(特别是条件执行指令)使用。
条件码标志位
这是ARM指令集强大特性的基础,ARM的绝大多数指令都可以根据这些标志位的状态来决定是否执行,这被称为条件执行,可以极大地减少分支指令的使用,提高代码效率。
- N (Negative) - 位31:负数标志。
- 当指令执行结果的最高位(位31)为1时,N被置1。
- 代表结果是一个负数(在二进制补码表示法下)。
- Z (Zero) - 位30:零标志。
- 当指令执行结果为0时,Z被置1。
- 代表结果等于零。
- C (Carry) - 位29:进位标志。
- 在无符号数运算中,当发生进位(加法)或借位(减法)时,C被置1。
- 在移位操作中,C会保存被移出的最后一位。
- V (Overflow) - 位28:溢出标志。
在有符号数运算中,当结果超出了有符号数的表示范围(即发生上溢或下溢)时,V被置1。
作用示例:
一条指令如 ADDNE R0, R1, R2 的意思是:“如果N和Z标志位不全为1(即结果不为零),则执行 R0 = R1 + R2,否则什么都不做”,这种机制避免了大量的 if-then-else 分支,流水线效率更高。
扩展标志位 (Q位)
- Q (Saturation) - 位27:饱和标志。
- 在支持“饱和算术”的ARMv6及以上版本处理器中,当一个有符号的加法或减法运算结果发生溢出时,Q位会被置1。
- 饱和算术是指当结果溢出时,它会“卡”在最大值或最小值,而不是回绕,这对于数字信号处理等应用非常有用,可以防止意外的错误结果。
保存与恢复:SPSR寄存器
当处理器通过异常(如中断、软中断)进入一个特定的模式时,当前的CPSR内容(即被打断前的程序状态)会被自动保存到SPSR - Saved Program Status Register中,每个异常模式都有自己的SPSR。
- 作用:当异常处理程序执行完毕,需要返回到被打断的程序时,只需将对应的SPSR内容恢复到CPSR中,处理器就能完全恢复到被打断前的状态(包括模式、标志位等),然后继续执行,这保证了异常处理的透明性。
| CPSR功能 | 作用分类 | 具体说明 |
|---|---|---|
| 处理器模式 | 控制 | 定义当前程序的权限级别(用户/特权),实现操作系统保护机制。 |
| 中断使能 | 控制 | 允许/禁止IRQ和FIQ中断,用于保护临界区代码。 |
| T位 | 控制 | 切换ARM/Thumb指令集,优化代码大小和性能。 |
| N/Z/C/V标志 | 状态 | 记录指令执行结果(负/零/进位/溢出),实现高效的条件执行。 |
| Q标志 | 状态 | 记录饱和算术是否溢出,常用于DSP应用。 |
| 与SPSR配合 | 状态保存/恢复 | 在异常发生时保存旧状态,返回时恢复旧状态,保证程序连续性。 |
ARM处理器的状态寄存器是连接软件指令和硬件执行之间的桥梁,它既是一个配置寄存器,告诉处理器“如何做”(控制),又是一个状态寄存器,告诉软件“做得怎么样”(状态),理解CPSR是掌握ARM汇编语言、操作系统原理以及进行底层系统编程的关键。
