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?

¿Fue útil?

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.

ensamblador

del 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 ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top