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

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

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

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

相关文章

【强化学习抓取】偏机器人领域(略)

文章目录 1. A Grasp Pose is All You Need: Learning Multi-fingered Grasping with Deep Reinforcement Learning from Vision and Touch摘要和结论引言相关工作模型框架 1. A Grasp Pose is All You Need: Learning Multi-fingered Grasping with Deep Reinforcement Learni…

深入解析Kafka中Replica的妙用

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 深入解析Kafka中Replica的妙用 前言Replica的基本概念基本概念和原理&#xff1a;Replica在消息传递中的关键角色&#xff1a; 副本的创建与配置创建 Replica 步骤&#xff1a;Replica 相关的常见配置…

UnoCSS原子CSS引擎—原子化真的是现代前端CSS利器?

追忆往昔&#xff0c;穿越前朝&#xff0c;CSS也是当年前端三剑客之一&#xff0c;风光的很&#xff0c;随着前端跳跃式的变革&#xff0c;CSS在现代前端开发中似乎有点默默无闻起来。 不得不说当看到UnoCss之前&#xff0c;我甚至都还没听过原子化CSS这个概念&#xff0c;很久…

如何用BI工具对数据进行预处理?数据分析的这项技巧你必须掌握。

在当今数字化时代&#xff0c;数据不仅是企业决策的基础&#xff0c;也是创新和发展的关键推动力。在面对庞大而复杂的数据集时&#xff0c;如何进行高效的预处理成为了数据分析领域中至关重要的一步。 在进行数据处理和分析的日常工作中&#xff0c;业务普遍使用Excel和SQL这两…

基于JavaWeb开发的私人牙科诊所管理系统【附源码】

基于JavaWeb开发的私人牙科诊所管理系统[附源码] &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &…

嵌入式面经-ARM体系架构-寄存器与异常处理

ARM寄存器组织 寄存器概念 寄存器是处理器内部的存储器&#xff0c;没有地址 寄存器作用 一般用于暂时存放参与运算的数据和运算结果 在某个特定模式下只能使用当前模式下的寄存器&#xff0c;一个模式下特有的寄存器别的模式下不能使用 一共是40个寄存器 寄存器分类 通用寄…

勾八头歌之数据科学导论—数据预处理

第1关&#xff1a;引言-根深之树不怯风折&#xff0c;泉深之水不会涸竭 第2关&#xff1a;数据清理-查漏补缺 import numpy as np import pandas as pd import matplotlib.pyplot as pltdef student():# Load the CSV file and replace #NAME? with NaNtrain pd.read_csv(Tas…

http协议中的强缓存与协商缓存,带图详解

此篇抽自本人之前的文章&#xff1a;http面试题整理 。 别急着跳转&#xff0c;先把缓存知识学会了~ http中的缓存分为两种&#xff1a;强缓存、协商缓存。 强缓存 响应头中的 status 是 200&#xff0c;相关字段有expires&#xff08;http1.0&#xff09;,cache-control&…

C++中类模板的定义和使用

类模板的定义和使用 引言类模板声明和定义有问有答 示例运行结果注意参数传递ref 引言 类模板就是一个模板&#xff0c;但是数据可以适用多种类型。类模板使用时需要模板的特例化&#xff0c;就变成了模板类。 本文只要是记录一下模板的使用。同时对于引用和右值引用传参做一下…

几个redis常用命令

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 ping&#xff1a;测试连接是否存活 例如&#xff1a;测试当前redis数据库是否存活 127.0.0.1:6379> ping #返回PONG&am…

RHEL9 DNF/YUM仓库管理软件包

DNF/YUM仓库管理软件包 一个基于RPM包的软件包管理器能够从指定的服务器自动下载RPM包并且安装&#xff0c;自动处理依赖性关系&#xff0c;并且一次性安装所有依赖的软件包C/S模式 Server服务端提供RPM软件包与数据库文件repodataClient客户端使用dnf仓库 常用组合 组合参…

半导体湿法技术有什么优势

湿法蚀刻工艺的原理是使用化学溶液将固体材料转化为液体化合物。选择性非常高&#xff0c; 因为使用的化学品可以非常精确地适应单个薄膜。对于大多数解决方案&#xff0c;选择性大于100:1。 批量蚀刻 在批量蚀刻中&#xff0c;可以同时蚀刻多个晶圆&#xff0c;过滤器和循环…

返回值不同算方法重载么?为什么?

1、典型回答 返回值不同不算方法重载 方法重载&#xff08;Overloading&#xff09;是指在同一个类中定义了多个同名方法&#xff0c;但它们的参数列表不同&#xff0c;方法重载要求方法&#xff1a; 名称相同参数类型、参数个数或参数顺序&#xff0c;至少有一个不同 方法…

【SQL】601. 体育馆的人流量(with as 临时表;id减去row_number()思路)

前述 知识点学习&#xff1a; with as 和临时表的使用12、关于临时表和with as子查询部分 题目描述 leetcode题目&#xff1a;601. 体育馆的人流量 思路 关键&#xff1a;如何确定id是连续的三行或更多行记录 方法一&#xff1a; 多次连表&#xff0c;筛选查询方法二&…

普发Pfeiffer氦质谱检漏仪HLT260/270系列电路图电路板图纸和接线针脚含义非常详细内部国外资料中英操作说明培训PPT课件打包13个文档

普发Pfeiffer氦质谱检漏仪HLT260/270系列电路图电路板图纸和接线针脚含义非常详细内部国外资料中英操作说明培训PPT课件打包13个文档

使用 gin-api-mono 创建简单的 TODO 服务

介绍 首先介绍一下 gin-api-mono 这个项目&#xff0c;这个项目是由 go-gin-api 作者基于用户的需求衍生出来的一个项目。因为有些用户觉得 go-gin-api 是一个前后端都有的一个开源项目&#xff0c;对于很多用户来说&#xff0c;前端部分是不需要的&#xff0c;所以作者看到这…

护眼灯什么价位的好用?推荐五款好价护眼台灯

如今&#xff0c;我们不难发现许多年轻人早早地就戴上了眼镜&#xff0c;近视问题日益严重。在改善近视问题的众多因素中&#xff0c;营造适宜的照明环境&#xff0c;特别是选择一款合适的护眼台灯&#xff0c;显得尤为重要。然而&#xff0c;对于初次选购护眼台灯的人来说&…

通过sqoop把hive数据到mysql,脚本提示成功,mysql对应的表中没有数

1、脚本执行日志显示脚本执行成功&#xff0c;读写数量不为0 2、手动往Mysql对应表中写入数据十几秒后被自动删除了 问题原因&#xff1a; 建表时引擎用错了&#xff0c;如下图所示 正常情况下应该用InnoDB

Request和Response对象

Request和Response都是Servlet的service方法的参数&#xff0c;Request负责获取请求数据&#xff0c;而Response负责设置相应数据~ 一.Request 1.继承体系 Tomcat负责解析数据&#xff0c;因此由Tomcat来提供实现类~ 2.获取请求数据 请求行 请求头 请求体 需要注意的是只有…

【Greenhills】MULTI IDE工程管理的目录结构

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 关于的GHS的Project Manager中工程的目录结构的组成 2、 问题场景 在GHS中去创建项目后&#xff0c;对于在Project Manager窗口中的目录结构不太清晰&#xff0c;目录中有多个gpj文件&#xff0c;无法确认哪个是…