数据块传输指令用于加载(LDM)或者存储(STM)当前有效寄存器的任意子集。
它们支持所有可能的堆栈模式,维持空或者满的堆栈,此堆栈可以向上或者向下,在保存或者恢复内容,

移动主存储器的大数据块是非常有效的。



1,指令格式:



{cond}     Rn{!},    {^}

*{cond} 条件代码

* 指令类型

*Rn 基址寄存器,其 不可以为R15

* 寄存器列表,寄存器范围包含在{}(比如{R0,R2-R7,R10}),其 可以是R0~R15的任意组合

由于R15是pc,对其操作可能会造成程序跳转, R15在最后一个被传输

序号低的寄存器对应于存储器的低地址,不考虑{...}中的次序

*{!} 为可选后缀,

            若选用该后缀,表示请求回写(W=1),则当数据传送完毕之后,将 最后的地址写入到基址寄存器(Rn)中,

            否则,W=0。表示请求不写回, 基址寄存器的内容不改变

*{^}            为可选后缀,

            当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送外,还将 SPSR复制到CPSR中。

            同时,该后缀还表示传入或传出的是 用户模式下的寄存器,而不是当前模式下的寄存器。



2,指令类型:







  
当LDM/STM没有被用于堆栈,而只是简单地表示地址前向增加,后向增加,前向减少,后向减少时,由IA,IB,DA,DB控制。

        IA    ---->    Increment    After     每次传送地址加4

        IB    ---->    Increment    Before     每次传送地址加4

        DA    ---->    Decrement    After     每次传送地址减4

        DB    ---->    Decrement    Before     每次传送地址减4



     堆栈请求格式,FD,ED,FA,EA定义了前/后向索引和上/下位,F,E表示堆栈满或者空。

    A 和D 定义堆栈是递增还是递减,如果递增,STM将向上,LDM向下,如果递减,则相反。

        FA    ---->    Full    Ascending         满递增堆栈           

        FD    ---->    Full    Descending         满递减堆栈

        EA    ---->    Empty    Ascending     空递增堆栈

        ED    ---->    Empty    Descending     空递减堆栈







        示例:





        两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈操作编程很简单(只有前后一致即可),

        而使用数据块指令进行压栈和出栈操作则需要考虑空与满,加与减对应的问题。







3,指令详解:

(1)IA

             STMIA R0!,{R1,R2, R3,R14}

                    先传后增,寄存器→RAM

                    效果图:



                                




LDMIA R0!,{R1,R2, R3,R14}
先传后增, RAM →寄存器
效果图:







(2)IB

             STMIB R0!,{R1,R2, R3,R14}

                    先增后传,寄存器→RAM

                    效果图:



                   

LDMIBR0!,{R1,R2, R3,R14}

        先增后传, RAM →寄存器

        效果图:





(3)DA

             STMDAR0!,{R1,R2, R3,R14}

                    先传后减, 寄存器→ RAM

                    效果图:



 



             LDMDAR0!,{R1,R2, R3,R14}

                    先传后减, RAM → 寄存器

                    效果图:







(4)DB

             STMDBR0!,{R1,R2, R3,R14}

                    先减后传,寄存器→ RAM

                    效果图:





                     

             LDMDBR0!,{R1,R2, R3,R14}

                    先减后传, RAM → 寄存器

                    效果图:



(5)FA

             STMFASP!,{R0,R1,R2,R14}

                    满递增入栈,R13为基址地址

                    效果图:



             LDMFASP!,{R0,R1,R2,R14}

                    满递增出栈,R13为基址地址

                    效果图:



    (6)FD


             STMFDSP!,{R0,R1,R2,R14}

                    满递减入栈,R13为基址地址

                    效果图:



             LDMFDSP!,{R0,R1,R2,R14}

                    满递减出栈,R13为基址地址

                    效果图:



(7)EA

             STMEASP!,{R0,R1,R2,R14}

                    空递增入栈,R13为基址地址

                    效果图:



LDMEASP!,{R0,R1,R2,R14}

                    空递增出栈,R13为基址地址

                    效果图:



(8)ED

             STMEDSP!,{R0,R1,R2,R14}

                    空递减入栈,R13为基址地址

                    效果图:

            

LDMEDSP!,{R0,R1,R2,R14}

                    空递减出栈,R13为基址地址

                    效果图:




