ARM程序集中带[]和不带命令的命令之间的区别

时间:2016-06-08 14:54:07

标签: assembly arm

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

    STR R0, [R1, #4]

    STR R0, [R1], #4

    LDR R0, R1, #4

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

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

谢谢。

1 个答案:

答案 0 :(得分:1)

第一个是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

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