我最近不得不调试一个MachO二进制文件,我遇到了以下指令: -
ldr.w r4, [r1, r0, lsl #2]
我理解ldr r4, [r1, r0, lsl #2]
将r0向左移动两次,将其添加到r1并取消引用结果。
ldr.w有何不同?
答案 0 :(得分:6)
.W
是可选的指令宽度说明符。它不会影响指令的行为,它只是确保生成32位指令。有关详细信息,请参阅infocenter.arm.com:
Thumb-2中的LDR(pc-relative) 您可以使用.W宽度说明符强制LDR在Thumb-2代码中生成32位指令。 LDR.W始终生成32位指令,即使可以使用16位LDR达到目标。 对于正向引用,不带.W的LDR总是在Thumb代码中生成16位指令,即使这会导致使用32位Thumb-2 LDR指令可以达到的目标失败。
答案 1 :(得分:1)
您可以使用.W宽度说明符强制LDR生成32位 Thumb-2代码中的指令。 LDR.W始终生成32位 指令,即使可以使用16位LDR达到目标。
答案 2 :(得分:1)
有ARM和拇指指令。某些处理器具有拇指指令的thumb2扩展,这些指令好,坏或其他类似于ARM指令。有时你可能想要一个并且正在获得另一个。当然,您可以使用.w来表示更宽的32位thumb2指令而不是16位拇指指令。有时候语法很明显你想要哪一个,因为与ARM和thumb2相比,thumb2指令是非常有限的。
另请注意,thumb2有不同的风格,在ARMv6和ARMv7之间有很大差异。我想我计算了30-40个ARMv6 thumb2指令和100多个ARMv7 thumb2指令。 (你会看到这个,如果你使用cortex-m3并习惯了它,现在尝试使用cortex-m0)。