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

news2024/11/25 12:51:50

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:算数右移

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

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

相关文章

Django 学习笔记(Day1)

「写在前面」 本文为千锋教育 Django 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。 目录 0 课程介绍 1 Django 快速入门 1.1 Django 介绍 1.2 Django 安装 1.3 创建 Django 项目 1.4 运行 Django 项目 1.5 数据迁…

使用 Ruby 或 Python 在文件中查找

对于经常使用爬虫的我来说&#xff0c;在大多数文本编辑器都会有“在文件中查找”功能&#xff0c;主要是方便快捷的查找自己说需要的内容&#xff0c;那我有咩有可能用Ruby 或 Python实现类似的查找功能&#xff1f;这些功能又能怎么实现&#xff1f; 问题背景 许多流行的文本…

vite 安装tailwindcss失效

需求&#xff1a;在vite5 vue3 ts中安装tailwindcss 问题&#xff1a;按照tailwindcss的官方文档进行安装&#xff0c;可是一直不生效 解决方式&#xff1a; 在mian.ts 里面导出 style.css 文件 就可以了哈

【HomeAssistant新版文件管理器】

【HomeAssistant新版文件管理器】 1. 前言2. 地址3. 安装4. 使用方法5. 总结欢迎大家阅读2345VOR的博客【Home Assistant 之QQ邮箱推送提醒】🥳🥳🥳2345VOR鹏鹏主页: 已获得CSDN《嵌入式领域优质创作者》称号🎉🎉、阿里云《arduino专家博主》👻👻👻,座右铭:…

基于Springboot的预报名管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的预报名管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&a…

从根到叶:深入了解Map和Set

窗间映出一片高远的天空&#xff0c; 向晚的天际宁静而又清明。 我孤独的心灵在幸福地哭泣&#xff0c; 它在为天空如此美好而高兴。 恬静的晚霞一片火红&#xff0c; 晚霞灼烧着我的热情。 此刻的世界没有别人&#xff0c; 只有上帝&#xff0c;我和天空。 ——&#x…

【vivado】 clock wizard 时钟IP

一、前言 MMCM和PLL是在FPGA设计中不可避免需要使用到的时钟资源&#xff0c;对于其功能及使用方法的理解是正确进行FPGA设计的前提。 二、Xilinx 时钟 IP配置 vivado中使用时钟向导(Clocking Wizard)配置时钟IP核&#xff0c;其框图如下&#xff1a; clk_in 输入时钟&#…

Grafana

介绍 官网&#xff1a;https://grafana.com/ Grafana 是一个开源的指标分析和可视化工具&#xff0c;它被广泛用于展示和监控云基础设施和应用程序的实时数据。Grafana 提供了一个强大且易于使用的界面&#xff0c;允许用户创建各种图表、图形和仪表盘&#xff0c;以直观地展…

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

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

Web3:数字身份与隐私保护的新篇章

1. 数字身份验证的革新 在传统互联网上&#xff0c;个人的数字身份通常由中心化的身份验证机构控制&#xff0c;存在安全性和隐私保护的风险。而在Web3中&#xff0c;基于区块链技术的去中心化身份验证方案正在兴起。通过使用分布式账本和加密技术&#xff0c;Web3可以提供更安…

122. 买卖股票的最佳时机 II(力扣LeetCode)

文章目录 122. 买卖股票的最佳时机 II题目描述贪心 122. 买卖股票的最佳时机 II 题目描述 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。…

力扣题目汇总分析 利用单调栈解决问题

496 下一个更大元素 I 问题 nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。给你两个 没有重复元素 的数组 nums1 和 nums2 &#xff0c;下标从 0 开始计数&#xff0c;其中nums1 是 nums2 的子集。为nums1中每个数字 x找到下一…

nvm 的安装与管理 node.js

文章目录 下载 nvm使用 nvm 下载与管理 node.jsnpm 切换镜像源使用 cnpm使用 yarn 下载 nvm NVM是Node.js的版本管理工具&#xff0c;它允许你轻松地在同一台机器上安装和切换不同版本的Node.js。使用NVM&#xff0c;你可以在不同的项目中使用不同的Node.js版本&#xff0c;而…

按键+串口发送实验

摸鱼记录 Day_15 &#xff5e;(&#xffe3;▽&#xffe3;&#xff5e;)(&#xff5e;&#xffe3;▽&#xffe3;)&#xff5e; review 前边已经学习了&#xff1a; 串口发送Vivado 串口通信(UART)------串口发送-CSDN博客 按键基于状态机的按键消抖实现-CSDN博客 1. …

WanAndroid(鸿蒙版)开发的第二篇

前言 DevEco Studio版本&#xff1a;4.0.0.600 WanAndroid的API链接&#xff1a;玩Android 开放API-玩Android - wanandroid.com 1、WanAndroid(鸿蒙版)开发的第一篇 其他一些参考点&#xff0c;请参考上面的WanAndroid开发第一篇 效果 首页实现 整体布局分为头部的Banne…

ARM学习(25)链接装载高阶认识

ARM学习&#xff08;25&#xff09;链接装载高阶认识 1、例子引出 笔者先引入几个编译链接的例子来介绍一下&#xff1a; 声明无效&#xff1a;declared implicitly&#xff1f;&#xff0c;属于编译错误还是链接错误&#xff1f; 编译阶段的错误&#xff0c;属于编译错误&am…

《量子计算:下一个大风口,还是一个热炒概念?》

引言 量子计算,作为一项颠覆性的技术,一直以来备受关注。它被认为是未来计算领域的一次革命,可能改变我们对计算能力和数据处理的理解。然而,随着技术的不断进步和商业应用的探索,人们开始思考,量子计算到底是一个即将到来的大风口,还是一个被过度炒作的概念? 量子计…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的夜间车辆检测系统(深度学习代码+UI界面+训练数据集)

摘要&#xff1a;开发夜间车辆检测系统对于自动驾驶技术具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个夜间车辆检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5&#xff0c;展示了不同模型间…

Hadoop学习1:概述、单体搭建、伪分布式搭建

文章目录 概述基础知识Hadoop组件构成Hadoop配置文件 环境准备配置Hadoop配置下载配置环境变量 Hadoop运行模式Standalone Operation&#xff08;本地&#xff09;官方DemoWordCount单词统计Demo Pseudo-Distributed Operation&#xff08;伪分布式模式&#xff09;配置修改启动…

vscode使用remote-ssh免密连接服务器

你还在使用XShell、Hyper、FinalShell等等SSH客户端软件吗&#xff0c;作为前端的我们&#xff0c;一直在用的功能强大的开发工具vscode&#xff0c;早已实现SSH连接功能&#xff08;借助官方提供的插件&#xff09;。而且更加好用&#xff0c;可以直接打开服务器上的文件&…