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