有的时候,CPU可能会遇到 a++; b++; c++,这个时候为了提升效率,CPU可能会一次将多个寄存器里的变量保存到内存中。这个时候之前介绍的 LDR / STR 指令虽然也能实现,但只能操作一个寄存器的读写。

因此,考虑到这点,下面介绍多个寄存器的读写指令

  • 将多个寄存器的数据写入到内存              —— STM指令
  • 从内存中读取数据保存到多个寄存器       —— LDM指令 

          目录

1、基本读写指令

(1) STM 指令

(2) LDM 指令

2、多寄存器的内存读写方式

(1) 后缀 IA(默认)

(2) 后缀 IB

(3) 后缀 DA

(4) 后缀 DB


1、基本读写指令

(1) STM 指令

STM指令的作用是将多个寄存器的数据依次保存到内存中的某一个位置。

指令格式:

  • STM 第一操作寄存器,  {起始寄存器 - 末尾寄存器}
  • STM 第一操作寄存器,  {寄存器1,  寄存器2, ...}
MOV R1, #0x1
MOV R2, #0x2
MOV R3, #0x3
MOV R4, #0x4
MOV R11, #0x40000000STM R11, {R1-R4}      @ 将R1-R4寄存器中的数据保存到以R11为起始位置的内存中(R11地址不随内存自增)STM R11, {R1, R2, R3, R4} @ 与上面等价(R11地址不随内存自增,即R11就是起始地址)STM R11!, {R1, R2, R3, R4}  @ 在R11的后面加上“ ! ”可以让R11中的地址随内存的存储位置自增变化

注意:花括号{ }中的寄存器编号顺序建议是升序,即便是乱序或者是降序,会优先将寄存器编号较小的保存到内存。

(2) LDM 指令

LDM指令的作用是将内存中一段地址的数据保存到多个寄存器。(类似用法及注意事项可以参考STM指令)

指令格式:

  • LDM  第一操作寄存器,  {起始寄存器 - 末尾寄存器}
  • LDM  第一操作寄存器,  {寄存器1,  寄存器2, ...}
MOV R1, #0x1
MOV R2, #0x2
MOV R3, #0x3
MOV R4, #0x4
MOV R11, #0x40000000
STM R11, {R1-R4}      LDM R11, {R6-R9}        @ 将内存中以R11为起始地址的数据读取到 R6-R9 寄存器
LDM R11, {R6, R7,R8,R9} @ 与上述写法等价

 注意:读取的字节大小看有多少个寄存器,每个寄存器默认保存4个字节的数据。

2、多寄存器的内存读写方式

默认情况下,是以某一个寄存器指向的地址为起始地址,自低地址向高地址写入 / 读取。可以通过在上述基本指令的后面加后缀来改变内存的读写方式,比如自高地址向低地址写入、从起始位置的下一个地址开始写入。

下面以写内存为例。

MOV R1, #0x1
MOV R2, #0x2
MOV R3, #0x3
MOV R4, #0x4
MOV R11, #0x40000020
STM R11, {R1-R4}     @ 起始地址为 R11

(1) 后缀 IA(默认)

IA 表示 Increase After,先将数据保存到内存,然后再让地址自增。STM默认采用的方式与STMIA达到的效果是一样的。

STMIA R11!, {R1-R4}     @ 保存起始地址为 R11

注意:加“ ! ”了以后,寄存器中保存的地址会跟着内存的增长方向发生变化

(2) 后缀 IB

IA 表示 Increase Before,在写入内存之前先让R11自增4个字节,然后再开始存。

STMIB R11!, {R1-R4}     @ 保存起始地址为 R11 + 4

(3) 后缀 DA

DA 表示 Decrease After,先将数据保存到内存,然后再让地址自减。(自高地址到低地址存储)

STMDA R11!, {R1-R4}     @ 保存起始地址为 R11(自低地址向高地址存储)

(4) 后缀 DB

DB 表示 Decrease Before,在写入内存之前先让R11自减4个字节,然后再开始存。

STMDB R11!, {R1-R4}     @ 保存起始地址为 R11 - 4(自低地址向高地址存储)

