ldr和ldr.w之间的区别

时间:2012-03-21 07:50:27

标签: assembly arm thumb

我最近不得不调试一个MachO二进制文件,我遇到了以下指令: -

ldr.w r4, [r1, r0, lsl #2]

我理解ldr r4, [r1, r0, lsl #2]将r0向左移动两次,将其添加到r1并取消引用结果。

ldr.w有何不同?

3 个答案:

答案 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)

来自ARM Assembler Manual

  

您可以使用.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)。