本文主要是介绍arm v8汇编指令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
A64指令 提供同A32和T32指令类似的功能, 也提供如下新功能
1)一个清晰的,固定长度的指令集: 指令是32位宽度, 寄存器字段(fields)是 在固定位置的 连续的位,
2) 更多通用寄存器(r0-r30), 每个寄存器长度扩展为64位。
寄存器r31是一个特殊的寄存器:
Zero Register: 在大多数情况下,作为源寄存器使用时, r31读出来的值 是0; 作为目标寄存器使用时, 丢弃结果。
Stack Register: 当 用作load/store 的base register时, 或者 一些算术指令中, r31提供当前的stack pointer
3) PC寄存器 不能直接读写。用来指明当前程序执行的位置
4)过程调用 链接寄存器(LR)
异常处理 有个 ELR系统寄存器
PC不是通用寄存器的一部分,不能通过寄存器号 来引用, 所以 不能作为 算术指令的源地址或者目标地址。
也不能作为 内存存取的 基础(base), 索引(index)或者传输(transfer)寄存器。
能够读取PC寄存器内容的 指令是 PC相对寻址 指令(ADR, ADRP, 常量加载, 直接跳转等指令)
跳转和链接指令,将PC保存到链接寄存器(BL和BLR)
能够修改PC的唯一的方式,使用 隐式的控制流指令(条件跳转,无条件跳转,异常生成,异常返回)
值得注意的是:PC 被这些指令 读出来时,其值 就是 该指令所在的地址,而不像 A32和T32中,要加上4或者8的偏移(历史上的原因,两级流水
向后两条指令,如果是16位长度的thumb指令, 那就是PC+4;32位长的arm指令,就是PC+8)
内存数据存取
A32和T32中的LDM,STM, PUSH和POP指令,在A64中并不存在
又有一对新的指令LDP和 STP 用来从内存中存取数据到寄存器。
地址生成
ADRP
(Address Page)
符号扩展一个21位的offset,
PC的值的低12位 清零, 然后
用来得到一块含有 lable的4KB对齐 内存区域的base地址 (也就是说lable所在的地址,一定落在这个4KB的内存区域里,
ADR X
(Address)
将有符号的21位的偏移,加上PC, 结果写入到Xd寄存器
可用来计算 +/- 1MB范围的 任意字节粒度的有效地址
转自:http://zhiwei.li/text/2014/05/arm64-指令/
这篇关于arm v8汇编指令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!