assembly - 内部搬迁未解决

标签 assembly arm gnu-assembler

我最近开始为 ARM 内核进行汇编程序编程。我的第一个小演示仅包含 .text 部分,运行时没有任何问题。

作为逻辑扩展,我想将汇编代码构建为常用部分:.text、.data、.bss。

所以我编写了以下简单的程序:

 .globl _start

 .section .text

 _start:
     b   main
     b   .
     b   .
     b   .
     b   .
     b   .
     b   .
     b   .  


 main:
    ldr r0, x
    nop

 .section .data

 x:  .word  0xf0f0f0f0

 .end

但是

  /opt/arm/bin/arm-as -ggdb -mcpu=arm7tdmi demo.s -o demo.o

退出并出现错误

 prog.s: Assembler messages:
 prog.s:17: Error: internal_relocation (type: OFFSET_IMM) not fixed up
 make: *** [prog.o] Error 1

我不知道为什么汇编器会提示重定位,因为我认为这是链接器的任务。我可以想象我必须告诉汇编器我的 .data 部分不位于汇编阶段的最终内存位置,但我找不到任何相关内容。

虽然我找到了一种正确组装代码的方法,通过替换

 .section .data

 .org .

这不是一个令人满意的解决方案。特别是考虑到气体文档突出了本节的意义。

也许你们中的一些专家可以帮助我获得一些智慧

最佳答案

似乎唯一的方法就是获取变量的地址并从该地址加载值。

ldr r1,=x    ; get address of x
ldr r0,[r1]  ; load from that address

从某种程度上来说,这也是有道理的。毕竟,如果 x 的地址(链接后)距离 PC 相对访问太远怎么办?由于编译器(不进行链接)不知道数据部分与文本部分的距离有多远,因此它会拒绝编译该代码,以防万一无法访问该代码。

通过使用这种间接方式访问变量,可以保证该变量是可访问的(或者至少编译器可以确定该变量是否可访问)。

代码改编自http://www.zap.org.au/elec2041-cdrom/examples/intro/pseudo.s

关于assembly - 内部搬迁未解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10094282/

相关文章:

linux - 什么时候CPSR GE[3 :0] bits be modified

assembly - "GCC -S"的汇编输出: why does .全局定位在.data之前?

assembly - 如果目标文件定义了 _start 并且不使用任何库,为什么我仍然需要链接它才能执行它?

assembly - 使用 ".intel_syntax noprefix"如何获取标签的内存地址?

c - 不正确的寄存器 0x​​104567910 与 '%rbx' 后缀一起使用

c++ - 如果编写内联汇编而不是常规的 c/c++ 代码,速度会快多少?

c - 在 C++ 函数中执行汇编

c - 在 ARM C 调用约定中要保存哪些寄存器?

c++ - ARM:如何获取当前上下文

ios - __attribute __((constructor))对于iOS编译成什么?如何在手写的asm中进行?