Ich habe ein Problem, welches ich absolut nicht nachvollziehen kann.
Müsste es meinem Inline-Assembler nicht ziemlich egal sein, wo ich
welchen Befehl positioniere? Ich habe folgendes Problem:
Setze ich im folgenden Code die beiden sts-Zeilen nach Repeat, dann
funktioniert die Übersetzung. Setze ich sie irgendwo vor Repeat, dann
kriege ich einen Fehler. "ld return 1 exit status", sehr viel aussagend.
Der Prozessor ist ein atxmega.
Kölner schrieb:> ld return 1 exit status
Das ist nur die Abbruchmeldung von make, aber nicht die Meldung vom ld.
> "cpi r30, 0x07 \n\t"> "brne weiter1 \n\t"> "cpi r31, 0xff \n\t"> "brne weiter1 \n\t"> "lds r14, %[M0S] \n\t"> "lds r15, %[M1S] \n\t"> "lds r20, %[OfS] \n\t"> "lds r21, %[OfS]+1 \n\t"> "sts %[OfI],r20 \n\t"> "sts %[OfI]+1,r21 \n\t"> "weiter1: \n\t">> "sbiw r24, 1 \n\t" //Schelife - 1> "brne repeat \n\t"
repeat ist nicht definiert.
> Wieso ist das so?
Mehr kann man nicht sagen, da der Kontext und die Constraints
Geheimhaltung unterliegen.
Keine Geheimhaltung, es funktioniert jedoch bis auf die Positionierung
von sts. Ich meinte mit "nach dem repeat" die letzte Zeiles meines
gezeigten Codes.
Nachdem die Infos etwas knapp sind, ein Schuß ins Blaue.
"sprechende" Label-Namen in Inline-Assembler sind nicht unbedingt eine
gute Idee. Wenn der Compiler auf die Idee kommt, den Inline-Assembler an
mehreren Stellen zu inlinen, hast Du duplicate symbols.
Wenn's unbedingt sprechende Namen sein sollen (und eben keine
diesbezüglich ungefährlichen "gas local labels" - Ziffern von 1-9 und
Referenzen darauf mit "b" und "f"), dann häng' wenigstens ein "%=" an
deine Label-Namen dran.
Dann bekommt jede "geinline-te" Inkarnation ein eigenes, eindeutiges
Suffix.
Kölner schrieb:> Es scheint echt die Sprunggröße zu sein. Was mach ich jetzt? Meine ca.> 30 Zeilen Inline-Assembler zerstückeln :( ?
Die Bedingung umdrehen und abhängig davon einen absoluten
Rücksprungbefehl vorwärts überspringen.
Hi
Kölner schrieb:> Meine ca.> 30 Zeilen Inline-Assembler zerstückeln :( ?
Wie viel kann der Compiler an dem Assembler ändern/anpassen?
~30 Instruktionen und >127 Byte Abstand - was für Klopper-Befehle muß
Der da raus machen?
Wenn es ~60 Befehle sind ... aber bei 'um die 30'?
MfG
Hi
Relativiert die 'Klopper' und bei ~30 Befehlen kommen ~60Byte zusammen
(oder halt ~30 Wörter) - da passt's wieder und kann schon Mal eng
werden.
Danke für den Link :)
MfG
Kai schrieb:> Wenn man hier schaut:> http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_BRNE.html>> sind es sogar nur 7bit... -64 bis +63
Ja, es sind nur 7 Bit. AAABER: wie im gesamten AVR8-Befehlssatz handelt
es sich bei Sprüngen und Verzweigungen immer um WORTadressen. D.h.: die
mögliche Sprundistanz ist tatsächlich -128 .. +126 BYTES (in
Zweierschritten).
> Relativiert die 'Klopper' und bei ~30 Befehlen kommen ~60Byte zusammen> (oder halt ~30 Wörter) - da passt's wieder und kann schon Mal eng> werden.
Nein. Eng werden kann es bei ~30 Instruktionen nur dann, wenn das
praktisch alles Mehrwort-Instruktionen sind. "sts" ist allerdings so
eine, die braucht nämlich zwei Worte.