ARM64汇编06 - 基本整型运算指令

ADD (immediate)

将 Xn 与 imm 相加,结果赋值给 Xd,imm 是无符号数,范围为 0 - 4095。

shift 是对 imm 进行移位,shift 为 0 的时候,表示左移 0 位,即不变。shift 为 1 的时候,表示左移12 位:

由于 imm 有效位只有 12 位,所以无法表示 0x1234 之类的数,但是可以表示 0x123。且有左移操作,所以也可以表示 0x123000 之类的数。

那么,add指令的立即数,可以描述负数么,也是可以的,但是就有点奇怪了,这本是减法指令做的事情:

可以看到,与整数指令相比,只是  op 位发生了变化:

00 8c 04 91
00 8c 04 d1

9 -> 1001
d -> 1101

所以,我们也可以猜测, sub 指令与 add 的指令的区别只在  op 位:

这样,我们只需要学习 add 指令,sub指令是对应的。

ADD (shifted register)

将 Xn 与 Xm 相加,结果放到 Xd 里面。

shift 是移位的方式:

移动的位数由 imm6 决定。

例子一:

00 00 01 8B                   ADD             X0, X0, X1

汇编指令展开:

8B 01 00 00 ->
10001011 00000001 00000000 00000000 ->
1 0 0 01011 00 0 00001 000000 00000 00000

Xd 是 0, Xm 是1 ,Xn 是0,shift 是 0,imm6 是 0。

例子二:

20 FC 02 8B                   ADD             X0, X1, X2,LSL#63

这个指令表示在相加前,需要将 X2 的值逻辑左移63 位。 imm6 是 6 位,刚刚好表示 0 ~ 63 的移位。

汇编指令展开:

8B 02 FC 20 ->
10001011 00000010 11111100 00100000 ->
1 0 0 01011 00 0 00010 111111 00001 00000

Xd 是 0,Xn 是 1,Xm 是 2,shift 是 0,imm6 是 0x3F(63)。

ADD (extended register)

这个指令稍微要复杂一点,它根据 option 的类型,来决定如何对 Xm 寄存器做扩展。

option 有8种取值类型,每种都有不同的意思,有遇到可去查资料了解。

举个简单的例子:

add w0, w1, w2,sxtw#2

SXTW/SXTH/SXTB:Sign-extend single-word / half-word / byte。

将 w2 寄存器按”单字“做符号位扩展。后面的 #2,只有在 LSL 模式下才有用,所以可以忽略,猜测一般编译器不会生成这种指令,应该会是  add w0, w1, w2,sxtw 这样的。

ADD还有加S的指令,表示会影响标志位,就不介绍了。

ADR

adr指令根据PC的偏移地址计算目标地址。偏移地址是一个21位(immhi:immlo)的有符号数,加上当前的PC地址得到目标地址。adr可以获取当前PC地址±1MB范围内的地址。

看一个例子,ADR X0, 4 生成汇编指令如下:

.text:0000000000000878 20 00 00 10                   ADR             X0, loc_87C             ; Keypatch modified this from:
.text:0000000000000878                                                                       ;   MOV W1, W19
.text:0000000000000878
.text:000000000000087C
.text:000000000000087C                               loc_87C                                 ; DATA XREF: main+44↑o
.text:000000000000087C E2 03 14 2A                   MOV             W2, W20

ADR 就是将标号 loc_87C 的地址赋值给 X0 寄存器。

在 IDA 中,我们可能会经常看到一个伪指令:

00 00 00 90 00 60 23 91       ADRL            X0, aADBD

该指令用于获取基于PC相对偏移+/- 4 GB内的符号地址,毕竟有时候可能 1M 不够用。

ADRP

ADRP 在 plt 表中会经常看到。

