ARMv7 寄存器 分类
在 ARMv7-A 架构中,处理器支持多种工作模式(Processor Modes),每种模式下可用的寄存器数量和类型有所不同。以下是基于 ARMv7 的寄存器组织和模式划分的详细说明:
参考链接:https://blog.csdn.net/qq_40309666/article/details/136147962
https://blog.csdn.net/weixin_45649908/article/details/125677511
1. ARMv7 的处理器模式
ARMv7 有 7 种处理器模式(也称为特权模式),每种模式对应不同的权限级别和用途:
- User (usr):非特权模式,普通应用程序运行在此。
- Supervisor (svc):操作系统内核运行在此。
- Fast Interrupt Request (fiq):处理高速中断。
- Interrupt Request (irq):处理普通中断。
- Abort (abt):处理内存访问异常(如 Prefetch Abort 或 Data Abort)。
- Undefined (und):处理未定义指令异常。
- Monitor (mon):管理安全状态切换(TrustZone)。
- Hyp (hyp):虚拟化扩展模式(部分实现中支持)。
注:Monitor 和 Hyp 模式在部分 ARMv7 实现中可能不启用。
2. 寄存器的基本分类
ARMv7 的寄存器分为以下几类:
- 通用寄存器(General Purpose Registers, GPRs):共 16 个(R0~R15)。
- 程序状态寄存器(Program Status Registers, PSRs):
- CPSR(Current Program Status Register):当前程序状态寄存器。
- SPSR(Saved Program Status Register):异常模式下保存 CPSR 的值。
- 特殊寄存器(如 CP15 控制寄存器,用于内存管理、时钟等)。
3. 各模式下的寄存器分配
(1) 共享寄存器(未分组寄存器)
- R0~R7:所有模式下共享相同的物理寄存器。
- R15(PC):程序计数器,在所有模式下共享。
(2) 分组寄存器(模式专用寄存器)
- R8~R12:在 FIQ 模式 下有专用的物理寄存器(
R8_fiq~R12_fiq)。 - R13(SP):堆栈指针寄存器(Stack Pointer),每种模式有独立的物理寄存器:
SP_usr,SP_svc,SP_irq,SP_abt,SP_und,SP_mon,SP_hyp。
- R14(LR):链接寄存器(Link Register),保存子程序返回地址:
LR_usr,LR_svc,LR_irq,LR_abt,LR_und,LR_mon,LR_hyp。
(3) 程序状态寄存器
- CPSR:在所有模式下可访问。
- SPSR:仅在异常模式(如 FIQ、IRQ、SVC、ABT、UND、MON、HYP)下存在,用于保存异常发生前的 CPSR 值。
4. 各模式下的寄存器列表
| 模式 | 通用寄存器 | SP(R13) | LR(R14) | SPSR |
|---|---|---|---|---|
| User (usr) | R0R7(共享)、R8R12(共享)、R13(SP_usr)、R14(LR_usr)、R15(PC) | SP_usr | LR_usr | 无 |
| FIQ (fiq) | R0R7(共享)、R8R12(专用 fiq)、R13(SP_fiq)、R14(LR_fiq)、R15(PC) | SP_fiq | LR_fiq | SPSR_fiq |
| IRQ (irq) | R0R7(共享)、R8R12(共享)、R13(SP_irq)、R14(LR_irq)、R15(PC) | SP_irq | LR_irq | SPSR_irq |
| SVC (svc) | R0R7(共享)、R8R12(共享)、R13(SP_svc)、R14(LR_svc)、R15(PC) | SP_svc | LR_svc | SPSR_svc |
| ABT (abt) | R0R7(共享)、R8R12(共享)、R13(SP_abt)、R14(LR_abt)、R15(PC) | SP_abt | LR_abt | SPSR_abt |
| UND (und) | R0R7(共享)、R8R12(共享)、R13(SP_und)、R14(LR_und)、R15(PC) | SP_und | LR_und | SPSR_und |
| MON (mon) | R0R7(共享)、R8R12(共享)、R13(SP_mon)、R14(LR_mon)、R15(PC) | SP_mon | LR_mon | SPSR_mon |
| HYP (hyp) | R0R7(共享)、R8R12(共享)、R13(SP_hyp)、R14(LR_hyp)、R15(PC) | SP_hyp | LR_hyp | SPSR_hyp |
5. 寄存器总数
- 逻辑上可见的寄存器:16 个通用寄存器(R0~R15) + 1 个 CPSR = 17 个。
- 物理寄存器数量:
- 未分组寄存器(R0~R7、R15):共 9 个物理寄存器。
- 分组寄存器:
- R8~R12 在 FIQ 模式下有专用副本:5 个物理寄存器。
- R13(SP):7 个物理寄存器(每种模式一个)。
- R14(LR):7 个物理寄存器(每种模式一个)。
- SPSR:7 个物理寄存器(异常模式各一个)。
- 总计:9(未分组) + 5(R8~R12_FIQ) + 7(SP) + 7(LR) + 7(SPSR) = 35 个物理寄存器。
![image]()
6. 关键寄存器功能说明
(1) R0~R7
- 作用:通用数据寄存器,用于存储临时数据或函数参数。
- 特点:所有模式共享同一物理寄存器。
(2) R8~R12
- User/SVC/IRQ/ABT/UND/HYP 模式:共享同一物理寄存器。
- FIQ 模式:专用物理寄存器(R8_fiq~R12_fiq),避免中断处理时频繁压栈/出栈。
(3) R13(SP)
- 作用:堆栈指针,指向当前模式的栈顶。
- 特点:每种模式有独立的物理寄存器(如 SP_irq、SP_svc)。
(4) R14(LR)
- 作用:保存子程序返回地址(由
BL指令设置)。 - 特点:每种模式有独立的物理寄存器(如 LR_irq、LR_svc)。
(5) R15(PC)
- 作用:程序计数器,指向当前执行指令的地址。
- 特点:所有模式共享同一物理寄存器。
(6) CPSR
- 作用:保存当前处理器状态(条件标志位、中断使能、当前模式等)。
- 字段:
- M[4:0]:指示当前模式(如 0b10000 表示 SVC 模式)。
- N/Z/C/V:算术运算结果标志(负数、零、进位、溢出)。
- I/F:中断屏蔽位(禁止 IRQ/FIQ)。
- T:ARM/Thumb 状态标志。
(7) SPSR
- 作用:在异常发生时保存 CPSR 的值,供异常处理结束后恢复。
- 特点:仅存在于异常模式(如 SPSR_irq、SPSR_svc)。
7. 示例:从 User 模式到 FIQ 模式的寄存器变化
- User 模式:
- 使用
SP_usr和LR_usr。 R8~R12是共享寄存器。
- 使用
- FIQ 模式:
- 使用
SP_fiq和LR_fiq。 R8~R12是专用寄存器(无需压栈/出栈,直接访问)。
- 使用
8. 总结
- ARMv7 的寄存器设计通过 分组寄存器(如 SP/LR)和 模式专属寄存器(如 SPSR)实现了对不同特权级别的灵活支持。
- 逻辑上的 16 个通用寄存器(R0~R15)在物理上因模式不同而扩展为多个副本,确保异常处理和中断响应的高效性。
- CPSR 和 SPSR 是管理处理器状态的核心寄存器,尤其在模式切换和异常处理中扮演关键角色。
这种设计既保持了 RISC 架构的简洁性,又通过硬件机制提高了系统的安全性和性能。


浙公网安备 33010602011771号