2012-04-10 56 views
8

我最近开始为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部分不在组装阶段的最后内存位置,但我找不到任何相关的东西。

尽管我发现了一种由

.org . 

这不是一个令人满意的解决方案,以获得正确安装后,代码通过更换

.section .data 

。特别是鉴于气体文件突出了这一部分的意义。

也许你专家有人能帮助我获得一些智慧

回答

13

看来你能做到这一点是通过抓取变量的地址并加载来自该地址的值的唯一途径。

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

+0

谢谢您的解释和示例。这个或类似的东西应该放入binutils文档的arm部分。我会记住链接器的规模很大,编码器的规模较小。如果我有一些额外的时间,我会研究一些拆解的C程序,并希望获得更多的见解... – user1146332 2012-04-16 13:08:34

+0

这是公认的答案? – aditya 2013-04-23 12:30:40