¿Cómo puedo saltar con relación a la PC usando el ensamblador GNU para AVR?
-
21-09-2019 - |
Pregunta
Tengo un archivo binario que he desmontado utilizando AVR-objcopy. La tabla de vectores de interrupción se ve así:
00000000 : ; VECTOR TABLE 0: 13 c0 rjmp .+38 ; 0x28, RESET 2: b8 c1 rjmp .+880 ; 0x374, INT0 4: fd cf rjmp .-6 ; 0x0 6: fc cf rjmp .-8 ; 0x0 8: fb cf rjmp .-10 ; 0x0 a: fa cf rjmp .-12 ; 0x0 c: f9 cf rjmp .-14 ; 0x0 e: f8 cf rjmp .-16 ; 0x0 10: f7 cf rjmp .-18 ; 0x0 12: c7 c1 rjmp .+910 ; 0x3a2, TIMER1 OVF 14: f5 cf rjmp .-22 ; 0x0 16: f4 cf rjmp .-24 ; 0x0 18: f3 cf rjmp .-26 ; 0x0 1a: f2 cf rjmp .-28 ; 0x0 1c: 2b c2 rjmp .+1110 ; 0x474, ADC conversion complete 1e: f0 cf rjmp .-32 ; 0x0 20: ef cf rjmp .-34 ; 0x0 22: ee cf rjmp .-36 ; 0x0 24: ed cf rjmp .-38 ; 0x0 26: 00 00 nop ; START 28: f8 94 cli (snip)
Quiero volver a montar este archivo con algunas modificaciones. He formateado mediante la eliminación de las 2 primeras columnas de manera que se trata de un archivo de ensamblaje regular. es decir:
.org 0 rjmp .+38 ; 0x28, RESET rjmp .+880 ; 0x374, INT0 (snip)
Sin embargo, cuando corro
$ avr-as -mmcu=atmega8 test.asm
y luego desmontar el archivo generado. (Usando objcopy -S a.out) La salida será similar a:
00000000 : 0: 00 c0 rjmp .+0 ; 0x2 2: 00 c0 rjmp .+0 ; 0x4 4: 00 c0 rjmp .+0 ; 0x6 6: 00 c0 rjmp .+0 ; 0x8 8: 00 c0 rjmp .+0 ; 0xa a: 00 c0 rjmp .+0 ; 0xc c: 00 c0 rjmp .+0 ; 0xe e: 00 c0 rjmp .+0 ; 0x10 10: 00 c0 rjmp .+0 ; 0x12 12: 00 c0 rjmp .+0 ; 0x14 14: 00 c0 rjmp .+0 ; 0x16 16: 00 c0 rjmp .+0 ; 0x18 18: 00 c0 rjmp .+0 ; 0x1a 1a: 00 c0 rjmp .+0 ; 0x1c 1c: 00 c0 rjmp .+0 ; 0x1e 1e: 00 c0 rjmp .+0 ; 0x20 20: 00 c0 rjmp .+0 ; 0x22 22: 00 c0 rjmp .+0 ; 0x24 24: 00 c0 rjmp .+0 ; 0x26 26: 00 00 nop 28: f8 94 cli (snip)
Entonces, ¿cómo puedo obtener avr-como de respetar los saltos de PC-relación?
Solución
He encontrado la respuesta!
I estaba reuniendo pero no vinculación. Así que el compilador estaba llenando en todos los saltos / llamadas / ramas en relación con. + 0.
Para solucionar este problema que necesitaba para crear una secuencia de comandos personalizada enlazador llamé linker.x que contiene lo siguiente:
SECTIONS { . = 0x0; .text : { *(.text) } }
Esto le dice al enlazador para comenzar la sección .text en la dirección 0.
Entonces podría vincular el código usando:
$ avr-ld -mavr4 -Tlinker.x a.out -o output.o
Después de enlazar con el comando, sobre todo, de la. + 0 de se rellenaron con sus valores correctos!
La razón de esto, es porque hasta la etapa de vinculación, como / gcc no sé qué más va a ser incluido en el archivo binario. Es el enlazador que tiene todos los archivos de objetos individuales y las combina en una sola. Así que si la etapa enlazador no se ejecuta, no hay manera de llenar los saltos relativos con saltos absolutos.
ensambladordel AVR hace el tanto montaje y de unión. Pero el ensamblador GNU es más genérico y por lo que necesita para vincular por separado.
Otros consejos
Estoy asumiendo que rjmp PC+2
no funciona en avr-as? Así es como lo haría en AVR Studio ...