文章目录
- A64指令编码格式
- 加载与存储指令
- 寻址模式
- 变基模式
- 前变基模式
- 后变基模式
- PC相对地址模式
- 伪指令
- 加载与存储指令的变种
- 不同位宽的加载与存储指令
- 多字节内存加载和存储指令
- 基地址偏移量模式
- 前变基模式
- 后变基模式
- 跳转指令
- 返回指令
- 比较并跳转指令
- 其它指令
- 内存独占访问指令
- 异常处理指令
- 内存屏障指令
- 相关参考
A64指令编码格式
A64指令集中每条指令的宽度为32位,其中第24〜28位用来识别指令的分类,格式如下:
op0字段的值如下:
加载与存储指令
寻址模式
在A64指令集中,加载和存储指令有多种寻址模式,如下:
寻址模式 | 格式 | 说明 |
---|---|---|
基地址模式 | [Xn] | |
基地址+偏移量模式 | [Xn, #offset] | |
前变基模式 | [Xn, #offset]! | 先更新偏移量地址,后访问内存地址 |
后变基模式 | [Xn], #offset | 先访问内存地址,再更新偏移量地址 |
PC相对地址模式 | <label> |
变基模式
变基模式主要有如下两种:
- 前变基(pre-index)模式:先更新偏移量地址,后访问内存地址;
- 后变基(post-index)模式:先访问内存地址,后更新偏移量地址。
前变基模式
前变基模式的指令格式如下:
LDR <Xt>, [<Xn|SP>, #<simm>]!
举例说明:
LDR x6, [x1, #8]! //将x1里面的地址增加偏移#8并赋给x1,最后将新的x1寄存器内的地址的值给x6寄存器
后变基模式
后变基模式的指令格式如下:
LDR <Xt>, [<Xn|SP>], #<simm>
举例说明:
LDR x6, [x1], #8 //将x1寄存器内的地址的值赋给x6寄存器,并将x1地址偏移+8。
PC相对地址模式
汇编代码里常常会使用标签(label)来标记代码片段。LDR指令还提供一种访问标签的地址模式,指令格式如下:
LDR <Xt>, <label>
伪指令
- 伪指令与指令的最大不同在于,伪指令属于编译器处理的范畴,伪指令会被编译展开为多条指令;指令是CPU处理的命令的最小单元。
LDR x7,=0x80000 //等同于 MOV x7, 0x80000
需要区别 LDR x7, 0x800000; 这条指令的意义是,将当前PC寄存器的地址的 + 0x80000的偏移,取出地址内容填充到x7寄存器中
加载与存储指令的变种
不同位宽的加载与存储指令
多字节内存加载和存储指令
A32指令集提供LDM和STM指令来实现多字节内存加载与存储,而A64指令集不再提供 LDM和STM指令,而提供LDP和STP指令。LDP和STP指令支持3种寻址模式。
基地址偏移量模式
- 基地址偏移量模式LDP指令的格式如下:
LDP <Xtl>, <Xt2>, [<Xn|SP>{,#<imm>}]
它以Xn/SP寄存器的值为基地址,然后读取Xn/SP寄存器的值+ imm地址的值到X/1寄存 器,读取Xw/SP寄存器的值+ imm+8地址的值到R2寄存器中。
- 基地址偏移模式STP指令的格式如下:
STP <Xtl>, <Xt2>, [<Xn|SP>{, #<imm>}]
它以Xn/SP寄存器的值为基地址,然后把XZ1寄存器的内容存储到[Xrt/SP + imm]处,把 Xt2寄存器的内容存储到[Xn/SP+inmi+8]处。
前变基模式
前变基模式LDP/STP指令的格式如下:
LDP <Xt1>, <Xt2>, [<Xn|SP>, #<imm>]!
STP <Xtl>, <Xt2>, [<Xn|SP>, #<imm>!
后变基模式
后变基模式LDP/STP指令的格式如下:
LDP <Xtl>, <Xt2>, [<Xn|SP>], #<imm>
STP <Xtl>, <Xt2>, [<Xn|SP>], #<imm>
跳转指令
返回指令
A64指令集提供了两条返回指令:
- RET指令:通常用于子函数的返回,其返回地址保存在LR寄存器中;
- ERET指令:从当前的异常模式返回。它会将SPSR的内容恢复到PSTATE寄存器中,从ELR中获取跳转地址并返回到该地址。ERET指令可以实现处理器模式的切换,比 如从ELI切换到EL0。
比较并跳转指令
其它指令
内存独占访问指令
异常处理指令
内存屏障指令
相关参考
- 《ARM64体系结构与编程》