ARM|寄存器间接寻址 与 多个寄存器寻址(Multiple)

一、寄存器间接寻址(LDR/STR)

通用格式

读:LDR{cond}{S}{B/H} Rn, [Rm]

写:STR{cond}{B/H} Rn, [Rm]

格式参数说明

  1. Rn:目标寄存器(存放读取结果 / 待写入内存的数据)
  2. Rm:内存地址,Rm 是基址寄存器,Rm 中存放的数值为内存地址 修饰符说明
  • B:Byte,1 字节
  • H:Half Word,半字,2 字节
  • S:Signed,有符号扩展;短数据转 32 位 无 S:无符号,高位补 0;带 S:有符号,高位补符号位

统一规则:Rm 的值作为内存地址,指令执行完毕 Rm 数值不变

  1. LDR R3,[R5] ; 将 R5 指向地址的 32 位字数据加载到 R3,R5 值不变
  2. STRH R3,[R5] ; 将 R3 低 16 位半字保存到 R5 指向的地址,R5 值不变
  3. LDRSH R3,[R5] ; 将 R5 指向地址的 2 字节数据符号扩展为 32 位加载到 R3,R5 值不变

二、多寄存器寻址(LDMxx/STMxx)

通用格式

读:LDMxx Rm!, {寄存器列表}

写:STMxx Rm!, {寄存器列表} 格式参数说明

  1. xx:寻址后缀 IA/IB/DA/DB,控制地址增减时机
  2. Rm:基址寄存器,存放内存起始地址
  3. ++!:回写标记,传输完成后自动更新 Rm 的值++
  4. {寄存器列表}:一组需要读写的通用寄存器
  5. 注意:{} 内为寄存器列表,逗号分隔;连续寄存器可用-简写,寄存器++编号从小到大排列++

后缀含义

  • IA:Increase After 每次传输完成后地址 + 4
  • IB:Increase Before 每次传输前地址 + 4
  • DA:Decrease After 每次传输完成后地址 - 4
  • DB:Decrease Before 每次传输前地址 - 4

示例

复制代码
LDMIA R1! ,{R2-R7 ,R12} ;将 R1 指向的地址中的数据,依次加载到 R2-R7,R12 中,且 R1 的值会变
STMIA R0! ,{R2-R7 ,R12} ;将寄存器 R2-R7, R12 的值依次保存到 R0 指向的存储单元中,且 R0 的值会变

三、两类寻址核心对比

对比项 寄存器间接寻址 (LDR/STR) 多寄存器寻址 (LDMxx/STMxx)
操作数顺序 寄存器 Rn 在前,内存地址 Rm 在后 基址 Rm 在前,{寄存器组} 在后
! 回写标记 不支持,基址 Rm 不变 支持!,传输后自动更新基址
单次操作数量 仅单个寄存器,B/H/S 控制数据宽度 批量一组寄存器,单寄存器固定 4 字节
数据流向 LDR:内存→寄存器;STR:寄存器→内存 LDMxx:内存块→寄存器组;STMxx:寄存器组→内存块

速记要点

  1. LD 代表读(内存→寄存器),ST 代表写(寄存器→内存)
  2. ++单条指令与批量指令数据流向不变,仅操作数左右顺序相反++
  3. I 地址增大、D 地址减小;A 传输后改地址、B 传输前改地址
相关推荐
一直C14 天前
【ARM嵌入式开发】LCD液晶屏显示原理、色彩模式与显存地址映射详解
lcd·嵌入式·arm·寄存器·cortex-a7
一直C23 天前
ARM裸机开发|IMX6ULL GIC中断详解,中断流程、GIC版本分类、CP15协处理器
arm·imx6ull·寄存器
潘潘的嵌入式日记1 个月前
位操作怎么写才不出错?置位、清位、翻转、取位一次讲清
c语言·嵌入式·寄存器·位操作
一直C1 个月前
ARM入门学习Day01|ARM体系架构核心知识点梳理
arm·寄存器
H Journey4 个月前
用汇编语言写一个hello world,并进行汇编和编译
汇编·assembly·寄存器
zxsd_xyz4 个月前
LabVIEW寄存器教程
信息可视化·信号处理·labview·寄存器
浩浩测试一下5 个月前
汇编 高低八位寄存器数据存储方式(逆向分析)
汇编·网络安全·逆向·二进制·免杀·寄存器·windows编程
bucenggaibian6 个月前
C语言如何直接控制硬件?指针、内存与寄存器
c语言·内存·指针·寄存器·硬件控制
@insist1238 个月前
软考-软件设计师-计算机系统硬件基础与 CPU 核心构成
软考·cpu·软件设计师·寄存器