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

Force LDR instruction to place value in literal pool in THUMB assembly

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

我想让它把0x3FF放在文字池里,生成一个PC相对地址,汇编版就是这么做的,但是它坚持要创建一条MOVW 32位指令相反。

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

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

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

我可能误解了你的问题,但我在以下程序汇编的代码中没有得到任何 movw 指令 - 你可能只是为 [=18] 指定了错误的 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