[GNU GCC] Unterschied asm und __asm__
-
Hi
beim inline assembler sehe ich öfters ich sowohl
asm volatile ( "code" );
als auch
__asm__ __volatile__ ( "code" );
was ist der Unterschied? Ich kann leider nichts passendes im google finden
-
'__asm' und '__asm__' sind historisch bedingte gcc erweiterungen. selbst zu 'asm' sagt C90 und C99 nur: "the asm keyword may be used to insert assembly language". da aber meines wissens nach 'asm' ein reserviertes schlüsselwort in c++ ist, sollte man dies bevorzugt verwenden. ich bin mir aber nicht sicher ob es bei 'asm' ggf. einschränkungen mit der syntax gibt (also clobber list und sowas).
-
Ich würde sagen dass es ziemlich egal ist. Die Chancen dass die GCC inline Assembler-Syntax mit einem anderen Compiler funktionieren sind sowieso recht mager. Kann man also gleich __asm__ verwenden, macht schon keinen Unterschied mehr.
Inline Assembler muss man IMO sowieso für jeden Compiler extra schreiben. Oder zumindest checken ob man bei Compiler X nicht was anders machen müsste als bei Compiler Y, auch wenn Compiler X den Code 1:1 frisst.Einige Compiler optimieren z.B. auch inline Assembler Code (AFAIK macht g++ das auch) - wenn man nicht aufpasst kann einem der Compiler schnell was wegoptimieren was man braucht. Oder was reordern, was man nicht reordert haben möchte.
-
sothis_ schrieb:
da aber meines wissens nach 'asm' ein reserviertes schlüsselwort in c++ ist, sollte man dies bevorzugt verwenden.
meinst du asm oder __asm__? eigentlich ist mir c++ völlig egal, meinen Mikrokernel schreib ich in C.
sothis_ schrieb:
ich bin mir aber nicht sicher ob es bei 'asm' ggf. einschränkungen mit der syntax gibt (also clobber list und sowas).
das war der Grund, warum ich fragte, weil meine inline assembler (mit clobber lists und so) sowohl beim __asm__ als auch bei asm dasselbe Ergebnis haben, sogar der binary Code ist gleich (hätte auch nur Zufall sein können).
hustbaer schrieb:
Einige Compiler optimieren z.B. auch inline Assembler Code (AFAIK macht g++ das auch) - wenn man nicht aufpasst kann einem der Compiler schnell was wegoptimieren was man braucht. Oder was reordern, was man nicht reordert haben möchte.
oh ja, deshalb nehme ich volatile mit dazu. Ist das eigentlich egal, ob ich asm volatile bzw volatile asm schreib? (die zweite hab ich nie probiert).
-
supertux schrieb:
meinst du asm oder __asm__? eigentlich ist mir c++ völlig egal, meinen Mikrokernel schreib ich in C.
asm
ohne unterstriche ist in c++ reserviert
-
supertux schrieb:
hustbaer schrieb:
Einige Compiler optimieren z.B. auch inline Assembler Code (AFAIK macht g++ das auch) - wenn man nicht aufpasst kann einem der Compiler schnell was wegoptimieren was man braucht. Oder was reordern, was man nicht reordert haben möchte.
oh ja, deshalb nehme ich volatile mit dazu. Ist das eigentlich egal, ob ich asm volatile bzw volatile asm schreib? (die zweite hab ich nie probiert).
Keine Ahnung
Ich weiss nur bei GCC kann man das sogar ziemlich fein steuern, was wo wie optimiert werden darf bzw. nicht optimiert werden darf.
Ich empfehle hier mal die GCC Doku, und ich persönlich würde auch die __x__ Varianten verwenden. Ganz einfach weil das die Version ist die ich schon öfter im "Code anderer Leute" gesehen hab
-
hustbaer schrieb:
Ich weiss nur bei GCC kann man das sogar ziemlich fein steuern, was wo wie optimiert werden darf bzw. nicht optimiert werden darf.
streich "kann man" und setze "muss man leider".
-
danke für die Antworten
-
__extension__ erlaubt der GCC auch in Code, den du mist -std=... und -pedantic(_errors) kompilierst. Das ist afair der Unterschied.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum Compiler- und IDE-Forum verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.