2

我注意到在 ARM 程序集中,有 3 种类型(据我所知,可能还有更多)加载/存储命令。到目前为止,我已经看到:

    STR R0, [R1, #4]

    STR R0, [R1], #4

    LDR R0, R1, #4

这些只是我见过的命令的示例。注意最后一个命令是如何加载而不是存储的,那是因为我还没有看到 STR R0、R1、#4,所以我不知道这样写是否会编译。

我知道 #4 意味着将 R1 增加 4(可能),但是与上述命令中的 [] 有什么区别?

4

1 回答 1

6

第一个是preindexed:在执行操作之前将偏移量添加到基数:

STR r0, [r1, #4]

表示存储在地址 r1+0x4 完成

请注意,存在预索引 + 回写。此操作将执行相同的存储操作,但基地址将更新为地址。所以最后R1 = R1 + 4

STR r0, [r1, #4]!

另一个是后索引的,这总是意味着回写:

STR r0, [r1], #4

在这种情况下,存储操作使用地址 r1(无偏移),但基址寄存器更新到R1 = R1 + 0x4存储之后。

对于某些指令,您可以使用作为寄存器的偏移量,有时使用移位。例如:

STR r0, [r1, r2] ; Store at address r1 + r2
STR r0, [r1, r2 LSL #2] ; Store at address r1 + r2 x 4

并非所有加载/存储指令都可以具有所有寻址模式。

于 2016-06-10T18:52:54.107 回答