我有两个关于 DA 寻址模式的问题。例如:
STMDA R0!, {R1-R7}
根据ARM 体系结构参考手册,起始地址为R0 - (7 * 4) + 4
,结束地址为。R0-24
R0
所以:
- 的值
R1
将存储到R0-24
orR0
吗? - 如果
R1
存储到R0-24
,那么后续存储将向内存顶部增长(从R0-24
到R0
)?
我有两个关于 DA 寻址模式的问题。例如:
STMDA R0!, {R1-R7}
根据ARM 体系结构参考手册,起始地址为R0 - (7 * 4) + 4
,结束地址为。R0-24
R0
所以:
R1
将存储到R0-24
orR0
吗?R1
存储到R0-24
,那么后续存储将向内存顶部增长(从R0-24
到R0
)?当使用 ARM 多次存储和加载时,寄存器值总是按升序加载/存储在内存中。因此,当使用降序多重存储时,寄存器被向后写入内存。您的STMDA
说明有效地分解为以下步骤:
R7
在R0
R6
在R0 - 4
R5
在R0 - 8
R4
在R0 - 12
R3
在R0 - 16
R2
在R0 - 20
R1
在R0 - 24
R0
(因为写回- !
)。所以,回答你的问题:
的值R1
将存储在R0 - 24
。(在这里,我的意思是R0
执行指令之前的值,而不是之后的值。您正在使用写回 -!
所以在指令之后,R0
将从中减去 28。)
R1
存储在R0 - 24
,但如上所述,R1
是最后一个将其值存储在内存中的寄存器。 R7
首先存储,然后从那里开始的后续存储在内存中向下增长。
我不得不承认我不知道任何支持这个答案的文档。此外,自从我上次进行任何 ARM 编码以来已经有一段时间了。但是,我绝对记得想知道 ARM 如何将寄存器存储在递减的多重存储中。我通过编写一个简短的程序来找出答案。
搜索 arm arm ARM 架构参考手册...
形成的第一个地址是 ,并且是基址寄存器的值减去 中指定的寄存器数量的四倍,再加上 4。后续地址是通过将前一个地址增加四来形成的。为 中指定的每个寄存器生成一个地址。
部分伪代码如下所示:
address = start_address for i = 0 to 15 if register_list[i] == 1 then Memory[address,4] = Ri address = address + 4
好像STM的增长方式和存储数据时的寻址方式没有关系?它总是从低地址到高地址存储数据,寻址方式只根据R0决定起始地址?