我注意到在ARM程序集中,有3种类型(我知道,甚至可能更多)的加载/存储命令。到目前为止,我已经看到了:
STR R0, [R1, #4]
STR R0, [R1], #4
LDR R0, R1, #4
这些只是我见过的命令的例子。注意最后一个命令是如何加载而不是存储的,这是因为我还没有看到STR R0,R1,#4,所以我不知道写的是否会编译。
我知道#4意味着将R1增加4(可能),但上述命令中与[]的差异是什么?
谢谢。
答案 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
注意所有加载/存储指令都可以具有所有寻址模式。