Wie kann ich an den PC relativ springen die Gnu-Assembler für AVR?
-
21-09-2019 - |
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?
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 ...