ARM64汇编08 - 块访存指令

news2024/9/26 1:28:06

armv8 里面似乎没有了 v7 中的块访存指令,就是一次性访问一块内存的指令。我们还是先介绍下 v7 中的块访存指令。

V7中的块访存指令​

 

手册中介绍了很多种该指令的变种形式,其实了解了这个指令的英文含义就都很好理解。

LD - load,加载

M - Memory,内存

IA,IB,DA,DB,这四个表示的是模式。

FA,FD,EA,ED,这四个是针对特殊寄存器的特殊写法。

举个例子:

1E 00 90  E8         LDMIA R0, {R1-R4}

该指令表示的意思是,从 R0 表示的地址处开始读内存,一次性读4个64bit的数出来,放到 R1 到 R4 中。储存的顺序,就是序号顺序。我们看其格式描述:

寄存器列表一共占据了 16 位,可以描述 16 个寄存器,每一个位为1就表示需给该寄存器赋值。

1E 就是第1位到第4位是1。符合 R1 - R4 的描述。

下面,我们重点介绍一下指令后缀,IA,IB,DA,DB。

IA,IB,DA,DB

I - increase
A - after
D - decrease
B - before

知道了英文含义,应该就能理解其含义了,与**i++** 和++i差不多。

看指针行为,先读 R0 寄存器内存地址处的数据,读完再下移,直到 4 个数据都读完。最后R0的值是不变的。如果需要改变 R0 的值,需要加上 ! 后缀。

看指针行为,先下移,再读 R0 寄存器内存地址处的数据,直到 4 个数据都读完。最后R0的值是不变的。如果需要改变 R0 的值,需要加上 ! 后缀。

DA 与 DB 就是反着来的,就不重复了。

IB 与 DB 的行为和栈操作会比较像,push与 pop。

FA,FD,EA,ED

FD:满递减堆栈。

FA:满递增堆栈。

EA:空递减堆栈。

ED:空递增堆栈。

我们尝试在  ida 中 patch 一个指令:

stmdb sp!, {R0-R3}

发现,ida 给我们生成的指令是:

0F 00 2D E9         STMFD    SP!, {R0-R3}

实际上,是因为该指令的第一个操作数是 SP,所以才会生成 FD 后缀。所以,STMFD 与 STMDB 是一样的。

比如,我们经常会在函数的头尾看到如下指令:

STMFD SP!, {R3-R7,LR}
...
...
LDMFD SP!, {R3-R7,PC}

第一条指令就是,保存 R3-R7 的值,保存返回地址,最后一条指令,就是还原 R3-R7 的值,将返回地址赋值给 PC。

V8中的块访存指令

虽然,V8中没有了V7中的那些指令,但是还有一个平替指令,就是 STP 指令,我们在函数头尾有时候也能见到。

看下 STP 指令的介绍:

stp 指令是 str 的变种指令,p 可以理解成 pair 的意思,可以同时操作两个寄存器。从V7中的最多操作16个,变成了2个,威力下降了不少。

举一个例子:

