Forum: Compiler & IDEs Kommentare in .S Dateien


von T.S. (Gast)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

.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.

von T.S. (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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            /*                   */

von T.S. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.