5

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

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

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

ldr.w 有何不同?

4

3 回答 3

8

.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 指令可以达到的目标失败。

于 2012-03-21T07:58:35.340 回答
1

来自ARM 汇编器手册

您可以使用 .W 宽度说明符强制 LDR 在 Thumb-2 代码中生成 32 位指令。LDR.W 始终生成 32 位指令,即使可以使用 16 位 LDR 达到目标。

于 2012-03-21T07:58:40.673 回答
1

有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,您会看到这一点)。

于 2012-03-22T03:44:31.887 回答