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

标签 assembly arm gnu-assembler thumb devkitpro

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

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

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

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

最佳答案

您应该提供 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

 

关于assembly - 强制 LDR 指令将值放入 THUMB 程序集的文字池中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67255061/

相关文章:

assembly - i386汇编问题: why do I need to meddle with the stack pointer?

assembly - 如何通过 x86 BIOS 调用移动光标?

assembly - 为什么对非核心响应/非核心请求的需求过多?

assembly - 为什么 ARM 区分 SDIV 和 UDIV,而不区分 ADD、SUB 和 MUL?

embedded - 在嵌入式 Linux (ARM7) 上构建 Mono

c - 如何使用 ARM gcc 7.3 生成以下 arm 汇编程序输出?

GNU 汇编器预处理器定义

c - 使用 C 和程序集创建用户级线程的段错误

memory - 澄清: Processor operates at 800 Mhz and 200Mhz DDR RAM

linux - 将 .org 指令与 .data 部分 : In connection with ld 中的数据一起使用