.plt:0000000000000760                               ; int rand(void)
.plt:0000000000000760                               .rand                                   ; CODE XREF: main+2C↓p
.plt:0000000000000760 10 00 00 B0                   ADRP            X16, #rand_ptr@PAGE
.plt:0000000000000764 11 DA 47 F9                   LDR             X17, [X16,#rand_ptr@PAGEOFF]
.plt:0000000000000768 10 C2 3E 91                   ADD             X16, X16, #rand_ptr@PAGEOFF
.plt:000000000000076C 20 02 1F D6                   BR              X17

首先adrp将一个21位有符号立即数左移12位,得到一个33位的有符号数(最高位为符号位),接着将PC地址的低12位清零,这样就得到了当前PC地址所在页的地址,然后将当前PC地址所在页的地址加上33位的有符号数,就得到了目标页地址,最后将目标页地址写入通用寄存器。

在 ida 中,就是将 rand_ptr@PAGE 的值赋值给 X16,rand_ptr@PAGE 的值已经做过地址对齐了。

SUB 系列

这个与ADD是一样的,就一个 op 位不一样。

SUB 也有 S 后缀,而且带 S 后缀的话,就等同于 CMP 指令。

AND

按位与,将第二个操作数与立即数按位与的结果放到第一个操作数里面。

说起来很简单,但是实际上它支持的 mask 是有限的,而生成 mask 的规则相当的难懂。

立即数的描述由3部分构成。

有篇文章,有兴趣的去研究:

https://dinfuehr.github.io/blog/encoding-of-immediate-values-on-aarch64/

AND 也可以加 S 后缀,等同于 TST 指令。

BIC (shifted register)

格式:

BIC <Xd>, <Xn>, <Xm>{, <shift> #<amount>}

BIC 其实与 AND 的作用是一样的,只不过,它会将 Xm 的值按位取反,取反后再与 Xn 做 and 操作,将结果放到 Xd 中。

那为啥有了 and 指令,还需要 bic 指令呢?是因为 and 指令支持的 mask 有限,所以 bic 相当于是一个扩展。

BIC 也支持 S 后缀。

ORR

与AND差不多,不过是按位或。

EOR

与AND差不多,异或。

移位指令

LSL:逻辑左移

40 00 41 D3                   LSL             X0, X2, #0x3F

11010011 01000001 00000000 01000000 ->
1 10 100110 1 000001 000000 00010 00000

注意,imms 不用关心,LSL是UBFM 指令的一种特殊形式,UBFM会用到imms。

在例子中,immr 的值算出来是 1,是因为最终计算的时候还需要使用#(-<shift> MOD 64) 这个表达式来计算,所以算出来的值是 63。

LSR:逻辑右移

ASR:算数右移

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【漏洞复现】大华智慧园区综合管理平台SQL注入漏洞

Nx01 产品简介 大华智慧园区综合管理平台是一款综合管理平台&#xff0c;具备园区运营、资源调配和智能服务等功能。该平台旨在协助优化园区资源分配&#xff0c;满足多元化的管理需求&#xff0c;同时通过提供智能服务&#xff0c;增强使用体验。 Nx02 漏洞描述 大华智慧园区…

pytest生成allure的报告

首先要下载安装配置allure allure serve ./outputs/allure_report 可以生成html的文件自动在默认浏览器中打开

期货开户市场的风险在哪里?

期货市场的风险在哪里&#xff1f;强平和穿仓是什么&#xff1f; 期货市场是一个自带杠杆的市场&#xff0c;简单理解就是我们只需要用10W就能买到价值100万的商品。期货主要的风险来源于仓位风险和交割风险&#xff0c;仓位风险就是我们是采用满仓还是轻仓方式交易。比如我们…

Linux内核之module_param_named宏代码实例(二十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

微信小程序开发系列(二十九)·界面交互API·loading 提示框、showModal模态对话框、showToast消息提示框

目录 1. loading 提示框 1. 1 wx.showLoading()显示loading提示框 1.2 wx.hideLoading()关闭 loading 提示框 2. showModal 模态对话框 3. showToast 消息提示框 小程序提供了一些用于界面交互的 API&#xff0c;例如&#xff1a;loading 提示框、消息提示框、模态对…

数据库管理-第160期 Oracle Vector DB AI-11(20240312)

数据库管理160期 2024-03-12 数据库管理-第160期 Oracle Vector DB & AI-11&#xff08;20240312&#xff09;1 向量的函数操作to_vector()将vector转换为标准值vector_norm()vector_dimension_count()vector_dimension_format() 2 将向量转换为字符串或CLOBvector_seriali…

ChatGPT发了消息没有反应,并且搜索框变空是怎么回事?怎样解决?

最近许多用户反映使用ChatGPT时发了消息没有反应&#xff0c;并且搜索框变空了导致无法使用&#xff0c;接下来闪电发卡就分析一下是什么原因。 根本原因&#xff1a;是因为官方前端更新&#xff0c;后端接口部分报错&#xff0c;老用户使用Alpha测试中文语言导致。 解决方法&a…

【数据挖掘】实验1:R入门(内含详细R和RStudio安装教程)

实验1&#xff1a;R入门 一&#xff1a;实验目的与要求 1&#xff1a;根据上课PPT内容&#xff0c;掌握课堂知识并进行代码练习操作&#xff0c;提供练习过程和结果。 2&#xff1a;可COPY代码运行结果直接提交&#xff0c;如涉及到输出图等可截图。 二&#xff1a;实验内容 …

自建GitLab代码仓库ssh访问地址为localhost修改成域名

ssh改localhost为域名 抛出问题配置过程效果展示 抛出问题 自建的GitLab&#xff0c;代码仓库ssh访问地址为localhost&#xff0c;http地址显示域名没问题&#xff0c;就很奇怪。 找了很久帖子发现这个访问地址不在/etc/gitlab/gitlab.rb的系统配置中。 还有个帖子让改/etc/gi…

游戏开发中的坑之十三 Lut贴图相关问题

1.网上下载的或者游戏截帧得到的Lut贴图贴上之后可能效果如下&#xff0c;需要在PS里垂直方向反转一下贴图。 2.相关设置&#xff1a; &#xff08;1&#xff09;取消勾选sRGB&#xff1b; &#xff08;2&#xff09;像素为1024x32或者512x16&#xff1b; &#xff08;3&#…

学习笔记-华为IPD转型2020:2,IPD的核心思想

2&#xff0c;IPD的核心思想 以客户为导向&#xff1a;应该开发什么产品&#xff1f; 应该开发哪些产品&#xff1f;华为的“基本法”规定&#xff0c;其目的是为客户服务&#xff08;Huawei&#xff0c;1998&#xff09;。然而&#xff0c;在IPD实施后&#xff0c;对这种以客…

微信小程序开发系列(三十)·小程序本地存储API·同步和异步的区别

目录 1. 同步API 1.1 getStorageSync存储API 1.2 removeStorageSync获取数据API 1.3 removeStorageSync删除 1.4 clearStorageSync清空 2. 异步API 2.1 setStorage存储API 2.2 getStorage获取数据API 2.3 removeStorage删除API 2.4 clearStorage清空 3. …

YOLOv8改进 | 图像去雾 | 利用图像去雾网络AOD-PONO-Net网络增改进图像物体检测

一、本文介绍 本文给大家带来的改进机制是利用AODNet图像去雾网络结合PONO机制实现二次增强&#xff0c;我将该网络结合YOLOv8针对图像进行去雾检测&#xff08;也适用于一些模糊场景&#xff0c;图片不清晰的检测&#xff09;&#xff0c;同时本文的内容不影响其它的模块改进…

网康科技 NS-ASG 应用安全网关 SQL注入漏洞复现(CVE-2024-2330)

0x01 产品简介 网康科技的NS-ASG应用安全网关是一款软硬件一体化的产品,集成了SSL和IPSec,旨在保障业务访问的安全性,适配所有移动终端,提供多种链路均衡和选择技术,支持多种认证方式灵活组合,以及内置短信认证、LDAP令牌、USB KEY等多达13种认证方式。 0x02 漏洞概述 …

Redis底层数据结构之String

文章目录 1. 前提回顾2. RedisObject三大数据类型简介3. SDS字符串4. SDS字符串源码分析5. 总结 1. 前提回顾 前面我们说到redis的String数据结构在底层有多种编码方式。例如我们执行下面两条语句 set k1 v1 set age 17我们查看类型&#xff0c;发现这类型都是String类型 我们…

【力扣精选算法100道】——二进制求和

LCR 002. 二进制求和 - 力扣&#xff08;LeetCode&#xff09; 目录 &#x1f388;了解题意 &#x1f388;算法分析 &#x1f6a9;cur1>0 &#x1f6a9;cur2>0 &#x1f6a9;t &#x1f388;实现代码 &#x1f388;了解题意 遵循二进制加法法则&#xff0c;如果俩…

工具篇--分布式定时任务springBoot 整合 elasticjob使用(3)

文章目录 前言一、Springboot 整合&#xff1a;1.1 引入jar&#xff1a;1.2 配置zookeeper 注册中心&#xff1a;1.3 定义job 业务类&#xff1a;1.4 job 注册到zookeeper&#xff1a;1.5 项目启动&#xff1a;1.5.1 zookeeper 注册中心实例&#xff1a;1.5.2 任务执行日志输出…

【数据挖掘】练习1:R入门

课后作业1&#xff1a;R入门 一&#xff1a;习题内容 1.要与R交互必须安装Rstudio&#xff0c;这种说法对不对&#xff1f; 不对。虽然RStudio是一个流行的R交互集成开发环境&#xff0c;但并不是与R交互的唯一方式。 与R交互可以采用以下几种方法&#xff1a; 使用R Conso…

AHU 汇编 实验六

一、实验名称&#xff1a;实验6 输入一个16进制数&#xff0c;把它转换为10进制数输出 实验目的&#xff1a; 培养汇编中设计子程序的能力 实验过程&#xff1a; 源代码&#xff1a; data segmentbuff1 db Please input a number(H):$buff2 db 30,?,30 dup(?),13,10buff3 …

社交革命的引领者:探索Facebook如何改变我们的生活方式

1.数字社交的兴起 随着互联网的普及&#xff0c;社交媒体成为我们日常生活的重要组成部分。Facebook作为其中的先驱&#xff0c;从最初的社交网络演变成了一个拥有数十亿用户的全球化平台。它不仅改变了我们与世界互动的方式&#xff0c;还深刻影响了我们的社交习惯、人际关系以…