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

STMDA R0!, {R1-R7}

起始地址将是 R0 - (7 * 4) + 4, , 那是, R0-24, ,根据 ARM架构参考手册 和 end_address 将是 R0.

所以:

  1. 请问价值 R1 将被存储到 R0-24 或者 R0?
  2. 如果 R1 被存储到 R0-24, ,那么后续存储将向内存顶部增长(从 R0-24R0)?
有帮助吗?

解决方案 3

部分伪代码如下所示:

address = start_address for i = 0至15如果register_list [i] == 1,则存储[地址,4] = ri地址=地址=地址 + 4

看来STM的增长方式和存储数据时的寻址方式无关?它总是将数据从较低地址存储到更高,地址模式仅根据R0决定起始地址?

其他提示

当使用 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 如何以降序多重存储方式存储寄存器。我通过编写一个简短的程序来找出答案。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top