寄存器内存读写指令(二) —— 多寄存器读写 LDM / STM相关推荐

  1. 8086汇编学习之[BX],CX寄存器与loop指令,ES寄存器等

    同类学习笔记总结: (一).8086汇编学习之基础知识.通用寄存器.CS/IP寄存器与Debug的使用 (二).8086汇编学习之DS寄存器.SS/SP寄存器 一.汇编程序的基本格式: 1.基本格式与 ...

  2. MySQL读写分离(二)——Atlas实现读写分离

           [引言]        Atlas是希腊神话被罚作苦役的大力神,在希腊神话中当巨人族首领泰坦反叛奥林匹斯众神战败后支持他的大多数都被打入地狱的黑暗深渊,而Atlas则被罚去西方站在地母盖 ...

  3. ARM体系架构—ARMv7-A指令集:内存操作指令

    ARM体系架构-ARMv7-A指令集 一.ARMv7-A指令集 一.ARMv7-A内存操作指令 二.单寄存器寻址内存操作指令 三.多寄存器寻址内存操作指令 四.SWP,SWPB 一.ARMv7-A指令 ...

  4. iOS汇编基础(二)寄存器

    以arm64为例 xcode调试汇编 1. xcode 查看运行时的汇编代码 debug -> debug workflow -> always show disassembly 2. X ...

  5. ARM汇编寄存器和常用指令详解

    文章目录 AAPCS关于ARM寄存器的定义 寄存器 R0~R12 通用寄存器 R13-SP(Stack Pointer) 栈寄存器 R14-LR(Link Register) 链接寄存器 R15-PC ...

  6. ARM64中的内存屏障指令

    内存屏障指令是系统编程中很重要的一部分,特别是在多核并行编程中.本章重点介绍内存屏障指令产生的原因.ARM64处理器内存屏障指令以及内存屏障的案例分析等内容. 18.2.1 使用内存屏障的场景 在大部 ...

  7. ARM指令寻址方式之: 内存访问指令寻址

    4.2  内存访问指令寻址 根据内存访问指令的分类,内存访问指令的寻址方式可以分为以下几种. ① 字及无符号字节的Load/Store指令的寻址方式. ② 杂类Load/Store指令的寻址方式. ③ ...

  8. ARM:特殊功能寄存器、Load/Store内存读写指令、栈操作指令

    1.特殊功能寄存器读写指令 msr -->>将普通寄存器中的数据写到特殊寄存器中 mrs -->>将特殊寄存器中的数据写到普通寄存器中 注:特殊寄存器 cpsr 的读写访问只能 ...

  9. STM32F429内部FLASH读写擦除操作流程和寄存器配置要点

    一.STM32F429 FLASH总体介绍 双bank架构,容量高达2 Mbytes,支持read-while-write边读边写(RWW) 支持128位宽的数据读取 Byte.half-word.w ...

最新文章

  1. Java基于Quartz的定时任务调度服务(一)
  2. 代码规范指南:怎样写才能干净整洁
  3. Spring容器中Bean的作用域
  4. 7-Qt6 qDeleteAll内存管理
  5. ITK:将图像翻转到指定的轴上
  6. C# Socket 编程详解
  7. 树形结构 —— 并查集 —— 基本操作
  8. VMWARE虚拟机中CentOs7网络连接
  9. WIN7下访问ftp的方法
  10. kotlin协程_Kotlin协程
  11. java网络学习之 ssh 协议学习总结
  12. 红米note3总显示无服务器,红米note3死机了怎么办 具体解决措施【图文】
  13. python opencv 读取png图像的alpha通道
  14. WHERE条件子句 | 零基础自学SQL课程系列Day5
  15. 【数据挖掘】《数据分析与数据挖掘》--天津大学公开课
  16. 加强计算机管理,浅谈如何加强高校计算机专业管理
  17. 辰光融信全面推出基于可信计算3.0技术的安全增强型打印机
  18. 清华学堂东侧木质结构焚毁心痛不已
  19. 实施工程师日常必备技能
  20. Python处理excel-根据全称自动填写简称

热门文章

  1. Kwp2000协议的应用(硬件原理使用篇)
  2. paddle报ValueError: (InvalidArgument) Pass tensorrt_subgraph_pass has not been registered
  3. Spring Batch简单入门(四) - Job启动与监控
  4. 虚拟化系统(XenServer,ESXi)-ESXi
  5. 图片嵌入一张图片python_python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码...
  6. Spring boot 中使用BBoss-ES进行ES的增删改查
  7. ble协议栈从零开始八(security manager 最细致分析上)
  8. 河南省2016至2020年植被覆盖度年产品数据下载
  9. Android中的IPv6
  10. Java卸载工具JavaUninstallTool