ARM64汇编05 - MOV系列指令

MOV(wide immediate)

MOV 可以将一个立即数移动到寄存器中。

.text:0000000000000834 80 46 82 D2                   MOV             X0, #0x1234             ; Keypatch modified this from:

MOV X0, #0x1234 对应的汇编代码为:80 46 82 D2

看手册可知,0x1234 的值储存在 5 - 20 位里面。

汇编指令对应的二进制为:

80 46 82 D2 ->
D2 82 46 80 ->
11010010 10000010 01000110 10000000 ->
1 10 100101 00 0001 0010 0011 0100 00000

其中最低5为都是0,所以寄存器是 X0 寄存器。

5-20 位的值分别是 4 3 2 1,刚好就是 0x1234。

这种 mov 指令还是比较常见的,但是由于指令的限制,它只能描述16位的立即数。

看另外的一个例子:

.text:0000000000000834 00 00 B0 D2                   MOV             X0, #0x80000000

MOV X0, #0x80000000 这条指令的立即数显然已经超过了16位,这又是咋回事呢?

这是 MOV 指令的另一种形式,由于 #0x80000000 这样的立即数实际的有效位数很少,所以ARM指令集对其表示做了优化。

手册里面有说到,MOV 实际上等同于 MOVZ:

而 MOVZ 是支持 shift 写法的:

MOVZ <Xd>, #<imm>{, LSL #<shift>}

所以上面的汇编实际上等同于:

MOVZ X0, #0x8000, LSL #16

汇编指令对应的二进制为:

00 00 B0 D2 ->
D2 B0 00 00 ->
11010010 10110000 00000000 00000000 ->
1 10 100101 01 1000 0000 0000 0000 00000

看其 hw 对应的位是 01,所以需要将 0x8000左移 1*16 位,得到 0x80000000。

hw 表示的是左移的位数,为 16 * (0~3)。

MOV (register)

MOV 可以将寄存器的值赋值给另一个寄存器。

Rm 与 Rd 都占据了5位,刚好可以描述所有的寄存器,MOV <Xd>, <Xm>

shift 有2位,这里固定是零值。imm6 与 Rn 也都是固定的值。

MOV 有个别名指令,ORR,它可以用到 shift,imm6,Rn的值。

看一个指令,MOV X0, X1

E0 03 01 AA                   MOV             X0, X1

汇编指令对应的二进制为:

E0 03 01 AA ->
AA 01 03 E0 ->
10101010 00000001 00000011 11100000 ->
1 01 01010 00 0 00001 000000 11111 00000

所以,Rd 的值是 0,表示 X0 寄存器,Rm 的值是1,表示 X1 寄存器。

顺便说一下 ORR 指令:

是将寄存器中值按位做“或”操作。

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

Xm还可以做移位操作,具体移动多少位由 imm6 决定,怎么移动由 shift 决定。

MOVK

由于ARM64指令集是定长的4字节指令,这就决定了它无法在指令里面描述一个任意的数字,比如:0x123456789,这个就无法在指令中表示。

那么,当我们在程序中使用到这个数字的时候,arm64指令集是如何处理的呢?

我们写一个例子看看:

uint64_t num = 0x123456789abc;
printf("num = %llx\n", num);

查看汇编代码:

.text:00000000000008AC 81 57 93 D2                   MOV             X1, #0x9ABC
.text:00000000000008B0 00 00 00 90                   ADRP            X0, #aNumLlx@PAGE       ; "num = %llx\n"
.text:00000000000008B4 01 CF AA F2                   MOVK            X1, #0x5678,LSL#16
.text:00000000000008B8 00 00 24 91                   ADD             X0, X0, #aNumLlx@PAGEOFF ; "num = %llx\n"
.text:00000000000008BC 81 46 C2 F2                   MOVK            X1, #0x1234,LSL#32

我们只看 X1 相关的指令,它分为3个步骤:

MOV             X1, #0x9ABC
MOVK            X1, #0x5678,LSL#16
MOVK            X1, #0x1234,LSL#32

通过数据的拼接来达成目标,非常的合理。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

发布DDD脚手架到Maven仓库,IntelliJ IDEA 配置一下即可使用

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 项目&#xff1a;https://gaga.plus 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 大家好&#xff0c;我是技术UP主&#xff0c;小傅哥。 这篇文章将帮助粉丝伙伴们更高效地利…

科技回顾,飞凌嵌入式受邀亮相第八届瑞芯微开发者大会「RKDC2024」

2024年3月7日~8日&#xff0c;第八届瑞芯微开发者大会&#xff08;RKDC2024&#xff09;在福州举行&#xff0c;本届大会以“AI芯片AI应用AloT”为主题&#xff0c;邀请各行业的开发者共启数智化未来。 本届大会亮点颇多&#xff0c;不仅有13大芯片应用展示、9场产品和技术论坛…

Pytorch Tutorial

本教程将详细展示如何使用PyTorch训练神经网络&#xff0c;并给出完整代码和关键注释&#xff08;ipython&#xff09;&#xff0c;建议使用CoLab的GPU来编译代码。 目录 环境初始化数据准备模型搭建模型训练优化器训练和评估函数开始训练 可视化 环境初始化 !pip install tor…

Linux学习:基础开发工具的使用(1)

目录 1. Linux软件包管理器&#xff1a;yum工具1.1 yum是什么&#xff08;软件商城&#xff09;1.2 yum的使用1.3 yum的背景生态 2. 项目开发与集成开发环境3. vim编辑器3.1 vim编辑器的常见模式与模式切换3.3 vim编辑器的使用3.3.1 命令模式下的常见命令&#xff1a;3.3.2 vim…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的石头剪刀布手势识别系统详解(深度学习模型+UI界面代码+训练数据集)

