当前位置: 首页 > news >正文

浅析ARMv8体系结构:A64指令集

文章目录

    • 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体系结构与编程》
http://www.lryc.cn/news/276822.html

相关文章:

  • VSCode安装GitHub Copilot插件方法
  • 实战:使用docker容器化服务
  • 借用GitHub将typora图片文件快速上传CSDN
  • 外包公司干了2个月,技术退步明显了.......
  • PTA✨C语言 组合数的和
  • 这些开源自动化测试框架,会用等于白嫖一个w
  • 代码随想录第三十六天——无重叠区间,划分字母区间,合并区间
  • Python数据分析:入门到实践
  • 第7章-第9节-Java中的Stream流(链式调用)
  • 创建一个矩形中有两个三角形
  • Open3D 基于kdtree树的邻近点搜索(10)
  • c++实现支持动态扩容的栈(stack)
  • 举例说明计算机视觉(CV)技术的优势和挑战。
  • 如何利用docker来部署war包项目
  • SpringBoot 如何增强PageHelper入参的健壮性
  • 书生·浦语大模型全链路开源体系 学习笔记 第三课
  • CodeGPT,你的智能编码助手—CSDN出品
  • VMware Workstation——修改虚拟机配置和设置网络
  • 计算机毕业设计 基于SpringBoot的项目申报系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • CentOS 7.8 安装 Docker
  • Flask 会员列表展示
  • 光纤知识总结
  • LeetCode简单题记录
  • 【Python学习】Python学习10-列表
  • MySQL四大引擎,数据库管理,数据表管理,数据库账号管理
  • CentOS找回root密码
  • react输入框检索树形(tree)结构
  • 云原生学习系列之基础环境准备(虚拟机搭建)
  • Python入门知识点分享——(十三)内置函数
  • 手拉手springboot3整合mybatis-plus多数据源