AArch64 汇编指令集
- arm64-v8a 对应两套架构的指令集
- AArch32(简称“A32”)的 ARM、Thumb、Thumb-2 指令集
- AArch64(简称“A64”)的 64 位指令集
AArch64 指令编码
- AArch64 指令根据指令不同的位域分布将指令集分成了编码组(Encoding Group),在每个编码组下细分指令所属的类别:
28 | 27 | 26 | 25 | 24 | 编码组 |
---|---|---|---|---|---|
0 | 0 | - | - | - | 不可预料 |
1 | 0 | 0 | - | - | 数据处理(立即数)指令 |
1 | 0 | 1 | - | - | 分支、异常生成与系统指令 |
- | 1 | - | 0 | - | 加载与存储指令 |
- | 1 | 0 | 1 | - | 数据处理(寄存器)指令 |
0 | 1 | 1 | 1 | - | 数据处理 SIMD 与浮点指令 |
1 | 1 | 1 | 1 | - | 数据处理 SIMD 与浮点指令 |
- 可看出,只有
bits[28:24]
这五个位会影响指令的编码组,最后的 0b0111 与 0b1111 同属 SIMD 与浮点指令编码组 - AArch64 虽属 64 位指令系统,但指令长度仍为 32 位。AArch64 与 AArch32 最大的不同体现在寄存器的使用上。如,AArch32 中,将 R1 寄存器的值传入 R0 寄存器,对应的指令为
MOV R0, R1
;而在 AArch64 中,对应的指令有 32 位的MOV W0, W1
和 64 位的MOV X0, X1
。用 32 位还是 64 位的寄存器,主要根据指令最高位bit[31]
的 sf 域的值是否为 1 决定,若为 1,使用 64 位寄存器;否则使用 32 位寄存器。通常在具体指令的伪代码描述部分会有如下一行,用来说明寄存器使用位数的判断方法: