ARM指令集-Load/Store指令【ldr,str,ldm,stm,swp,swpb】

本文详细介绍了ARM指令集中用于内存访问的Load/Store指令,包括单寄存器的LDR和STR,以及多寄存器的LDM和STM指令,用于在内存和寄存器间传输数据。同时,还提到了单寄存器交换指令SWP,用于实现寄存器与内存内容的交换。这些指令是理解ARM处理器数据处理的基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存访问指令。包括单寄存器Load/store多寄存器Load/Store单寄存器交换指令

单寄存器Load/Store指令

LDR指令

将内存地址中的32bit数据加载到Rd。

  1. 指令格式

LDR{<cond>} <Rd>, <addr_mode>

  1. 指令举例
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
  1. 拓展
    <addr_mode>是Rn{, <shifter_operand>}的组合,再加上后置索引偏移
STR指令

将Rd的值存入内存地址。

  1. 指令格式

STR{<cond>} Rd, <addr_mode>

  1. 指令举例
    同上,只是箭头方向相反
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指令

在一组寄存器与一块连续内存单元之间传送数据。
因为不同机器内存采用的栈增长方向可能不同。有下表

condIAIBDADBEAEDFAFD
LDMaddr++++addraddr- -- -addrsp++sp- -++sp- -sp
STMaddr++++addraddr- -- -addrsp++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

  1. 指令格式

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

  1. 指令格式

STM{<cond>} <模式>

  1. 指令举例
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指令
  1. 指令格式

SWP{<cond>} <Rd>, <Rm>, [<Rn>]

  1. 指令举例
SWP r1, r1, [r0]		;将r1与 [r0]交换
SWP r1, r2, [r3]		;r2 —> [r3], r1 <— [r3]
  1. 拓展
    SWPB,Rm寄存器低字节存入地址,内存单元一字节内容存入寄存器Rd
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值