arm v8汇编指令

来源:互联网 发布:樱井知香短发番号 编辑:程序博客网 时间:2024/05/16 16:57

A64指令 提供同A32和T32指令类似的功能, 也提供如下新功能

1)一个清晰的,固定长度的指令集: 指令是32位宽度, 寄存器字段(fields)是 在固定位置的 连续的位,  立即数 通常也是占用连续的位

2) 更多通用寄存器(r0-r30), 每个寄存器长度扩展为64位。  通用寄存器 编码在 5个位域

寄存器r31是一个特殊的寄存器:

Zero Register: 在大多数情况下,作为源寄存器使用时, r31读出来的值 是0; 作为目标寄存器使用时, 丢弃结果。   WZR(word zero rigiser)或者XZR(64位)

Stack Register: 当 用作load/store 的base register时, 或者 一些算术指令中, r31提供当前的stack pointer    WSP或者 SP

3) PC寄存器 不能直接读写。用来指明当前程序执行的位置

4)过程调用 链接寄存器(LR)  是 r30

异常处理 有个 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  Xd, lable

(Address Page)

符号扩展一个21位的offset,  向左移动12位

PC的值的低12位 清零, 然后  把 这两者相加, 结果写入到Xd寄存器

用来得到一块含有 lable的4KB对齐 内存区域的base地址 (也就是说lable所在的地址,一定落在这个4KB的内存区域里,  指令助记符里Page也就是这个意思), 可用来寻址 +/- 4GB的范围

ADR X

(Address)

将有符号的21位的偏移,加上PC, 结果写入到Xd寄存器

可用来计算 +/- 1MB范围的 任意字节粒度的有效地址

转自:http://zhiwei.li/text/2014/05/arm64-指令/

0 0