汇编攻城记-LDR/STR/LDM/STM数据传输

1.1 LDR和STR(直接偏移量)

带有直接偏移量、前变直接偏移量或后边直接偏移量的加载和存储。

语法

op{type}{cond} Rt, [Rn {, #offset}]       ;立即偏移
op{type}{cond} Rt, [Rn, #offset]!        ;前索引
op{type}{cond} Rt, [Rn], #offset        ;后索引op{type}{cond} Rt, Rt2, [Rn {, #offset}]       ;双字立即偏移
op{type}{cond} Rt, Rt2, [Rn, #offset]!        ;双字前索引
op{type}{cond} Rt, Rt2, [Rn], #offset        ;双字后索引其中: 
op 是下列项之一: LDR     加载寄存器。 STR     存储寄存器。 
type 是下列项之一: B      无符号字节(加载时零扩展为 32 位。) SB     有符号字节(仅 LDR。符号扩展为 32 位。) H      无符号半字(加载时零扩展为 32 位。) SH     有符号半字(仅 LDR。符号扩展为 32 位。) -      如果是字,则省略。 
cond 是一个可选的条件代码(请参阅条件执行)。 
Rt         要加载或存储的寄存器。 
Rn         内存地址所基于的寄存器。 
offset     是偏移量。如果省略了 offset,则该地址为 Rn 中的地址。 
Rt2        为附加寄存器,在双字运算中使用,用于加载或存储。

实例

;实例                功能描述
; ldr: load register
.equ    label,    0x80002000
ldr    r0,    label            ;从地址label读取一个字到r0
ldr    r0,    =label            ;把label这个“立即数”加载到r0
ldr    r1,    r0                ;从地址r0读取数据到r1中
ldr    r2,    [r0, #offset]    ;从地址r0+offset处读取一个字到r2
ldrb    r2,    [r0, #offset]    ;从地址r0+offset处读取一个字节到r2
ldrh    r2,    [r0, #offset]    ;从地址r0+offset处读取一个半字到r2
LDRD    r0,    r1,    [r2, #offset]    ;从地址r2+offset处读取双字(64位)到;r0(低32位)和r1(高32位);前索引
ldr    r1,    [r0, #offset]!    ;从地址r0+offset处读取一个字到r1,然后r0=r0+offset;如果没有! 那么最后r0的值得不到更新
ldrd    r1, r2, [r0, #offset]!  ;从r0+offset地址读取64位数据到r1(低32位)和r2(高32位);然后r0=r0+offset
;后索引                                    
ldr    r1,    [r0], #offset      ;从r0地址获取一个字加载到r1,然后r0=r0+offset 
ldrd r1, r2, [r0], #offset      ;从r0地址获取一个双字加载到r1, r2,然后r0=r0+offset                                 ; str store register
str    r0,    label            ;从r0读取一个字到地址label中
str    r0,    =label            ;把r0值更新label这个“立即数”
str    r1,    r0                ;从地址r1读取数据到r0中
str    r2,    [r0, #offset]     ;从地址r2处读取一个字到r0+offset
strb    r2,    [r0, #offset]    ;从地址r2处读取一个低字节到r0+offset
strh    r2,    [r0, #offset]    ;从地址r2处读取一个低半字到r0+offset
STRD    r0,    r1,    [r2, #offset]    ;从地址r0(低32位)和r1(高32位)处;读取双字到r2+offset;前索引
str    r1,    [r0, #offset]!    ;从地址r1处读取一个字到r0+offset,然后r0=r0+offset;如果没有! 那么最后r0的值得不到更新
strd    r1, r2, [r0, #offset]!  ;从r1(低32位)和r2(高32位)地址读取64位数据到r0+offset;然后r0=r0+offset
;后索引                                    
str    r1,    [r0], #offset      ;从r1地址获取一个字加载到r0,然后r0=r0+offset 
strd r1, r2, [r0], #offset      ;从r1, r2地址获取一个双字加载到r0,然后r0=r0+offset   

1.2 LDM和STM

加载、存储多个寄存器,可以使用r0-r15任何寄存器组合进行传输。

语法

op{addr_mode}{cond} Rn{!}, reglist{^}其中:
op     指令LDM    load multiple registers 加载多个寄存器STM    store multiple registers 存储多个寄存器
addr_mode    模式IA increment address after each transfer        先传输后地址自增IB increment address before each transfer        先地址自增后传输DA decrement address after each transfer        先传输后地址自减DB decrement address before each transfer        先地址自减后传输FD full descending stack                        满栈递增,地址从当前sp开始ED empty descending stack                        空栈递增,地址从sp+4开始取数据FA full ascending stack                          满栈递减EA empty ascending stack.                        空栈递减cond         是一个可选的条件代码(请参阅第2-17 页的条件执行)。 Rn         是基址寄存器,存储有用于传送初始地址的 ARM 寄存器。Rn 不能 为 r15。 !         是一个可选的后缀。如果有 ! ,则最终地址将写回到 Rn 中。 reglist     是一个或多个要加载或存储的寄存器列表,括在大括号内。可包含 寄存器范围。如果包含多个寄存器或寄存器范围,则必须用逗号隔 开(请参阅第4-28 页的示例)。请参阅第4-27 页的32 位 Thumb-2 指令中的 reglist 限制。 
^   为一个可选后缀,仅可用于 ARM 状态。不可在用户模式或系统模 式下使用。

实例


ldmia    sp!, {r0-r12,lr}    ;1.加载sp数据到lr, 然后sp=sp+4; 2.加载sp数据到r12, 然后sp=sp+1;; 以此类推,最后加载sp数据到r0,然后sp=sp+1; Rn为sp时,等效于POP
ldmib    sp!, {r0-r12,lr}    ;1.先sp=sp+4,然后加载sp数据到lr; 2.先sp=sp+1, 然后加载sp数据到r12;; 以此类推,最后,先sp=sp+1,然后加载sp数据到r0
ldmda    sp!, {r0-r12,lr}    ;先传输后sp增后                ;
ldmdb    sp!, {r0-r12,lr}    ;sp先自增后传输stmia    sp!, {r0-r12,lr}    ;1.存储lr数据到sp,然后sp=sp+4; 2.存储r12数据到sp,然后sp=sp+1;; 以此类推,最后 存储r0数据到sp,然后sp=sp+4; Rn为sp时,等效于PUSH
stmib    sp!, {r0-r12,lr}    ;sp先自增后传输
stmda    sp!, {r0-r12,lr}    ;sp先传输后自减
stmdb    sp!, {r0-r12,lr}    ;sp先自减后传输ldmia    sp, {r0-r12,lr}    ; sp 不带!时,传输完成后,sp地址不变

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

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

相关文章

Git的基本使用笔记——狂神说

版本控制 版本迭代, 版本控制( Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。 实现跨区域多人协同开发 追踪和记载一个或者多个文件的…

【蔚来汽车日常实习】蔚来汽车Java后端实习

【蔚来汽车日常实习】蔚来汽车Java后端实习 时间:2023 8.23 面试记录 两轮面试技术面 HR自我介绍介绍你的项目关于你的研究生方向 为什么不去高AI了说一下你对SpringBoot的理解说一下你对Data注解的理解 以及为什么可以填充说一下Spring IOC说一下 Spring aopHas…

合宙Air724UG LuatOS-Air LVGL API控件--日历 (Calendar)

日历 (Calendar) LVGL 提供了一个用来选择和显示当前日期的日历控件。 示例代码 – 高亮显示的日期 highlightDate lvgl.calendar_date_t() – 日历点击的回调函数 – 将点击日期设置高亮 function event_handler(obj, event) if event lvgl.EVENT_VALUE_CHANGED then da…

(15)线程的实例认识:同步,异步,并发,并发回调,事件,异步线程,UI线程

参看:https://www.bilibili.com/video/BV1xA411671D/?spm_id_from333.880.my_history.page.click&vd_source2a0404a7c8f40ef37a32eed32030aa18 下面是net framework版本 一、文件构成 1、界面如下。 (1)同步与异步有什么区别? …

有哪些前端可以做的性能优化点

前端性能优化是一个广泛的主题,涉及许多不同的技术和策略。以下是一些常见的前端性能优化点: 资源压缩和最小化: 使用工具如Terser来压缩和最小化JavaScript代码。使用CSS压缩工具如CSSNano。压缩HTML内容。 图片优化: 使用适当的…

单片机TVS/ESD二极管防护

TVS 瞬态电压抑制二极管Transient Voltage Suppressor ESD 静电释放二极管 Electro-Static discharge 这两种本质上都是二极管。都是利用了二极管正向导通、反向截止的特性。二极管在反向截止截止条件下,如果电压继续增大,将会引发雪崩,使得…

聚合多个电商API接口平台

API接口测试(点击免费测试) 随着数字化商业时代的到来,API接口已成为电商资源连接利器,也是全球传统互联网企业转型的基础。 2021年 Google Cloud 研究显示,全球互联网企业近3/4的企业持续投入数字化转型&#xff0c…

SpringMVC之异常处理器

文章目录 前言一、基于配置的异常处理二、基于注解的异常处理总结 前言 SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolver。 HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver&#x…

JVM类的加载过程

加载过程 JVM的类的加载过程分为五个阶段:加载、验证、准备、解析、初始化。 加载   加载阶段就是将编译好的的class文件通过字节流的方式从硬盘或者通过网络加载到JVM虚拟机当中来。(我们平时在Idea中书写的代码就是放在磁盘中的,也可以通…

什么是RTC

参考: https://zhuanlan.zhihu.com/p/377100294 RTC(Real time communication)实时通信,是实时音视频的一个简称,我们常说的RTC技术一般指的是WebRTC技术,已经被 W3C 和 IETF 发布为正式标准。由于几乎所…

文件操作(c/c++)

文件操作可以概括为几步: 打开文件,写入文件,读取文件,关闭文件 FILE FILE 是一个在C语言中用于文件操作的库函数,它提供了一系列函数来实现文件的创建、打开、读取、写入、关闭等操作。FILE 库函数可以帮助开发者处理…

精品基于SpringCloud实现的电影院购票系统设计-微服务-分布式

《[含文档PPT源码等]精品基于SpringCloud实现的电影院购票系统设计的设计与实现-微服务-分布式》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具: 开发语言:Java 框架:springcloud JDK版…

Springboot - 6.AOP

👀概念 当谈论AOP(面向切面编程)时,我们在软件设计中引入了一种编程范式,用于解决关注点分离的问题。关注点分离是将一个应用程序的不同关注点(例如日志记录、事务管理、安全性等)从业务逻辑中…

Docker 网络模式

文章目录 一、Docker 网络实现原理1.容器的端口映射 二、Docker的网络模式1.Host模式2.Container模式3.none模式4.bridge模式 三、自定义网络1、查看网络模式列表2、查看容器信息(包含配置、环境、网关、挂载、cmd等等信息)3、指定分配容器IP地址 面试题 一、Docker…

shiro550漏洞分析

准备工作 启动该项目 可以看到没有登录时候,cookie中没有rememberme字段 登录时候 当账号密码输入正确时候 登录后存在该字段 shiro特征: 未登陆的情况下,请求包的cookie中没有rememberMe字段,返回包set-Cookie⾥也没有del…

微信小程序在线阅读系统微信小程序设计与实现

摘 要:信息技术永远是改变生活的第一种创新方式,各种行业的发展更是脱离不了科技化的支持。原本传统的行业正在被科技行业的切入悄悄的发生变化。就拿我们生活当中常见的事情举例而言,在外卖行业还没有发展的快速的时候,方便面等速…

美创科技一体化智能化公共数据平台数据安全建设实践

公共数据是当今政府数字化转型的关键要素和未来价值释放的核心锚点,也是“网络强国”、“数字中国”的战略性资源。 作为数字化改革先行省份,近年来,浙江省以一体化智能化公共数据平台作为数字化改革的支撑总平台,实现了全省公共数…

正则表达式(JAVA)

正则表达式(JAVA) 文章目录 正则表达式(JAVA)用法字符类(只匹配一个字符)预定义字符(只匹配一个字符)数量词贪婪爬取符号捕获分组规则捕获分组符号 非捕获分组案例忽略大小写 用法 正则表达式在用于校验信息是否满足某些规则的时候,非常的好用 在文本中查找满足要求的内容 字…

2022年12月 C/C++(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:区间合并 给定 n 个闭区间 [ai; bi],其中i=1,2,…,n。任意两个相邻或相交的闭区间可以合并为一个闭区间。例如,[1;2] 和 [2;3] 可以合并为 [1;3],[1;3] 和 [2;4] 可以合并为 [1;4],但是[1;2] 和 [3;4] 不可以合并。 我们的任务是…

数据结构(Java实现)-反射、枚举以及lambda表达式

Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们就可以修改部分…