ARM的指令集和执行状态(如Thumb、Thumb-2、T32、A32、AArch32、A64、AArch64)在架构、用途和特性上有显著区别。以下是它们的详细对比:
1. 指令集与执行状态的分类
ARM架构的指令集和执行状态主要分为以下几类:
| 术语 |
架构版本 |
执行状态 |
指令集类型 |
位数 |
特点 |
| Thumb |
ARMv4T及更早 |
Thumb 模式 |
16位固定长度指令 |
32位 |
早期16位指令集,代码密度高,但功能有限(如无乘法指令)。 |
| Thumb-2 |
ARMv6T2及ARMv7-A |
Thumb 模式 |
混合16/32位指令 |
32位 |
引入32位指令,扩展功能,性能接近A32。 |
| T32 |
ARMv7-A及ARMv8-A |
AArch32 模式 |
混合16/32位指令 |
32位 |
等价于Thumb-2,用于32位执行状态(AArch32)。 |
| A32 |
ARMv7-A及ARMv8-A |
AArch32 模式 |
32位固定长度指令 |
32位 |
传统ARM指令集,功能丰富,性能高,但代码密度较低。 |
| AArch32 |
ARMv8-A |
AArch32 模式 |
A32/T32 指令集 |
32位 |
ARMv8中兼容32位指令的执行状态,支持ARMv7-A的所有功能。 |
| A64 |
ARMv8-A |
AArch64 模式 |
64位固定长度指令 |
64位 |
全新的64位指令集,专为高性能设计,不兼容32位指令。 |
| AArch64 |
ARMv8-A |
AArch64 模式 |
A64 指令集 |
64位 |
ARMv8中64位执行状态,仅支持A64指令集。 |
2. 关键区别
(1) 指令集类型与位数
| 指令集 |
位数 |
指令长度 |
功能特点 |
| Thumb |
32位 |
16位固定长度 |
早期16位指令,代码密度高,但功能受限(如无乘法、复杂运算)。 |
| Thumb-2 |
32位 |
混合16/32位 |
在Thumb基础上引入32位指令,功能接近A32,兼顾代码密度和性能。 |
| T32 |
32位 |
混合16/32位 |
等价于Thumb-2,专为32位执行状态(AArch32)设计。 |
| A32 |
32位 |
32位固定长度 |
传统ARM指令集,功能全面,支持复杂运算和浮点操作,但代码密度较低。 |
| A64 |
64位 |
32位固定长度 |
64位指令集,专为高性能设计,不兼容32位指令,支持更多寄存器和扩展功能。 |
(2) 执行状态(Execution State)
ARMv8-A引入了两种执行状态:
- AArch32:兼容32位指令,支持A32(32位ARM指令)和T32(Thumb-2指令)。
- AArch64:64位执行状态,仅支持A64(64位ARM指令),不兼容32位指令。
(3) 寄存器与性能
| 执行状态 |
通用寄存器数量 |
寄存器宽度 |
性能特点 |
| AArch32 |
16个(R0-R15) |
32位 |
兼容ARMv7-A,支持32位运算,适合传统应用。 |
| AArch64 |
31个(X0-X30) |
64位 |
更多寄存器,支持64位运算,性能更高,适合现代高性能场景。 |
(4) 兼容性
- AArch32:完全兼容ARMv7-A的A32/T32指令,适合需要32位兼容的场景(如Cortex-A32)。
- AArch64:全新64位指令集,不兼容32位指令,但可通过软件模拟运行32位程序(如Linux兼容层)。
3. 应用场景对比
| 指令集/执行状态 |
典型应用场景 |
| Thumb |
早期嵌入式设备(如ARM7系列),代码密度要求高,但性能需求较低。 |
| Thumb-2 (T32) |
ARMv7-A/M系列处理器(如Cortex-M3/M4),兼顾代码密度和性能。 |
| A32 |
高性能32位应用(如ARM9/11系列),需复杂运算和浮点支持。 |
| AArch32 |
ARMv8-A处理器(如Cortex-A32),需要32位兼容的嵌入式或实时系统。 |
| A64 (AArch64) |
现代高性能设备(如智能手机、服务器),需要64位计算能力(如Cortex-A53/A72)。 |
4. 示例代码对比
(1) A32(32位ARM指令)
ADD R0, R1, R2 ; R0 = R1 + R2
(2) T32(Thumb-2指令)
ADD R0, R1, R2 ; R0 = R1 + R2(与A32功能相同,但指令长度可能为16位)
(3) A64(64位指令)
ADD X0, X1, X2 ; X0 = X1 + X2(64位寄存器)
5. 总结
| 特性 |
Thumb |
Thumb-2/T32 |
A32 |
AArch32 |
A64/AArch64 |
| 指令长度 |
16位固定 |
混合16/32位 |
32位固定 |
32位固定/T32 |
32位固定 |
| 代码密度 |
高 |
中 |
低 |
中 |
低 |
| 性能 |
低 |
中 |
高 |
高 |
最高 |
| 寄存器数量 |
16 |
16 |
16 |
16 |
31 |
| 64位支持 |
否 |
否 |
否 |
否 |
是 |
| 适用场景 |
早期嵌入式 |
嵌入式/移动设备 |
高性能32位应用 |
32位兼容场景 |
现代高性能设备 |
6. 选择建议
- 低功耗嵌入式设备(如传感器、IoT):Thumb-2(T32),兼顾代码密度和性能。
- 高性能32位应用(如RTOS、工业控制):A32,支持复杂运算。
- 需要64位性能的场景(如智能手机、服务器):A64(AArch64)。
- 需要32位兼容的ARMv8设备(如Cortex-A32):AArch32。