您的位置:首页 > 其它

arm64-v8a汇编指令

2017-05-02 23:25 267 查看
转自:http://blog.sina.com.cn/s/blog_936739790102v6ny.html

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-指令/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: