强制 LDR 指令将值放入 THUMB 程序集中的文字池中

Posted

技术标签:

【中文标题】强制 LDR 指令将值放入 THUMB 程序集中的文字池中【英文标题】:Force LDR instruction to place value in literal pool in THUMB assembly 【发布时间】:2021-04-25 15:27:04 【问题描述】:

我正在尝试使用 devkitpro 创建匹配的 GBA 反汇编,但在使用 THUMB 指令 LDR R1, =0x3FF 时遇到问题。

我希望它把 0x3FF 放在文字池中并生成一个 PC 相对地址,这是汇编版本所做的,但是它坚持创建一个 MOVW 32 位指令。

我尝试使用长度说明符 LDR.N 强制它生成 16 位指令,但这似乎根本没有任何区别。

虽然我可以直接使用 PC 相对地址,但由于它位于文字池的中间,这将导致我不得不删除大量池并以相同的方式实现加载,这将会很乱,所以这只是最后的手段。如果有人知道某种方式,我可以强制这条指令生成一个非常有用的 PC 相对地址。谢谢!

【问题讨论】:

这是哪个汇编程序?您是否尝试将 CPU 类型设置为 GBA 中使用的类型? 我正在使用 devkitpro 内置的汇编器,我相信它是 GNU 汇编器,它的程序名称是arm-none-eabi-as。我还没有尝试设置 CPU 类型,我该如何设置? @Arthur Tilly:作为新用户,我建议阅读这篇文章What should I do when someone answers my question?。 【参考方案1】:

您应该在下次提问时提供Minimal, Reproducible Example,因为这样更便于人们帮助您。

我可能误解了你的问题,但我在从以下程序组装的代码中没有得到任何 movw 指令 - 你可能只是为 GBA 指定了错误的 cpu,或者你可能正在使用默认cpu 不太可能是arm7tdmi,因为它是在 1994 年推出的。

ldr.s:

.cpu arm7tdmi
.thumb
ldr r1, =0x3ff
.end

/opt/arm/10/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-as -c ldr.s
/opt/arm/10/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-objdump -d a.out 

a.out:     file format elf32-littlearm


Disassembly of section .text:

00000000 <.text>:
   0:   4900            ldr     r1, [pc, #0]    ; (4 <.text+0x4>)
   2:   0000            .short  0x0000
   4:   000003ff        .word   0x000003ff

例如,将 cpu 设置为 cortex-m3,确实提供了与您所描述的内容一致的输出:

ldr.s:

    .cpu cortex-m3
    .thumb
    ldr r1, =0x3ff
    .end

    /opt/arm/10/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-as -c ldr.s
    /opt/arm/10/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-objdump -d a.out 
    
    a.out:     file format elf32-littlearm
    
    
    Disassembly of section .text:
    
00000000 <.text>:
   0:   f240 31ff       movw    r1, #1023       ; 0x3ff

 

【讨论】:

以上是关于强制 LDR 指令将值放入 THUMB 程序集中的文字池中的主要内容,如果未能解决你的问题,请参考以下文章

位置无关码(BL)与绝对位置码(LDR)

arm指令中mov和ldr有啥区别?

ARM中LDR伪指令与LDR加载指令

ARM指令和THUMB指令有啥区别

arm汇编—ldr加载指令,ldr伪指令

LDR 和 ADR 彻底详解