ARM指令ldr、str、stm、ldm理解

本文详细解析了ARM指令集中用于数据加载和存储的LDR, STR, LDM及STM指令。LDR用于从内存加载数据到寄存器,STR则相反,将寄存器数据存储到内存。LDM一次性加载多个连续内存地址的数据到寄存器,而STM则将多个寄存器数据存储到内存,常用于堆栈操作。LDM和STM指令的执行方向是从左到右,与LDR, STR相反,并且它们都涉及堆栈指针SP的操作。
摘要由CSDN通过智能技术生成

1.LDR:L表示LOAD

理解为:Load from memory into register。

LDR   R1,     [R2]

R1【寄存器】<——[R2]【内存RAM】

将R2的memory内容copy到R1寄存器.

2.STR:S表示STORE

理解为:Store from a register into memory.

STR    R1,     [R2]

R1【寄存器】——>[R2]内存RAM】

将R1寄存器内容copy到R2的memory.

(3)LDM:L的含义仍然是LOAD(连接寄存器和连续内存的相互copy)

理解为:Load from memory into register。

虽然貌似是LDR的升级,但是,千万要注意,这个指令运行的方向和LDR是不一样的,是从左到右运行的。该指令是将内存中堆栈内的数据,批量的赋值给寄存器,即是出栈操作;其中堆栈指针一般对应于SP,注意SP是寄存器R13,实际用到的却是R13中的内存地址,只是该指令没有写为[R13],同时,LDM指令中寄存器和内存地址的位置相对于前面两条指令改变了,下面的例子:

LDMFD     SP! ,   {R0, R1, R2}

实际上可以理解为:    LDMFD     [SP]!,    {R0, R1, R2}

意思为:把sp指向的3个连续地址段(应该是3*4=12字节(因为为r0,r1,r2都是32位))中的数据拷贝到r0,r1,r2这3个寄存器中去(如果这个地方还不懂的话,可以参看我文章开头提到的链接,里面有详细的图解)

(4)STM:S的含义仍然是STORE,与LDM是配对使用的,其指令格式上也相似,即区别于STR,是将堆栈指针写在左边,而把寄存器组写在右边。

   STMFD      SP!,   {R0}

同样的,该指令也可理解为:  STMFD      [SP]!,   {R0}

意思是:把R0保存到堆栈(sp指向的地址)中。

显然,这两个堆栈操作指令也有个特点,就是寄存器组写在后面(右边)而堆栈指针写在前面(左边),而且实际上使用的是堆栈指针中的内存地址,这一点与前面两条指令是有区别的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值