Thumb 汇编指令集
- 作为 ARM 指令集的一个子集,针对代码密度问题提出,具有 16 位的指令宽度
- 与 ARM 指令的 32 位宽度相比,Thumb 指令集在保留 32 位宽度优势的同时大大节省了系统的存储空间
- Thumb 不是一个完整的体系结构,包含的指令集十分有限,常与 ARM 指令搭配使用
- 第一代 Thumb 指令集更新到 ARMv6T2 后,引入了第二代 Thumb 指令集,使用与 ARM 指令相同的 32 位指令,不仅性能与 32 位 ARM 指令相当,还保留了第一代指令的简洁特性
- Thumb 指令和 ARM 指令除了长度不同,寄存器的使用也不同。Thumb 指令集中,R11 ~ R15 寄存器使用 FP、IP、SP、LR、PC 等命名,新的命名方式直接在名称上体现了寄存器的用途,使用上也有限制和差异(相较 ARM 指令)
- 第一代 Thumb 指令的宽度只有 16 位,在地址读取范围上比 ARM 指令小很多,在进行一些大范围的指令跳转操作时只能切换到 ARM 模式,执行 ARM 指令
16 位 Thumb 指令编码
- 16 位的 Thumb 指令称第一代 Thumb 指令
- 格式:
- 可看到,第一代 Thumb 指令设计十分简洁,只用了一个
bits[15:10]
的 Opcode 域来确定指令及其分类 - 第一代 Thumb 指令的所有指令及分类方法(Opcode 域中的 x 表示取值可为 0 或 1):
Opcode | 指令或指令类别 |
---|---|
00xxxx | 移位、加、减、移动与比较指令 |
010000 | 数据处理指令 |
010001 | 特殊数据指令,分支与交换指令 |
01001x | 常量池加载指令,LDR 指令 |
0101xx | 加载/存储单个数据指令 |
011xxx | 加载/存储单个数据指令 |
100xxx | 加载/存储单个数据指令 |
10100x | 相对于 PC 寄存器的加法指令,ADR 指令 |
10101x | 相对于 SP 寄存器的加法指令,ADD 指令 |
1011xx | 杂项指令 |
11000x | 多寄存器存储指令,STM、STMIA、STMEA 指令 |
11001x | 多寄存器加载指令,LDM、LDMIA、LDMFD 指令 |
1101xx | 条件分支与中断指令 |
11100x | 无条件分支指令,B 指令 |
- 在用 Android NDK 编译代码时,若想默认生成 Thumb 指令而非 ARM 指令&