摘要&#xff1a;本篇博客深入探讨了使用深度学习技术开发石头剪刀布手势识别系统的过程&#xff0c;并分享了完整代码。该系统利用先进的YOLOv8、YOLOv7、YOLOv6、YOLOv5算法&#xff0c;并对这几个版本进行性能对比&#xff0c;如mAP、F1 Score等关键指标。文章详细阐述了YOL…

vscode使用npm命令无反应,而终端可以的解决办法

如若你遇到这种情况 使用命令 get-command npm 去下面这个路径把它删掉就可以了

HarmonyOS的功能及场景应用

一、基本介绍 鸿蒙HarmonyOS主要应用的设备包括智慧屏、平板、手表、智能音箱、IoT设备等。具体来说&#xff0c;鸿蒙系统是一款面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统&#xff0c;能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备…

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

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

工业物联网平台在水务环保、暖通制冷、电力能源等行业的应用

随着科技的不断发展&#xff0c;工业物联网平台作为连接物理世界与数字世界的桥梁&#xff0c;正逐渐成为推动各行业智能化转型的关键力量。在水务环保、暖通制冷、电力能源等行业&#xff0c;工业物联网平台的应用尤为广泛&#xff0c;对于提升运营效率、降低能耗、优化管理等…

16. C++标准库

C标准库兼容C语言标准函数库&#xff0c;可以在C标准库中直接使用C语言标准函数库文件&#xff0c;同时C标准库增加了自己的源代码文件&#xff0c;新增文件使用C编写&#xff0c;多数代码放在std命名空间中&#xff0c;所以连接C标准库文件后还需要 using namespace std;。 【…

【RabbitMQ】RabbitMQ的交换机

交换机类型 在上文中&#xff0c;都没有交换机&#xff0c;生产者直接发送消息到队列。而一旦引入交换机&#xff0c;消息发送的模式会有很大变化&#xff1a;可以看到&#xff0c;在订阅模型中&#xff0c;多了一个exchange角色&#xff0c;而且过程略有变化&#xff1a; Pub…

【wps】wps与office办公函数储备使用(结合了使用案例 持续更新)

【wps】wps与office办公函数储备使用(结合了使用案例 持续更新) 1、TODAY函数 返回当前电脑系统显示的日期 TODAY函数&#xff1a;表示返回当前电脑系统显示的日期。 公式用法&#xff1a;TODAY() 2、NOW函数 返回当前电脑系统显示的日期和时间 NOW函数&#xff1a;表示返…

Day29:安全开发-JS应用DOM树加密编码库断点调试逆向分析元素属性操作

目录 JS原生开发-DOM树-用户交互 JS导入库开发-编码加密-逆向调试 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&#xff0c;文件操作&#xff0c;SQL操作&#xff0c;云应用接入&#xff0c;框架开发&#xff0c;打包器使用等 技术&#xff1a;原生开发&#x…

GaussDB(DWS)运维利刃:TopSQL工具解析

在生产环境中&#xff0c;难免会面临查询语句出现异常中断、阻塞时间长等突发问题&#xff0c;如果没能及时记录信息&#xff0c;事后就需要投入更多的人力及时间成本进行问题的定位和解决&#xff0c;有时还无法定位到错误出现的地方。在本期《GaussDB(DWS)运维利刃&#xff1…

在 Python 中从键盘读取用户输入

文章目录 如何在 Python 中从键盘读取用户输入input 函数使用input读取键盘输入使用input读取特定类型的数据处理错误从用户输入中读取多个值 getpass 模块使用 PyInputPlus 自动执行用户输入评估总结 如何在 Python 中从键盘读取用户输入 原文《How to Read User Input From t…

小家电显示驱动芯片SM1616特点与相关型号推荐

电饭煲、电磁炉、空调和机顶盒等等小家电通常需要使用显示驱动芯片来控制和驱动显示屏。这些显示驱动芯片的主要功能是将处理器的信号转换成显示屏能够理解的信号&#xff0c;从而显示出相应的文字和图像。 具体来说&#xff0c;电饭煲、电磁炉、空调等家等小家电通常会有一个或…

四桥臂三相逆变器动态电压恢复器(DVR)MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 简介 四桥臂三相逆变器 电路 的一般形式如图 1&#xff0c;为 便于分析 &#xff0c;将其等效成图所示的电路 。以直流母线电压Ud的 1&#xff0f;2处为参考点 &#xff0c;逆变器三相和零线相 输 出可等效成…

深度学习:如何面对隐私和安全方面的挑战

深度学习技术的广泛应用推动了人工智能的快速发展&#xff0c;但同时也引发了关于隐私和安全的深层次担忧。如何在保护用户隐私的同时实现高效的模型训练和推理&#xff0c;是深度学习领域亟待解决的问题。差分隐私、联邦学习等技术的出现&#xff0c;为这一挑战提供了可能的解…

pytorch的梯度图与autograd.grad和二阶求导

前向与反向 这里我们从 一次计算 开始比如 zf(x,y) 讨论若我们把任意对于tensor的计算都看为函数&#xff08;如将 a*b&#xff08;数值&#xff09; 看为 mul(a,b)&#xff09;&#xff0c;那么都可以将其看为2个过程&#xff1a;forward-前向&#xff0c;backward-反向在pyto…

3.7号freeRtoS

1. 串口通信 配置串口为异步通信 设置波特率&#xff0c;数据位&#xff0c;校验位&#xff0c;停止位&#xff0c;数据的方向 同步通信 在同步通信中&#xff0c;数据的传输是在发送端和接收端之间通过一个共享的时钟信号进行同步的。这意味着发送端和接收端的时钟需要保持…