Hallo, Ich habe gerade etwas merkwürdiges entdeckt und kann mir keinen Reim darauf machen. Aus Geschwindigkeitsgründen habe ich in meinem aktuellen Projekt eine eigene Datei mit handgeschriebenem ASM-Code erstellt welche alle Zugriffe auf ein T6963 GLCD erledigt. Der Dateiname überrascht keinen: t6963c.S Nun ist es so, das wenn in einem Kommentar, also nach ';' in der gleichen Zeile, ein '\' steht, die folgende Zeile nicht übersetzt wird. Und auch nur dann wenn '\' als letztes Zeichen da steht. Folgt ein weiteres, ist alles ok. Beispiel: .global t6963c_clear .func t6963c_clear t6963c_clear: ; Screen#0 löschen ldi r20, 0x00 ; ldi r21, lo8(0x0000) ; L \ ldi r22, hi8(0x0000) ; H / Startadresse ldi r23, lo8(0x1000) ; ldi r24, hi8(0x1000) ; rjmp t6963c_fill_mem ; .endfunc Diese Zeile ldi r22, hi8(0x0000) ; H / Startadresse wird einfach nicht übersetzt. Ändere ich diese Zeile ldi r21, lo8(T6963C_SCR_0_START); L oder in ldi r21, lo8(T6963C_SCR_0_START); L \ Startadresse funktioniert alles wie erwartet. Eine kleine Ewigkeit habe ich gesucht um das zu finden. Die Doku http://www.nongnu.org/avr-libc/user-manual/index.html habe ich vorwärts und rückwärts gelesen. Hmm. Muß ich mir diese Schreibweise in den Kommentaren abgewöhnen und/oder habe ich etwas in der Doku übersehen? Torsten
.S Dateien werden durch den C-Präprozessor gejagt und für den ist \ am Zeilenende ein Hinweis den Zeilenwechsel zu ignorieren und die nächste Zeile anzuhängen. Dadurch wird aus asm 1 ; \ asm 2 das entstehen asm 1 ; asm 2 D.h. asm2 landet im Kommentar. Wenn du den C-Präprozessor nicht verwenden willst, achte auf .s als Typ des Quellcodes.
Stefan Das die Dateiendung eine Rolle spielt, d.h. *.s != *.S habe ich irgendwo schon einmal gelesen. Mehr in Richtung C++ war bis jetzt meine Vermutung. Bekannt ist mir auch das der Präprozessor in einer ASM-Datei Hand anlegt. Nur das auch Kommentare ausgewertet werden hielt ich bis heute für unmöglich. Nun gut, Bug oder Feature. Meine Kommentare muß ich wohl ändern. ;) Danke für den Hinweis. Torsten
Nein, es wird nicht ,,der Kommentar ausgewertet'', sondern es wird durch den Präprozessor daraus ein langer Kommentar. Der Präprozessor läuft vor dem Assembler und weiß gar nicht, dass das jetzt gerade ein Kommentar sein soll. Du kannst das durch Anhängen eines Leerzeichens verhindern, denn nur die Folge "\\\n" bewirkt das Zusammenfügen der Zeilen, "\\ \n" würde es nicht bewirken. Da man das folgende Leerzeichen aber typischerweise im Editor nicht sieht, ist das wohl eher hässlich. Das Feature erlaubt es, Zeilen an beliebigen Stellen zu trennen, du kannst also auch schreiben
1 | t6963c_\ |
2 | clear: |
Du kannst dafür im Gegenzug auch normale C-Kommentare schreiben, denn diese werden vom Präprozessor durch Leerzeichen ersetzt. Damit ließe sich dein Beispiel umschreiben auf:
1 | t6963c_clear: |
2 | ; Screen#0 löschen |
3 | ldi r20, 0x00 /* */ |
4 | ldi r21, lo8(0x0000) /* L \ */ |
5 | ldi r22, hi8(0x0000) /* H / Startadresse */ |
6 | ldi r23, lo8(0x1000) /* */ |
7 | ldi r24, hi8(0x1000) /* */ |
8 | rjmp t6963c_fill_mem /* */ |
Jörg Danke für die ausführliche Erläuterung. :) Auf die Idee die C-Kommentare auch in einer .S Datei anzuwenden bin ich gar nicht gekommen.
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.