架构八股文:ARM架构三大基本状态和寄存器说明

2025-12-21 09:21:21

架构八股文:ARM架构三大基本状态和寄存器说明

ARM / Thumb / Jazelle

​ 这是ARM架构的三种经典状态,

ARM 状态

​ ARM状态下的指令都是32位长,指令功能强大,寄存器操作灵活,因此性能比较高,但是由于长度为32位,因此,代码尺寸较大,在一些存储比较极端的场景下,非常容易炸存储,这也就是我们为什么会在一些很极端的情况下请出来第二种模式。

Thumb 状态

​ Thumb 状态下的指令长度都是16位长,功能为 ARM 指令子集,代码尺寸更小,也就是解决存储非常即端的场景下的状态。

Jazelle 状态

用于加速 Java 字节码执行(执行 JVM Bytecode)使用 BXJ 指令进入 Jazelle 模式在某些 ARMv5 及其以后的处理器中支持

但是现在已经逐步的走向废弃了,这里就不再赘述了。

使用场景

ARM状态的使用场景:操作系统内核、启动阶段、计算密集型任务等

Thumb 状态的使用场景:代码存储空间极端受限的嵌入式系统

ARM -> Thumb:使用 BX 指令跳转到目标地址并设置 LSB(最低位)为 1

Thumb -> ARM:使用 BX 指令跳转到目标地址并设置 LSB(最低位)为 0

🌟 状态切换总结

来源状态跳转指令LSB(地址最低位)目标状态ARMBX0ARMARMBX1ThumbThumbBX0ARMThumbBX1Thumb任意BXJ特殊处理Jazelle🔹 ARM vs Thumb 对比

对比项ARM 指令Thumb 指令指令长度32 位16/32 位代码密度低高性能高略低功能支持全指令集子集应用场景内核、性能敏感小代码空间场景

🔹 如何判断当前状态?

可通过查看 CPSR(Current Program Status Register) 的 T 位(第 5 位):

T 位 = 0:ARM 状态T 位 = 1:Thumb 状态

ARM 寄存器总览(ARMv7-A 架构为例)

ARM(AArch32)共有 37 个物理寄存器,包括:

类型数量说明通用寄存器16R0 ~ R15(其中 R13 为 SP,R14 为 LR,R15 为 PC)程序状态寄存器2CPSR(Current Program Status Register)、SPSR(Saved PSR)模式私有寄存器19为不同模式(如 FIQ、IRQ、Supervisor)准备的 banked 寄存器

ARM 通用寄存器详解

名称功能说明R0-R12通用寄存器,参数传递、运算等R13SP(Stack Pointer)栈指针R14LR(Link Register)函数返回地址或中断返回R15PC(Program Counter)程序计数器

CPSR/SPSR 状态寄存器

提示:Saved Program Status Register是CPSR的备份,用于保存CPSR的状态,以便异常返回后恢复异常发生时的工作状态。,也就是说,他是异常发生的备份寄存器。所以下面我们直接看CPSR就好了。

🔹 CPSR(Current Program Status Register)

位名称含义[31]N负数标志[30]Z零标志[29]C进位标志[28]V溢出标志[7]IIRQ 中断屏蔽位[6]FFIQ 中断屏蔽位[5]T0 表示 ARM 状态,1 为 Thumb[4:0]M[4:0]模式位(User/SVC/IRQ 等)

Banked Registers(模式切换相关)

ARM 支持多种处理器模式,每种模式下部分寄存器会“换银行”(banked):

模式专用寄存器FIQ 模式R8_fiq ~ R14_fiq, SPSR_fiqIRQ 模式R13_irq, R14_irq, SPSR_irqSupervisor 模式R13_svc, R14_svc, SPSR_svcAbort 模式R13_abt, R14_abt, SPSR_abtUndefined 模式R13_und, R14_und, SPSR_undSystem/User 模式无私有寄存器(共用 R0-R14)

快问快答

ARM 有哪些寄存器?

ARM(AArch32)总共提供 37 个物理寄存器,包括 R0 到 R15 共 16 个通用寄存器、一个 CPSR 当前程序状态寄存器,以及 20 个模式相关的 banked 寄存器。R13 是栈指针 SP,R14 是链接寄存器 LR,R15 是程序计数器 PC,状态寄存器 CPSR 用于记录标志位、中断屏蔽位和处理器模式等信息。

CPSR 有什么作用?

CPSR 是 ARM 中的当前程序状态寄存器,用于保存运算结果标志位(如 N/Z/C/V),中断屏蔽控制(I/F 位),当前处理器状态(T 位)和运行模式(M[4:0])。其中 T=1 表示 Thumb 状态,T=0 表示 ARM 状态;M 位决定当前运行在 User、FIQ、IRQ、SVC 等模式中。

ARM 如何保存中断上下文?

在中断发生时,ARM 会自动将返回地址保存在 LR(链接寄存器)中,并将当前 CPSR 状态保存到 SPSR 寄存器中。由于不同中断模式(如 IRQ、FIQ)有独立的 LR 和 SPSR,因此上下文切换开销较小,利于中断嵌套与快速响应。

R13、R14、R15 的特殊用途?

R13是SP,也就是经典的栈指针,用于函数调用和中断处理的堆栈管理;R14 是 LR(链接寄存器),用于保存子程序返回地址或异常返回地址;R15 是 PC(程序计数器),用于控制程序的执行流。

ARM 中如何进行模式切换?不同模式下寄存器有什么区别?

模式切换由 CPSR 的 M[4:0] 位控制,不同模式具有独立的 banked 寄存器组,例如 FIQ 模式有 R8~R14 的私有副本,IRQ/SVC 等也有独立的 R13/R14 和 SPSR。这样可避免多模式下保存/恢复通用寄存器的额外开销,提高中断和异常处理效率。