【发布时间】:2012-03-21 07:50:26
【问题描述】:
我最近不得不调试一个 MachO 二进制文件,我遇到了以下指令:-
ldr.w r4, [r1, r0, lsl #2]
我了解ldr r4, [r1, r0, lsl #2] 将 r0 向左移动两次,将其添加到 r1 并取消引用结果。
ldr.w 有何不同?
【问题讨论】:
我最近不得不调试一个 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 指令可以达到的目标失败。
【讨论】:
您可以使用 .W 宽度说明符强制 LDR 生成 32 位 Thumb-2 代码中的指令。 LDR.W 总是生成一个 32 位 指令,即使使用 16 位 LDR 可以达到目标。
【讨论】:
有 ARM 和 thumb 指令。一些处理器对 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,您会看到这一点)。
【讨论】: