1

我有两个关于 DA 寻址模式的问题。例如:

STMDA R0!, {R1-R7}

根据ARM 体系结构参考手册,起始地址为R0 - (7 * 4) + 4,结束地址为。R0-24R0

所以:

  1. 的值R1将存储到R0-24orR0吗?
  2. 如果R1存储到R0-24,那么后续存储将向内存顶部增长(从R0-24R0)?
4

3 回答 3

4

当使用 ARM 多次存储和加载时,寄存器值总是按升序加载/存储在内存中。因此,当使用降序多重存储时,寄存器被向后写入内存。您的STMDA说明有效地分解为以下步骤:

  • 存储R7R0
  • 存储R6R0 - 4
  • 存储R5R0 - 8
  • 存储R4R0 - 12
  • 存储R3R0 - 16
  • 存储R2R0 - 20
  • 存储R1R0 - 24
  • 减去 28 R0(因为写回- !)。

所以,回答你的问题:

  1. 的值R1将存储在R0 - 24。(在这里,我的意思是R0执行指令之前的值,而不是之后的值。您正在使用写回 -!所以在指令之后,R0将从中减去 28。)

  2. R1存储在R0 - 24,但如上所述,R1是最后一个将其值存储在内存中的寄存器。 R7首先存储,然后从那里开始的后续存储在内存中向下增长。

我不得不承认我不知道任何支持这个答案的文档。此外,自从我上次进行任何 ARM 编码以来已经有一段时间了。但是,我绝对记得想知道 ARM 如何将寄存器存储在递减的多重存储中。我通过编写一个简短的程序来找出答案。

于 2009-11-17T15:16:03.980 回答
0

搜索 arm arm ARM 架构参考手册...

形成的第一个地址是 ,并且是基址寄存器的值减去 中指定的寄存器数量的四倍,再加上 4。后续地址是通过将前一个地址增加四来形成的。为 中指定的每个寄存器生成一个地址。

于 2009-11-20T02:45:53.887 回答
0

部分伪代码如下所示:

address = start_address for i = 0 to 15 if register_list[i] == 1 then Memory[address,4] = Ri address = address + 4

好像STM的增长方式和存储数据时的寻址方式没有关系?它总是从低地址到高地址存储数据,寻址方式只根据R0决定起始地址?

于 2009-11-20T04:08:19.150 回答