内存访问指令。包括单寄存器Load/store
、多寄存器Load/Store
、单寄存器交换指令
单寄存器Load/Store指令
LDR指令
将内存地址中的32bit数据加载到Rd。
- 指令格式
LDR{<cond>} <Rd>, <addr_mode>
- 指令举例
LDR r0, [r1] ;零索引偏移
LDR r0, [r1, #4] ;前置索引偏移, r0 <- r1 + 4, r1 += 4
LDR r0, [r1, -r2] ;零索引 r0 <- [r1 - r2]
LDR r0, [r1, r2, LSL #2] ;零索引
LDR r0, [r1], #4 ;后置索引偏移,r0 <- r1结束后r0 <- r0 + 4
- 拓展
<addr_mode>是Rn{, <shifter_operand>}的组合,再加上后置索引偏移
STR指令
将Rd的值存入内存地址。
- 指令格式
STR{<cond>} Rd, <addr_mode>
- 指令举例
同上,只是箭头方向相反
LDR r0, [r1] ;零索引偏移
LDR r0, [r1, #4]! ;前置索引偏移, r0 -> [r1+4], r1 += 4
LDR r0, [r1, -r2] ;零索引 r0 ->[r1 - r2]
LDR r0, [r1, r2, LSL #2] ;零索引
LDR r0, [r1], #4 ;后置索引偏移,r0 ->r1结束后r0 -> r0 + 4
总结
Load/Store指令,not影响CPSR。
同理LDRB, STRB,LDRH,STRH对应存取8、16位数据
多寄存器Load/Store指令
在一组寄存器与一块连续内存单元之间传送数据。
因为不同机器内存采用的栈增长方向可能不同。有下表
cond | IA | IB | DA | DB | EA | ED | FA | FD |
---|---|---|---|---|---|---|---|---|
LDM | addr++ | ++addr | addr- - | - -addr | sp++ | sp- - | ++sp | - -sp |
STM | addr++ | ++addr | addr- - | - -addr | sp++ | sp- - | ++sp | - -sp |
说明:
IA:Increase After
IB:Increase Before
DA: Decrease After
DB: Decrease Before
EA: Empty Ascend
ED: Empty Descend
FA: Full Ascend
FD: Full Descend
LDM指令
将内存单元中的数据加载到寄存器组中,32bit
- 指令格式
LDM{<cond>} <模式> Rn{!},reglist{…}
reglist 寄存器编号从小到大排列
2.指令举例
LDMIA r0, {r1-r3} ; r1 ~ r3的值存入r0表示的地址
LDMIA r0!, {r1, r3, r4}; 结束后 r0 = r0 + 4*3
STM指令
将寄存器组的值依次传送到[Rn],32bit
- 指令格式
STM{<cond>} <模式>
- 指令举例
STMDA r0, {r1-r3} ;r1~r3 —> [r0]
STMDA r0!,{r1,r3,,r5} ;结束后r0 = r0 - 4*3
总结
- 拓展
;stmia 与 stmfa等区别
STMDA r0!, {r5-r6}
...
LDMIB r0!, {r5-r6}
;使用堆栈指令时不需要调整cond,而数据块传送指令需要取补集
STMED r13!, {r5-r6} ;r13 = sp
...
LDMED r13!, {r5-r6}
单寄存器交换指令
寄存器与内存单元内容交换
SWP指令
- 指令格式
SWP{<cond>} <Rd>, <Rm>, [<Rn>]
- 指令举例
SWP r1, r1, [r0] ;将r1与 [r0]交换
SWP r1, r2, [r3] ;r2 —> [r3], r1 <— [r3]
- 拓展
SWPB,Rm寄存器低字节存入地址,内存单元一字节内容存入寄存器Rd