【问题标题】:difference between ldr and ldr.wldr 和 ldr.w 的区别
【发布时间】:2012-03-21 07:50:26
【问题描述】:

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

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

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

ldr.w 有何不同?

【问题讨论】:

    标签: assembly arm thumb


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      来自ARM Assembler Manual

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-07
          • 2021-12-15
          • 2014-11-10
          • 2017-04-06
          • 2013-08-07
          • 2011-10-20
          • 2020-01-23
          相关资源
          最近更新 更多