arm汇编指令之数据块传输(LDM,STM)详见相关推荐

  1. ida pro 反汇编 Android so 库后修改 arm 汇编指令的方法总结

    1 前言 最近博主在学习Android逆向的时候,参照吾爱破解论坛的<教我兄弟学Android逆向系列课程>学习的时候,学到第8章<教我兄弟学Android逆向08 IDA爆破签名验 ...

  2. arm汇编指令详细整理及实例详解

    目录 一.简介 二.ARM 汇编指令说明 2.1 32位数据操作指令 2.2 32位存储器数据传送指令 2.3 32位转移指令 2.4 其它32位指令 三.实例讲解 3.1 MRS 3.2 MSR 3 ...

  3. arm汇编指令——分析问题的利器

    文章目录 arm汇编指令为什么重要 1. 主导问题 2. arm汇编指令分类介绍 通用寄存器 状态寄存器 数据转移指令 寻址格式 运算指令 比较指令 跳转指令 3. 反汇编接口 4. 反汇编分析举例 ...

  4. 1.15.ARM汇编指令3之逻辑指令

    ARM汇编指令之逻辑指令:and & orr & eor & bic * and 逻辑与操作指令,将operand2的值与寄存器Rn的值按位逻辑与操作,结果保存到Rd中. 指令 ...

  5. ARM汇编指令学习---基于启动文件startup.S分析

    本文主要是基于启动文件startup.s对ARM汇编指令进行学习分析. 以 . 开头一般是伪汇编/操作指令,形如: .section伪操作来定义一个段,形如: .section .testsectio ...

  6. 常用的ARM汇编指令总结

    第一次写博客,请各路大神多多关照. 本人从事软件开发相关的工作,平时主要用c语言撸代码,前段时间因工作需要,接触到了ARM架构下的汇编指令,之前学过51单片机的汇编指令,早已经还给老师了,且ARM汇编 ...

  7. 将用户数据分成一个个数据块传输的优点不包括( )

    将用户数据分成一个个数据块传输的优点不包括( D ) A. 减少延迟时间 B. 提高错误控制效率 C. 使多个应用更公平地使用共享通信介质 D. 有效数据在协议数据单元(PDU)中所占比例更大 将用户 ...

  8. ARM汇编指令调试方法

    学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...

  9. ARM 汇编指令 MOV32用法

    前言 移植基于ARM平台的RTOS时,需要掌握一些基本的汇编指令,只有熟悉了这些ARM 的汇编指令,才能真正的掌握RTOS的移植方法 MOV32 指令,字面意思是 MOVE 一个 32位 值的意思,具 ...

  10. 嵌入式工程师到底要不要学习ARM汇编指令?arm学习文章汇总

    嵌入式工程师到底要不要学习ARM汇编指令? 网上搜索这个问题,答案很多,大部分的建议是不要学汇编,只要学C语言. 而一口君作为一个十几年经验的驱动工程师,个人认为,汇编语言还是需要掌握的,想要搞精.搞 ...

最新文章

  1. 蜘蛛搜索引擎_各大搜索引擎的蜘蛛特点
  2. js如何循环拼接字符串
  3. 信息安全技术网络安全等级保护定级指南_行业标准 |报业网络安全等级保护定级参考指南V2.0发布,明确保护对象、定级要求...
  4. 不懂Python装饰器?教程双手奉上!
  5. 爬虫入门【10】Pyspider框架简介及安装说明
  6. JTable 学习一
  7. stc 串口收发 c语言,STC15W408AS串口通讯PC乱码
  8. java编译出现乱码_java编译乱码解决方法
  9. AVOD-代码理解系列(四)
  10. 彻底搞懂虚拟地址翻译为物理地址的过程
  11. Qt静态函数中的信号和槽问题
  12. 解决办法:.bat文件运行不了,管理员运行后闪退
  13. 梯度与Roberts、Prewitt、Sobel、Lapacian算子
  14. SV实验3 子系统验证和测试点划分
  15. 【ts】typeScript高阶:any和unknown
  16. wps表格l制作甘特图_甘特图是什么?-如何用WPS表格做甘特图
  17. 圆桌问题(数据结构作业+数组和链表)(1024程序员不容易,这次给源码)
  18. CSDN专访:吃喝玩乐背后的黑科技
  19. 2021年Linux技术总结(三):根文件系统(rootfs)
  20. 看,抽签问题还能这样写。。

热门文章

  1. 实现web版用户注册(可以上传头像)
  2. ES6的这些新知识你记住了没?
  3. SEO—搜索引擎优化初探
  4. IOS 多个UIImageView 加载高清大图时内存管理
  5. Java Object[] 向下强转的时候可能会发生异常
  6. 假如在1996年,微软、IBM、苹果你会投资谁?
  7. fscanf、fprintf的返回值
  8. linux解压zip
  9. 3.工作组环境下的应用
  10. jstack分析CPU高的问题