强制LDR指令将值放入THUMB程序集中的文字池中
我正在尝试使用 devkitpro 创建匹配的 GBA 反汇编,但我在使用 THUMB 指令时遇到了问题LDR R1, =0x3FF。
我希望它放在0x3FF文字池中并生成一个相对于 PC 的地址,这是汇编版本所做的,但是它坚持创建一个MOVW32 位指令。
我尝试使用长度说明符LDR.N强制它生成 16 位指令,但这似乎没有任何区别。
虽然我可以直接使用相对于 PC 的地址,但由于这是在文字池的中间,这将导致我不得不删除大量的池并以相同的方式实现加载,这将非常混乱,所以这只是最后的手段。如果有人知道某种方式,我可以强制此指令生成一个与 PC 相关的地址,这将非常有帮助。谢谢!
回答
下次您提出问题时,您应该提供一个最小的、可重现的示例,因为这将使人们更容易为您提供帮助。
我可能误解了您的问题,但我没有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 ,例如, to 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