我最近不得不调试一个 MachO 二进制文件,我遇到了以下指令:-
ldr.w r4, [r1, r0, lsl #2]
我知道ldr r4, [r1, r0, lsl #2]
将 r0 向左移动两次,将其添加到 r1 并取消引用结果。
ldr.w 有何不同?
.W
是一个可选的指令宽度说明符。它不会影响指令的行为,它只是确保生成 32 位指令。有关详细信息,请参阅infocenter.arm.com:
Thumb-2 中的 LDR(pc 相对) 您可以使用 .W 宽度说明符强制 LDR 在 Thumb-2 代码中生成 32 位指令。LDR.W 始终生成 32 位指令,即使可以使用 16 位 LDR 达到目标。对于前向引用,不带 .W 的 LDR 始终在 Thumb 代码中生成 16 位指令,即使这会导致使用 32 位 Thumb-2 LDR 指令可以达到的目标失败。
来自ARM 汇编器手册:
您可以使用 .W 宽度说明符强制 LDR 在 Thumb-2 代码中生成 32 位指令。LDR.W 始终生成 32 位指令,即使可以使用 16 位 LDR 达到目标。
有ARM和拇指指令。一些处理器对 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,您会看到这一点)。