一、寄存器间接寻址(LDR/STR)
通用格式
读:LDR{cond}{S}{B/H} Rn, [Rm]
写:STR{cond}{B/H} Rn, [Rm]
格式参数说明
- Rn:目标寄存器(存放读取结果 / 待写入内存的数据)
- Rm:内存地址,Rm 是基址寄存器,Rm 中存放的数值为内存地址 修饰符说明
- B:Byte,1 字节
- H:Half Word,半字,2 字节
- S:Signed,有符号扩展;短数据转 32 位 无 S:无符号,高位补 0;带 S:有符号,高位补符号位
统一规则:Rm 的值作为内存地址,指令执行完毕 Rm 数值不变
LDR R3,[R5]; 将 R5 指向地址的 32 位字数据加载到 R3,R5 值不变STRH R3,[R5]; 将 R3 低 16 位半字保存到 R5 指向的地址,R5 值不变LDRSH R3,[R5]; 将 R5 指向地址的 2 字节数据符号扩展为 32 位加载到 R3,R5 值不变
二、多寄存器寻址(LDMxx/STMxx)
通用格式
读:LDMxx Rm!, {寄存器列表}
写:STMxx Rm!, {寄存器列表} 格式参数说明
- xx:寻址后缀 IA/IB/DA/DB,控制地址增减时机
- Rm:基址寄存器,存放内存起始地址
- ++!:回写标记,传输完成后自动更新 Rm 的值++
- {寄存器列表}:一组需要读写的通用寄存器
- 注意:{} 内为寄存器列表,逗号分隔;连续寄存器可用
-简写,寄存器++编号从小到大排列++
后缀含义
- 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:寄存器组→内存块 |
速记要点
- LD 代表读(内存→寄存器),ST 代表写(寄存器→内存)
- ++单条指令与批量指令数据流向不变,仅操作数左右顺序相反++
- I 地址增大、D 地址减小;A 传输后改地址、B 传输前改地址