Frage

Ich habe eine Binärdatei, dass ich auseinander genommen habe mit avr-objcopy. Die Interruptvektortabelle sieht aus wie:

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)

Ich mag diese Datei mit einigen Änderungen wieder zusammenzusetzen. Ich habe es neu formatiert, indem die ersten zwei Spalten zu entfernen, so dass es eine regelmäßige Baugruppendatei ist. dh:

.org 0
    rjmp    .+38            ;  0x28, RESET
    rjmp    .+880           ;  0x374, INT0
(snip)

Allerdings, wenn ich laufe

$ avr-as -mmcu=atmega8 test.asm

und dann zerlegt die erzeugte Datei. (Unter Verwendung von objcopy ES a.out) Die Ausgabe sieht wie folgt:

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)

Wie kann ich avr-as die PC-bezogener Sprünge zu respektieren?

War es hilfreich?

Lösung

fand ich die Antwort!

Ich war der Montage aber nicht verknüpfen. So ist der Assembler wurde mit in allen relativen Sprüngen / Anrufe / Filialen zu füllen. + 0.

Um dies zu beheben Ich brauchte eine benutzerdefinierte Linker-Skript erstellen I linker.x genannt, die folgende enthält:

SECTIONS
{
  . = 0x0;
  .text : { *(.text) }
}

Dies teilt den Linker mit 0 den .text Abschnitt an der Adresse zu starten.

Dann könnte ich den Code Link:

$ avr-ld -mavr4 -Tlinker.x a.out -o output.o

Nach der Verknüpfung des obigen Befehl alle der Verwendung. + 0s wurden mit ihren korrekten Werten gefüllt!

Der Grund dafür ist, weil bis zur Verknüpfung der Bühne, wie / gcc weiß nicht, was sonst in der Binärdatei enthalten sein wird. Es ist der Linker, der sie alle einzelnen Objektdateien und Mähdreschern in eine nimmt. Also, wenn die Linker Bühne nie ausgeführt wird, gibt es keine Möglichkeit, in den relativen Sprüngen mit absoluten Sprüngen zu füllen.

AVR Assembler funktioniert die sowohl die Montage und die Verknüpfung. Aber das Gnu Assembler ist generisch und so Sie Link müssen getrennt.

Andere Tipps

Ich gehe davon aus, dass rjmp PC+2 funktioniert nicht in avr-as? Das ist, wie ich tun würde es in AVR Studio ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top