多数写应用程序的开发者不需要写汇编程序,但是当需要高度优化的代码的时候,汇编代码就变得很有用。这种情况包括写编译器代码,或者需要实现低层级特性但是C语言中又没有;启动代码、设备驱动、或者开发操作系统时也需要。会阅读汇编代码,也会对调试C语言时有帮助,特别是了解C语言和这些指令直接的映射关系。
6.1 指令助记符
A64的汇编语言重载实现了指令助记符,并根据操作数寄存器的名字来进行区分。比如ADD指令,有不同的参数,我们只需要记住ADD这个指令,汇编器会自动根据参数(操作数)来选择正确的调用:
ADD W0, W1, W2 // add 32-bit registers ADD X0, X1, X2 // add 64-bit registers ADD X0, X1, W2, SXTW // add sign extended 32-bit register to 64-bit extended register ADD X0, X1, #42 // add immediate to 64-bit register ADD V0.8H, V1.8H, V2.8H // NEON 16-bit add, in each of 8 lanes6.2 数据处理指令
6.3 内存访问指令
6.4 流控制
1)相对跳转
对于简单的相对跳转,可以用B指令。
无条件的简单相对跳转,可以从当前程序计数器的位置前后跳转128MB。
有条件的简单相对跳转(B后面跟了条件),这个值是正负1MB。
如果调用子调用,可以使用BL,它会保存返回地址到连接寄存器X30。BL没有条件跳转。
2)绝对跳转
BR是绝对跳转指令,会直接跳转到对应的地址。
BLR会保证返回地址到连接寄存器X30。
RET会默认返回到X30里的地址,当然也可以指定具体地址(这样就和BR类似了)。
跳转指令 | |
B (offset) | Program relative branch forward or back 128MB. A conditional version, for example B.EQ, has a 1MB range. |
BL (offset) | As B but store the return address in X30, and hint to branch prediction logic that this is a function call. |
BR Xn | Absolute branch to address in Xn. |
BLR Xn | As BR but store the return address in X30, and hint to branch prediction logic that this is a function call. |
RET{Xn} | As BR, but hint to branch prediction logic that this is a function return. Returns to the address in X30 by default, but a different register can be specified. |
条件跳转指令 | |
CBZ Rt, label | Compare and branch if zero. If Rt is zero, branch forward or back up to 1MB. |
CBNZ Rt, label | Compare and branch if non-zero. If Rt is not zero, branch forward or back up to 1MB. |
TBNZ Rt, bit, label | Test and branch if zero. Branch forward or back up to 32kB. |
TBNZ Rt, bit, label | Test and branch if non-zero. Branch forward or back up to 32kB. |
6.5 系统控制和其他指令
6.5.1 异常处理指令
有三个异常处理指令,他们会导致异常发生,从而进入更高的异常等级。
SVC #imm16 | Supervisor call, allows application program to call the kernel (EL1). |
HVC #imm16 | Hypervisor call, allows OS code to call hypervisor (EL2). |
SMC #imm16 | Secure Monitor call, allows OS or hypervisor to call Secure Monitor (EL3). |
从异常返回的话,用ERET指令。这个指令通过拷贝SPSR_ELn到PSTATE,并跳转到保存的返回地址ELR_ELn来恢复处理器状态。