Hallo, ich bin gerade dabei, meinen Assembler-Code so umzuschreiben, dass er "C-kompatibel" ist, also die Funktionen von C aus aufgerufen werden können etc. (Prozessor: ATmega8) Abgesehen von einigen Syntax-Unterschieden ging es bisher ganz gut und das Kompilieren funktioniert inzwischen. Beim Debuggen musste ich jedoch feststellen, dass gcc die Adressen der Labels als Byte-Adresse darstellt, während der ganz normale AVR-Assembler von Atmel diese als Word-Adresse darstellt. Fazit: gcc-Labels sind alle doppelt so groß! Kleiner Beispielcode zum Verdeutlichen (high und low habe ich als hi8 und lo8 definiert, weil gcc sonst meckert): ldi ZH, HIGH(label) ldi ZL, LOW(label) ijmp ... label: ... Hier springt gcc irgendwo ins Nirvana, da die Adresse doppelt so groß ist, wie eigentlich gedacht. Dabei funktioniert das im Avr-Assembler tadellos. Ein Versuch, die Adresse durch 2 zu teilen, brachte folgendes "Ergebnis" (Fehlermeldung): "../bus.S:257: Error: invalid sections for operation on `label' and `L0?'" Die Zeile, die diese Meldung verursacht: ldi ZL, LOW(label/2) Anscheinend versteht es gcc nicht einmal, dass ich einfach einen konstanten Ausdruck da hingeschrieben habe. Ein Trauerspiel! Fazit: - GNU-Assembler kann keine konstanten Ausdrücke! - GNU-Assembler kann keine Assembler-Makros der Art ".MACRO ... .ENDMACRO"! Wie macht ihr das, wenn ihr eine Assembler-Bibliothek in C braucht? Wo gibt es eine vollständige Syntax-Definition der Assemblerfunktionalität von avr-gcc? Wieso ist das nicht kompatibel? Gruß, David
David Madl wrote: > - GNU-Assembler kann keine konstanten Ausdrücke! Der Ausdruck ist nicht konstant, da der Wert des Labels erst dem Linker bekannt ist. Es gibt eine Notation, mit der sich das ausdrücken lässt. Der Compiler macht es auch nicht anders - der erzeugt nämlich Assembler-Code. > - GNU-Assembler kann keine Assembler-Makros der Art ".MACRO ... > .ENDMACRO"! Was kann der Assembler dafür, dass du nicht bereit bist, dessen Doku zur Kenntnis zu nehmen? > Wieso ist das nicht kompatibel? Kompatibel zu was? Zu Atmels Assembler, zu Intels Assembler, zu Motorolas Assembler, zu IBMs Assembler?
Andreas Kaiser wrote: > Der Ausdruck ist nicht konstant, da der Wert des Labels erst dem Linker > bekannt ist. Es gibt eine Notation, mit der sich das ausdrücken lässt. > Der Compiler macht es auch nicht anders - der erzeugt nämlich > Assembler-Code. Hätte vielleicht jemand auch die Freundlichkeit, mir diese Notation näherzubringen? > Was kann der Assembler dafür, dass du nicht bereit bist, dessen Doku zur > Kenntnis zu nehmen? Ich kann wohl was dafür, dass ich diese besagte Doku nirgendwo finde. Würde mir trotzdem bitte jemand eine URL posten, damit ich mich schlauer machen kann? > Kompatibel zu was? Zu Atmels Assembler, zu Intels Assembler, zu > Motorolas Assembler, zu IBMs Assembler? Eigentlich hätte ich mir erwartet, dass es zu Atmels Assembler kompatibel ist... Andererseits ist es ja auch nur gcc, und der wurde halt nicht für AVR entwickelt, sondern nur portiert, du hast schon Recht. Gruß David
http://www.nongnu.org/avr-libc/user-manual/assembler.html http://sourceware.org/binutils/docs-2.17/as/index.html
Die Recherche bei den URL's brachte die Erleuchtung: Gefundenes Snippet: ldi r24, lo8(pm(somefunc)) ldi r25, hi8(pm(somefunc)) call something pm() wirkt hierbei die benötigte Division durch 2. Dankeschön! Gruß David
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.