多数写应用程序的开发者不需要写汇编程序,但是当需要高度优化的代码的时候,汇编代码就变得很有用。这种情况包括写编译器代码,或者需要实现低层级特性但是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 lanes
6.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来恢复处理器状态。