帮我解释下LDMIA R0!,{ R5-R8}的功能等。。。在线等!谢谢!

发布网友 发布时间:2022-04-23 22:15

我来回答

1个回答

热心网友 时间:2023-10-11 18:48

貌似这个问题是很久之前的,应该都解决了吧,那附带说一下。

批量加载/存储指令
ARM微处理器所支持的批量数据加载/存储指令可以一次在一片连续的存储器单元和多个寄存器之间传送数据,批量加载指令用于将一片连续的存储器中的数据传送到多个寄存器,批量数据存储指令则完成相反的操作。常用的加载存储指令如下:

LDM (批量数据加载指令)
LDM{条件}{类型} 基址寄存器{!},寄存器列表{∧}

LDM(或STM)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈或出栈。
其中,{类型}为以下几种情况:
IA 每次传送后地址加1;
IB 每次传送前地址加1;
DA 每次传送后地址减1;
DB 每次传送前地址减1;
FD 满递减堆栈;
ED 空递减堆栈;
FA 满递增堆栈;
EA 空递增堆栈;

{!}为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。基址寄存器不允许为R15,寄存器列表可以为R0~R15的任意组合。

{∧}为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR。

例如:
STMFD R13!,{R0,R4-R12,LR}
将寄存器列表中的寄存器(R0,R4到R12,LR)存入堆栈。

LDMFD R13!,{R0,R4-R12,PC}
将堆栈内容恢复到寄存器(R0,R4到R12,LR)

有了以上必备知识后,lz的问题就很容易理解了。
把r0所存放的基址,通过基址寄存器寻址方式,
把r0所指向的内容给r5后 r0向后移,之后就是依次给 r6 r7 r8,等等,!感叹号代表则当数据传送完毕之后,将最后的地址写入基址寄存器。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com