强制 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
我正在尝试使用 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