我最近开始为 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/