stp x29, x30, [sp, #0x10]  ; 将 x29, x30 的值按序存入 sp 偏移 16 个字节的位置

看一下,mencpy 的汇编:

.text:000000000001C3E0 28 24 41 A9                   LDP             X8, X9, [X1,#0x10]
.text:000000000001C3E4 2A 2C 42 A9                   LDP             X10, X11, [X1,#0x20]
.text:000000000001C3E8 2C 34 43 A9                   LDP             X12, X13, [X1,#0x30]
.text:000000000001C3EC 81 08 7E A9                   LDP             X1, X2, [X4,#-0x20]
.text:000000000001C3F0 84 0C 7F A9                   LDP             X4, X3, [X4,#-0x10]
.text:000000000001C3F4 06 1C 00 A9                   STP             X6, X7, [X0]
.text:000000000001C3F8 08 24 01 A9                   STP             X8, X9, [X0,#0x10]
.text:000000000001C3FC 0A 2C 02 A9                   STP             X10, X11, [X0,#0x20]
.text:000000000001C400 0C 34 03 A9                   STP             X12, X13, [X0,#0x30]
.text:000000000001C404 A1 08 3E A9                   STP             X1, X2, [X5,#-0x20]
.text:000000000001C408 A4 0C 3F A9                   STP             X4, X3, [X5,#-0x10]
.text:000000000001C40C C0 03 5F D6                   RET

对 STP 的指令使用还是比较疯狂的。

二手的程序员

红日初升,其道大光。河出伏流,一泻汪洋。潜龙腾渊,鳞爪飞扬。乳虎啸谷,百兽震惶。鹰隼试翼,风尘翕张。奇花初胎,矞矞皇皇。干将发硎,有作其芒。天戴其苍,地履其黄。纵有千古,横有八荒。前途似海,来日方长。

公众号

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

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

相关文章

C++:部分题目

1. 封装、继承、多态 封装:将所需的数据成员,以及对数据的操作方法(成员函数),绑定在一起成为类(类型),定义该类型的对象时,成员被自动隐藏在对象内部。通过封装可以限定…

SOLIDWORKS Simulation子模型分析的使用方法

子模型介绍 SOLIDWORKS Simulation的子模型基于圣维南原理。对于一个比较复杂的模型,如果想升级局部的应力计算精度,就需要对整个模型的网格进行调整并重新进行计算,整个过程耗时较长而且不容易得到满意的结果。 SOLIDWORKS Simulation的子…

【深度学习】训练Stable Diffusion环境

仓库: https://github.com/bmaltais/kohya_ss.git 基础镜像: from kevinchina/deeplearning:sdxllighting_trt_nginx_002api docker run --net host --gpus device0 -e APIWORKS1 -it t1:t1 bash构建环境: sudo -i git clone https://git…

面试常问:为什么 Vite 速度比 Webpack 快

前言 最近作者在学习 webpack 相关的知识,之前一直对这个问题不是特别了解,甚至讲不出个123....,这个问题在面试中也是常见的,作者在学习的过程当中总结了以下几点,在这里分享给大家看一下,当然最重要的是…

【MySQL配置】Windows环境下载并安装MySQL数据库(内含图片,保姆级指引)

一、下载自身所需Mysql 官网链接:https://dev.mysql.com/downloads/installer/ 点击Download后,跳转如下页面。你可以点击注册一个谷歌账号(不是硬性要求),或者直接如图开始下载。 二、安装所下载的版本 1、双击下载的MySQL文件 2、选择…

深入理解与实践AB测试:从理论到实战案例解析

一、引言 在互联网产品优化和运营策略制定中,AB测试(也称为分组测试或随机化对照实验)是一种科学且严谨的方法。它通过将用户群体随机分配至不同的实验组(通常是A组和B组),对比不同版本的产品或策略对关键…

MySQl基础入门⑫

上一遍文章内容 查询时选择行 1.查询指定记录 假设students表包含字段name, major, 和 email,我们可以构造一个查询来找出所有专业为“计算机科学”且邮箱中包含"university.edu"的学生姓名和邮箱: SELECT name, email FROM students WHER…

种植新革命:科技赋能绿色未来

《种植新革命:科技赋能绿色未来》 一、种植技术的颠覆式创新 随着科技的飞速发展,种植技术也在经历一场颠覆式的创新。传统的种植方式,虽然历史悠久,经验丰富,但在面对现代化、大规模、高效的需求时,逐渐…

一分钟带你入门Selenium入门!【建议收藏】

Selenium入门 欢迎阅读Selenium入门讲义,本讲义将会重点介绍Selenium的入门知识以及Selenium的前置知识。 自动化测试的基础 在Selenium的课程以前,我们先回顾一下软件测试的基本原理,为我们进一步完成Selenium自动化测试做好准备。 软件…

解决GNURadio自定义Python OOT块-导入块时报错问题

文章目录 前言一、问题描述二、解决方法1、卸载已安装的 OOT 块2、重新编译及安装3、重新测试 前言 本文记录在 GNURadio 自定义Python OOT 块后导入块时报错 ModuleNotFoundError: No module named xxx。 一、问题描述 参考官方教程 Creating Python OOT with gr-modtool 创…

【ppt技巧】PPT转换为图片,方法有哪些?

想要将ppt文件转换为图片,其实很简单,一起来看一下如何操作吧! 方法一: 使用格式转换器,有些文件格式转换器,支持ppt转换为图片。 方法二: 不需要转换器,直接在ppt中进行操作即可…

linux上安装locust并进行压测demo

我的linux服务器上有两个python版本 使用python3 pip3 install locust 过程中有一些报错 第一个报错 gcc: error trying to exec cc1plus: execvp: No such file or directoryerror: command gcc failed with exit status 1第二个报错 src/greenlet/greenlet_refs.hpp:181:19…

数据库:基本操作与用户授权

一 基本操作 1 SQL分类 数据库:database 表:table,行:row 列:column 索引:index 视图:view 存储过程:procedure 存储函数:function 触发器:trigger 事…

文件操作:文本文件(写/读)

文件操作可以将数据永久化&#xff0c;C中对文件操作需要包含头文件 < fstream > 文件类型分为两种&#xff1a; 1. 文本文件&#xff1a;文件以文本的ASCII码形式存储在计算机中 2. 二进制文件&#xff1a;文件以文本的二进制形式存储在计算机中&#xff0c;…

理解计算属性等

计算属性 计算属性的作用是将写在computed内的写了对应的属性名&#xff0c;属性值都是函数&#xff0c;将这属性值的函数调用之后的返回值赋给属性名的变量。因此其实计算属性内的是值&#xff0c;不是方法&#xff0c;因此写插值等语句是只是写变量&#xff0c;而不是调用。且…

电气接点在线测温解决方案--ARTM电气接点在线测温装置

ARTM系列电气接点在线测温装置适用于高低压开关柜内电缆接头、断路器触头、刀闸开关、高压电缆中间头、干式变压低压大电流等设备的温度监测&#xff0c;防止在运行过程中因氧化、松动、灰尘等因素造成接点接触电阻过大而发热成为安全隐者、患&#xff0c;提高设备安全保障&…

Linux 磁盘的一生

注意&#xff1a;实验环境都是使用VMware模拟 ​ 磁盘接口类型这里vm中是SCSI&#xff0c;扩展sata,ide(有时间可以看看或者磁盘的历史) ​ 总结&#xff1a;磁盘从有到无—类似于建房子到可以住 ————————————————————————————————————…

【MyBatis】in根据查询的顺序返回结果

目标效果&#xff1a;根据in中元素的顺序返回结果 查询id为&#xff08;2&#xff0c;4&#xff0c;1&#xff0c;3&#xff09;的数据&#xff0c;并按此顺序返回 第一次尝试 select id, name from tb_shop where id in (2, 4, 1, 3);期待效果 实际效果 正确的语句 select …

Chrome浏览器扩展插件开发

manifest.json: {"manifest_version": 3,"name": "ChatGPT学习","version": "0.0.1","description": "ChatGPT,GPT-4,Claude3,Midjourney,Stable Diffusion,AI,人工智能,AI","icons": {&quo…

Effect:由渲染本身引起的副作用

React 组件中的两种逻辑类型&#xff1a; 渲染逻辑代码 位于组件的顶层&#xff0c;接收 props 和 state&#xff0c;进行转换&#xff0c;返回屏幕上看到的 JSX&#xff0c;只计算不做其他任何事情&#xff1b;事件处理程序 嵌套在组件内部的函数&#xff0c;由特定的用户操作…