2012-04-10 8 views
8

Recientemente comencé la programación del ensamblador para núcleos de brazo. Mis primeros pequeños demos, solo con la sección .text, funcionaron sin ningún problema.reubicación interna no reparada

Como una extensión lógica, quería estructurar el código del ensamblador en las secciones habituales: .text, .data, .bss.

Así que escribí el siguiente programa simple:

.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 

Pero

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

salidas con el error

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

no tengo ni idea de por qué el ensamblador se queja de reubicación, porque pensé que esa es la tarea del enlazador. Me podría imaginar que tengo que decirle al ensamblador que mi sección .data no está ubicada en la posición de memoria final en la etapa de ensamblaje, pero no puedo encontrar nada relacionado.

Aunque he encontrado una manera para obtener el código ensamblado correctamente, mediante la sustitución de

.section .data 

por

.org . 

que no es una solución satisfactoria. Especialmente en vista del hecho de que la documentación del gas resalta el sentido de esta sección.

Tal vez alguien de ustedes, los expertos pueden ayudar a mí para ganar algo de sabiduría

Respuesta

13

Parece que la única manera de hacerlo es por el acaparamiento de la dirección de la variable y carga un valor de esa dirección.

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

En cierto modo, esto también tiene sentido. Después de todo, ¿qué ocurre si la dirección de x (después del enlace) está demasiado lejos para un acceso relativo de PC? Como el compilador (que no hace los enlaces) no sabe qué tan lejos puede estar la sección de datos de la sección de texto, se rehusaría a compilar ese código en caso de que no sea alcanzable.

Al utilizar esta forma indirecta de acceder a una variable, se garantiza que la variable será alcanzable (o al menos el compilador puede estar seguro de si la variable es alcanzable o no).

Código adaptado de http://www.zap.org.au/elec2041-cdrom/examples/intro/pseudo.s

+0

Gracias por su explicación y el ejemplo. Esto o algo similar debería ir a la sección del brazo de la documentación binutils. Memorizaré que el enlazador hace la gran escala y el codificador la reubicación a pequeña escala. Si tengo algo de tiempo extra, estudiaré algunos c-programs desarmados y espero obtener más información ... – user1146332

+0

¿es esta la respuesta aceptada? – aditya

Cuestiones relacionadas