编程语言
首页 > 编程语言> > ARM Cortex-A系列编程指南之ARMv8 A -- 第六章 A64指令集

ARM Cortex-A系列编程指南之ARMv8 A -- 第六章 A64指令集

作者:互联网

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

6.5.2 系统寄存器的访问

标签:--,A64,ADD,指令,call,Cortex,branch,跳转,bit
来源: https://blog.csdn.net/sjwangjinbao/article/details/122290878