Hi Ich brauche mehrere 256 Word Sprungtabelle, die so ausgerichtet ist, dass das Lowbyte der Adresse die Sprungposition bestimmt. Irgendwie scheint p2align aber nur manchmal zu funktionieren. So funktioniert eine Sprungtabelle, eine andere wiederum nicht. Die Sprungtabelle selbst sie ungefähr so aus: .p2align 9 TABLE: rjmp func rjmp func2 ... rjmp func256 Aufruf: ldi ZH, pm_hi8(TABLE) ijmp // ZL == index Die Tabelle landet dann an der Wordadresse 0x4778. Auch andere Argumente für p2align werden nicht richtig umgesetzt. Ich habe align schon früher genutzt und da hat es als funktioniert. Es scheint als wäre das ein Glücksfall gewesen. Wie bringt man den avrgas und eher Linker dazu die Tabellen an die richtige Stellen zu setzen?
Genau so, wie es oben steht. Oder steht es etwa anders da? Gibst du den Code so direkt zum Assembler, oder ist das Code der ausm avr-gcc kommt?
Mit anderen Bezeichner steht es genauso im Code. Der Code steht in einer .inc-Datei, die über eine .s-Datei inkludiert wird (die Sprungtabelle selbst wurde mit einem Script generiert). Das ganze ist in einem AtmelStudio6-Projekt und das nutzt m.W. avrgcc. Die Adresse an der das ganze landet habe ich aus dem Listing. Zwischen Assemblercode und Listing sollte doch (fast) kein Unterschied sein? Fast, weil mir aufgefallen ist, dass relax eingeschaltet ist. Das stört mich aber nicht (man darf halt keine jmp-Tabellen bauen), aber möglicherweise wird dieser Schritt nach dem Alignment ausgeführt und zerstört dieses. Ich weiß aber gerade nicht wie ich diesen Schalter deaktiviere - das Feld mit dem Argumenten ist readonly.
ich habe den Schalter gefunden: Es ist leider -mrelax. Der Code wird dadurch kürzer und die Adressen stimmen nicht mehr. Kann man das irgendwie beheben? Ansonsten muss ich einen anderen Weg suchen um die Tabellen an richtige Adressen zu bringen. Ein Makro um call durch rcall schon im Code zu ersetzen wäre auch eine Lösung, aber dafür scheinen die avrgas Makros nicht mächtig genug, oder irre ich mich da?
avr schrieb: > ich habe den Schalter gefunden: Es ist leider -mrelax. Dann ist es m.E. ein Bug im avr-ld mit --relax. Alignment-Direktiven sollten ihre Wirkung behalten, auch mit --relax. Ist bislang wohl nicht aufgefallen weil auf AVRs praktisch nie ein Alignment > 2 gebraucht wird. > Der Code wird > dadurch kürzer und die Adressen stimmen nicht mehr. Kann man das > irgendwie beheben? Ansonsten muss ich einen anderen Weg suchen um die > Tabellen an richtige Adressen zu bringen. Eigene Section und dieser in der Linker Description ein Alignment verpassen? Vielleicht greift dann der Bug nicht. > Ein Makro um call durch rcall schon im Code zu ersetzen wäre auch eine > Lösung, aber dafür scheinen die avrgas Makros nicht mächtig genug, oder > irre ich mich da? Das müsste dann eine Optimierung im avr-as sein, die es aber bislang nicht gibt. Evtl. geht auch ein 2-schrittiger Link: 1) Relocatable Link: Die Tabelle wird ohne --relax gelinkt und unkritischer Code mit --mrelax 2) Alle pre-gelinkten Module werden in einem final Link kominiert. Allerdings weiß ich nicht, ob avr-ld auch in 19 relaxt. Wenn nicht hast du Pech. Was auch gehen könnte, ist den Code in eine Section ohne x-Flag zu legen, in denen führt avr-ld nämlich kein Relaxing durch (weil es dann als Daten aufgefasst wird, nicht als Code).
Ich würde die Sprungtabelle gerne in eine eigene Section packen, es gibt da nur ein paar Probleme weil die Sprungtabelle sehr groß ist. Deswegen müssen die Funktionen um die Sprungtabelle verteilt werden. Die eine Hälfte ist über ihr, die andere darunter und genauso muss es am Ende auch im Flash stehen. Danke für den Tipp mit den Sections: Ich kann das Programm richtig "kompilieren", wenn ich sowohl die Sprungtabelle in eine eigene Section packe und den Funktionsblock davor ebenfalls in eine eigene. Mir gefällt nur nicht, dass der Linker vielleicht mal auf die Idee kommen würde die Sections anders zu verteilen (darf er das?). Daher weiß ich nicht ganz in wie weit diese Lösung sauber ist. Die Section habe ich übrigens mit "ax" erstellt.
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.