我最近不得不调试一个MachO二进制文件,我遇到了以下指令:
ldr.w r4, [r1, r0, lsl #2]
据我所知,ldr r4, [r1, r0, lsl #2]
将r0向左移动了两次,将其添加到r1中,并取消对结果的引用。
ldr.w有什么不同?
发布于 2012-03-21 15:58:35
.W
是一个可选的指令宽度说明符。它不会影响指令本身的行为,它只是确保生成32位指令。有关详细信息,请参阅infocenter.arm.com:
在Thumb-2中,可以使用.W宽度说明符强制在Thumb-2代码中生成32位指令。LDR.W始终生成32位指令,即使可以使用16位LDR到达目标。对于前向引用,不带.W的LDR始终在Thumb代码中生成16位指令,即使这会导致使用32位Thumb-2 LDR指令可以到达的目标失败。
发布于 2012-03-21 15:58:41
从ARM Assembler Manual
您可以使用.W宽度说明符强制LDR在Thumb-2代码中生成32位指令。
始终生成32位指令,即使使用16位LDR可以到达目标。
发布于 2012-03-22 11:44:32
有手臂和拇指的说明。一些处理器具有对thumb指令的thumb2扩展,其好的、坏的或不好的类似于ARM指令。有时你可能想要一个,然后又得到了另一个。在thumb中,你当然可以添加.w来暗示更宽的32位thumb2指令,而不是16位的thumb指令。有时,由于与ARM和thumb2相比,thumb2指令受到很大的限制,所以语法很容易让人明白您想要哪一个。
还要注意,thumb2有不同的风格,在ARMv6和ARMv7之间有很大的不同。我想我数过了30-40条ARMv6 thumb2指令和100多条ARMv7 thumb2指令。(如果您曾经使用cortex m3并且已经习惯了它,现在尝试使用cortex m0,您将看到这一点)。
https://stackoverflow.com/questions/9800526
复制相似问题