物理上是一个 32 位寄存器 ,逻辑上拆成三个子寄存器,通过
MRS/MSR指令按名字分别访问。

关键正误澄清
- 物理存在:32 位 PSR 硬件触发器阵列真实存在,中断自动压栈 / 出栈、故障保存均操作该硬件;xPSR 是访问它的完整视图别名。
- 物理不存在:APSR、IPSR、EPSR 没有独立硬件存储,只是硬件位掩码筛选出的逻辑分片视图。
"三合一" 含义:单个物理寄存器,拆分出 3 种独立分片视图,也可完整合并访问。
竖线 | 是分隔符;
表 1:APSR(应用程序状态寄存器)
只占 bit31 ~ bit27,保存算术运算标志位。
| 位 | 名称 | 含义 |
|---|---|---|
| bit31 | N | 负标志(Negative):运算结果最高位为 1 |
| bit30 | Z | 零标志(Zero):运算结果等于 0 |
| bit29 | C | 进位标志(Carry):无符号溢出 / 借位 |
| bit28 | V | 溢出标志(Overflow):有符号数溢出 |
| bit27 | Q | 饱和标志(Saturation):DSP 饱和运算置位 |
访问方式 :MRS R0, APSR | MSR APSR, R0
表 2:IPSR(中断程序状态寄存器)
只占 bit8 ~ bit0,保存当前异常编号。
| 位 | 名称 | 含义 |
|---|---|---|
| bit8~bit0 | Exception Number | 当前正在执行的异常号 |
| 值 = 0 | --- | 线程模式(Thread Mode),无异常 |
| 值≠0 | --- | 正在处理的异常编号(如 11=SVCall,15=PendSV,16=SysTick...) |
访问方式 :MRS R0, IPSR | 只读(不能 MSR 写)
表 3:EPSR(执行程序状态寄存器)
位段不连续,分布在 bit26:25、bit24、bit15:10 三处。
| 位 | 名称 | 含义 |
|---|---|---|
| bit26:25 | ICI/IT | IT(If-Then)指令块状态,ICI 部分 |
| bit24 | T | Thumb 状态位,Cortex-M 上必须恒为 1,为 0 会跑 Fault |
| bit15:10 | ICI/IT | IT 指令块剩余 6 位,ICI 剩余部分 |
访问方式 :MRS R0, EPSR | 只读(T 位不能软件改)
三合一访问对照
| 指令 | 读出内容 | 对应表格 |
|---|---|---|
MRS R0, APSR |
只有 N/Z/C/V/Q | 表 1 |
MRS R0, IPSR |
只有异常编号 | 表 2 |
MRS R0, EPSR |
只有 T 和 ICI/IT | 表 3 |
MRS R0, xPSR |
上面三个全部拼起来一次读 | 表 1 + 表 2 + 表 3 |
本质:
写
xPSR时三个子寄存器一起改;写
APSR只改标志位,不影响异常号和 T 位 ------ 这就是 "三合一" 的意义。