首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 24-03-18 04:56
  • 4761
  • 10864
blog.csdn.net

有的时候,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, ...} 
  1. MOV R1, #0x1
  2. MOV R2, #0x2
  3. MOV R3, #0x3
  4. MOV R4, #0x4
  5. MOV R11, #0x40000000
  6. STM R11, {R1-R4} @ 将R1-R4寄存器中的数据保存到以R11为起始位置的内存中(R11地址不随内存自增)
  7. STM R11, {R1, R2, R3, R4} @ 与上面等价(R11地址不随内存自增,即R11就是起始地址)
  8. STM R11!, {R1, R2, R3, R4} @ 在R11的后面加上“ ! ”可以让R11中的地址随内存的存储位置自增变化

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

 

(2) LDM 指令

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

指令格式:

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

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

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

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

下面以写内存为例。

  1. MOV R1, #0x1
  2. MOV R2, #0x2
  3. MOV R3, #0x3
  4. MOV R4, #0x4
  5. MOV R11, #0x40000020
  6. 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(自低地址向高地址存储)

注:本文转载自blog.csdn.net的仲夏夜之梦~的文章"https://blog.csdn.net/challenglistic/article/details/128364230"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top