ARM64汇编寻址、汇编指令、指令编码方式

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/

ARM64汇编寻址

1. 立即数寻址(Immediate Addressing)

这种方式直接将立即数作为操作数,适合小数据或常量。ARM64的立即数在指令中直接编码。

MOV X0, #10      ; 将常数10加载到寄存器X0中

2. 寄存器间接寻址(Register Indirect Addressing)

使用寄存器中的地址作为内存地址。适合基于寄存器值进行偏移的简单访问方式。

LDR X1, [X0]     ; 将地址X0指向的内存内容加载到X1中

3. 偏移寻址(Offset Addressing)

在基地址寄存器的基础上添加一个偏移量来确定目标地址,偏移量可以是立即数或寄存器值。

LDR X1, [X0, #8] ; 从地址X0 + 8的位置加载数据到X1中

4. 预索引寻址(Pre-indexed Addressing)

使用基地址加上偏移量来访问内存,访问完成后,将偏移量更新到基地址寄存器中。

LDR X1, [X0, #8]! ; 从地址X0 + 8加载数据到X1中,同时更新X0为X0 + 8

5. 后索引寻址(Post-indexed Addressing)

先使用基地址来访问内存,再将偏移量加到基地址寄存器中。这样偏移的效果在读取数据后才生效。

LDR X1, [X0], #8  ; 先从X0指向的地址加载数据到X1中,随后X0增加8

6. 寄存器偏移寻址(Register Offset Addressing)

偏移量用另一个寄存器指定,便于灵活的偏移操作,特别适合对数据结构的访问。

LDR X1, [X0, X2]  ; 从X0 + X2指向的内存地址加载数据到X1中

7. 带移位的寄存器偏移寻址(Scaled Register Offset Addressing)

将偏移寄存器的值进行左移,然后加到基地址中。这个方式常用于访问数组中的元素,因为它可以按数据大小自动调整偏移。

LDR X1, [X0, X2, LSL #3] ; 计算X0 + (X2 * 8)的地址,并从中加载数据到X1

LSL:逻辑左移,将寄存器的值向左移位指定的位数,右侧用 0 填充。

LSR:逻辑右移,将寄存器的值向右移位指定的位数,左侧用 0 填充。

ASR:算术右移,和逻辑右移类似,但左侧用符号位填充。即,如果值为负,左侧填充 1,如果为正,填充 0。

UXTX:执行零扩展,同时可以左移指定的位数。

SXTW/SXTX:执行符号扩展,并可以左移指定的位数。这些用于在 32 位和 64 位数据之间进行转换的场合,特别适合混合宽度数据操作。

ROR:循环右移,将寄存器的值向右旋转指定的位数,即右移的位会从左侧填入。

8. 栈寻址

使用栈指针 SP 作为基地址,加上偏移量来访问栈中的数据。例如,存储和加载局部变量

存储数据到栈

STP X29, X30, [SP, #0x70 + var_s0]  ; 将 X29 和 X30 的值存储到 SP 基址加 #0x70 + var_s0 偏移量的内存地址上

从栈加载数据

LDP X29, X30, [SP, #0x70 + var_s0]   ; 从 SP 基址加偏移 #0x70 + var_s0 处加载数据到 X29 和 X30

STP(Store Pair) 指令用于将两个寄存器的值存储到内存中(通常是栈上)。

LDP(Load Pair)指令用于从内存中同时加载两个寄存器的值。

指令中的寄存器类型决定了要读取或存储的数据大小。在上面的例子中,由于使用的是 64 位的 X 寄存器,每个寄存器占 8 字节(64 位),所以 STP 和 LDP 指令会操作两个 8 字节的数据。

MOV 和 LDR 指令的区别

MOV:用于寄存器和常量间的数据传递,不涉及内存访问。适合在不需要访问内存的情况下使用,如加载常数或在寄存器之间传递数据。

LDR:用于从内存中加载数据到寄存器,需要指定内存地址。支持多种寻址方式,例如偏移寻址、基地址寄存器加偏移等,非常适合访问内存中的数据,如全局变量、数组元素等。

两者主要区别在于是否需要访问内存。

ARM64汇编指令

ARM64 指令集具有固定长度(每条指令均为 32 位)。ARM64 包含 31 个通用寄存器(X0-X30),用于存储数据和地址;一个零寄存器(XZR),用于返回零值;以及专门的栈指针(SP)和程序计数器(PC)寄存器,用于管理函数调用和指令执行。

跳转指令:

  • B:无条件跳转到指定的地址。

  • BL:无条件跳转到指定地址并将返回地址存储在链接寄存器(LR)中,用于函数调用。

  • BR:跳转到寄存器中存储的地址。

  • CBZ/CBNZ:根据寄存器值是否为零进行跳转。

  • TBZ/TBNZ:根据寄存器中指定位的值(0或1)进行跳转。

数据处理指令:

  • MOV:将一个值或寄存器的内容传送到另一个寄存器中。

  • MVN:将寄存器值按位取反,并传送到目标寄存器。

  • AND/ORR/EOR:对寄存器数据进行按位与、或、异或运算。

  • LSL/LSR:逻辑左移或右移寄存器内容。

  • BIC:对寄存器值进行按位与取反运算,用于清除特定位。

算术指令:

  • ADD/ADDS:对两个寄存器内容相加,ADDS会更新条件标志。

  • SUB/SUBS:对两个寄存器内容相减,SUBS会更新条件标志。

  • MUL:对两个寄存器内容相乘。

  • UDIV/SDIV:无符号/有符号除法,将结果存储在目标寄存器中。

  • NEG:对寄存器中的值取反并加1,相当于求负。

内存访问指令:

  • LDR:从内存加载一个值到寄存器。

  • STR:将寄存器的值存储到内存中。

  • LDUR/STUR:使用偏移量从内存加载或存储数据,不会影响基址寄存器。

  • LDXR/STXR:用于原子操作的加载和存储指令,用于处理并发数据。

  • LDP/STP:从内存加载或存储两个连续的寄存器内容,常用于函数调用保存/恢复寄存器。

如何查看ARM官方文档

打开 ARM 官方网站 ,路径 Home / Documentation / Architectures / CPU Architecture 找到 ARM64 指令集文档
截图.png

可以在线查看,也可以点击左边的下载按钮下载 pdf 到本地
截图.png

ARM64指令编码方式

以 MOV(bitmask immediate) 指令为例,文档中搜索 MOV 可以找到该指令的编码格式说明。
image.png

MOV(bitmask immediate) 指令的 32 位二进制格式,其中各字段的含义如下:

  • sf(位 31):size flag,指定操作数的位宽。sf=0 表示 32 位操作,sf=1 表示 64 位操作。

  • opc(位 29-23):操作码字段,用于区分不同的操作类型。对于 MOV 指令,其操作码固定为 0110010。

  • N(位 22):与立即数编码相关,用于调整立即数的生成规则。

  • immr 和 imms(位 21-10):立即数字段,用于构造一个特定的位掩码。

  • Rn(位 9-5):源寄存器字段。在 MOV(bitmask immediate)中,该字段固定为 11111,表示使用零寄存器(WZR 或 XZR),以便执行立即数到寄存器的移动操作。

  • Rd(位 4-0):目标寄存器字段,指定立即数写入的目标寄存器编号。

以下面汇编指令为例

mov w0, #1

32 位指令编码中的各字段定义如下

字段说明
31sf设为 0,表示 32 位操作
30-29固定位固定为 01
28-23opc操作码,固定为 100100
22N设为 0
21-16immr000000,意味着掩码宽度为 1,即只生成一个 1,其他位全部为 0。
15-10imms000000,表示不进行任何旋转。
9-5Rn固定为 11111,表示使用零寄存器(XZR)
4-0Rd目标寄存器 X0 的编码为 00000

将以上字段组合,我们得到完整 32 位二进制编码如下


0 01 100100 0 000000 000000 11111 00000

十六进制值为 320003E0,转换为小端模式值为 E0030032
image.png

在 https://armconverter.com/?disasm 验证一下是否正确
image.png

相关文章:详解ARM64可执行程序的生成过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/9239.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

创建者模式之【建造者模式】

建造者模式 概述 将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况。由于实现了构建和…

什么是CANN和Ascend C

1 CANN是什么 异构计算架构CANN(Compute Architecture for Neural Networks)是华为针对AI场景推出的异构计算架构,向上支持多种AI框架,包括MindSpore、PyTorch、TensorFlow等,向下服务AI处理器与编程,发挥…

GenAI 用于客户支持 — 第 5 部分:可观察性

作者:来自 Elastic Andy James 本系列将带你深入了解我们如何在客户支持中使用生成式人工智能。加入我们,实时分享我们的历程,本篇文章重点介绍支持助理的可观察性。 本博客系列揭示了我们的现场工程团队如何使用 Elastic stack 和生成式 AI …

python安装selenium,geckodriver,chromedriver,Selenium IDE

安装浏览器 找到浏览器的版本号 chrome 版本 130.0.6723.92(正式版本) (64 位) firfox 116.0.3 (64 位),但是后面运行的时候又自动更新到了 127.0.0.8923 安装selenium > pip install selenium > pip show …

Docker部署SpringBoot项目(镜像部署)

目录 一、在pom.xml 文件中加入依赖 1.依赖内容 2.依赖说明和解释 3.使用流程 4.示例 5.注意 二、执行打包 1.使用命令打包 2.使用IDEA提供快捷方式 三、将jar包上传到服务器 四、创建相关配置 1.创建一个Dockerfile文件 2.添加配置 3.举例 五、生成Docker镜像 1.…

WPF+MVVM案例实战与特效(二十五)- 3D粒子波浪效果实现

文章目录 1、案例效果2、案例实现1、文件创建2. 功能代码实现3、粒子功能应用1、前端布局与样式2、代码解释2、 后端功能代码1、案例效果 2、案例实现 1、文件创建 打开 Wpf_Examples 项目、Models 文件夹下创建 3D粒子模型类 ParticleWaveEffectModel.cs 文件。在Tools 文件…

设计模式之建造者模式(各项装修物料组合套餐选配场景)

前言: 乱码七糟,我时常怀疑这个成语是来形容程序猿的! 无论承接什么样的需求,是不是身边总有那么几个人代码写的烂,但是却时常有测试小姐姐过来聊天(求改bug)、有产品小伙伴送吃的(求写需求)、有业务小妹妹陪着改代码(…

ffmpeg视频滤镜:组合两个视频为立体视频- framepack

视频描述 framepack 官方网址 > FFmpeg Filters Documentation 这个滤镜会将两个视频进行组合,有个前提是这两个视频的帧率、分别率必须一样。比如输入的是两个852x480 视频,输出可能是1704*480(左右拼接)、852*960&#xf…

【K8S问题系列 | 8】K8S集群资源突然爆满导致 Pod 状态变为 Pending 详细解决方案

在 Kubernetes 集群中,当 CPU 突然爆满时,Pod 可能无法获得所需的资源,从而导致其状态变为 Pending。以下是更详细的解决方案描述,有效应对这一问题。 解决方案 1: 扩展集群资源 描述 当集群资源不足以支撑当前的工作负载时&…

第18篇 :深入剖析systemverilog中 randomize 失败案例启示录(一)

经过前面章节的理论学习,我们对systemverilog中的随机约束,有一定的了解,那么,今天开始,着重讲述一些工作中遇到的困惑。主要通过一些例子,层层递进,举一反三,源于实践,剖…

mac端mumu模拟器adb识别不了问题

1.在终端中输入:system_profiler SPUSBDataType,把0x05e3 (Genesys Logic, Inc.)复制 2. 1.cd ~/.android/ 2.open . 3.找到.android/adb_usb.ini文件 将以上格式的Wendor ID放入该文件 3.依次执行 * adb devices* adb kill-server* adb start-server* adb disco…

Ubuntu版本、ROS版本与Python 版本之间的关系

引言 在机器人开发中,ROS(机器人操作系统)广泛应用于科研和工业领域,支持多个Ubuntu和Python版本。然而,随着不同Ubuntu LTS版本的发布以及Python逐渐从2.x向3.x过渡,ROS的版本选择和兼容性要求也在不断变化…

Linux - 信号

文章目录 一、信号的定义二、查看信号三、产生信号1、指令2、系统调用3、由软件条件产生信号4、异常5、键盘输入 四、保存信号1、补充:信号其他相关概念2、信号保存在哪,怎么保存?3、信号集操作函数 五、捕获信号1、概念2、捕获信号的时机3、…

PMP–知识卡片--项目干系人

项目干系人主要分为两类:参与项目的人和受项目影响的人。按照由近及远,从项目经理、项目团队等逐渐扩充至供应商、客户、监管机构等。 项目往往死在被忽略的干系人手上,作为项目经理,要尽可能地识别出来所有可能影响项目以及受项目…

MATLAB - ROS 2 分析器

系列文章目录 前言 本主题介绍如何连接 ROS 2 网络,分析网络图中所有元素的基本信息(如节点名称和节点之间的信息),以及可视化与 ROS 2 节点相关的参数(如主题、服务和操作)之间的交互。 一、连接并查看 RO…

分组校验在Spring中的应用详解

目录 前言1. 什么是分组校验2. 分组校验的基本原理3. 分组校验的实现步骤3.1 定义分组接口3.2 在校验项中指定分组3.3 校验时指定要校验的分组3.4 默认分组和分组的继承 4. 分组校验的优势和适用场景4.1 优势4.2 适用场景 5. 常见问题与解决方案5.1 校验未生效5.2 无法识别默认…

SDL打开YUV视频

文章目录 问题1:如何控制帧率?问题2:如何触发退出事件?问题3:如何实时调整视频窗口的大小问题4:YUV如何一次读取一帧的数据? 问题1:如何控制帧率? 单独用一个子线程给主线…

[MySQL]索引

索引介绍 索引是帮助数据库高效获取数据的数据结构。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。 假设我们有…

window 利用Putty免密登录远程服务器

1 在本地电脑用putty-gen生成密钥 参考1 参考2 2 服务器端操作 将公钥上传至Linux服务器。 复制上述公钥到服务器端的authorized_keys文件 mkdir ~/.ssh vi ~/.ssh/authorized_keys在vi编辑器中,按下ShiftInsert键或者右键选择粘贴,即可将剪贴板中的文…

【大数据技术基础 | 实验八】HBase实验:新建HBase表

文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤(一)启动HBase集群(二)编写项目java代码(三)将代码导出jar包 六、实验结果七、实验心得 一、实验目的 掌握HBase数据模型(逻…