Moeglichkeiten von Makros bei Sonderzeichen
-
Hallo,
ich benutze in meinem Programm Assembler-code. Das Programm wurde unter MSVC geschrieben. Die Syntax sieht hier so aus
__asm { ... Assembler-Code in Intel-Syntax ... }also ganz einfach.
Nun moechte ich mein Programm aber auch mit dem Gnu-Compiler unter Linux kompilieren koennen. Leider sieht die entsprechende Sytax hier etwas spastisch aus:
__asm__("Assembler-Anweisung in AT&T-Syntax"); __asm__("naechste Assembler-Anweisung in AT&T-Syntax"); __asm__("naechste Assembler-Anweisung in AT&T-Syntax"); ...oder
__asm__("Assembler-Anweisung in AT&T-Syntax;\n" "naechste Assembler-Anweisung;\n" ... "letzte Assembler-Anweisung;");oder
__asm__("Assembler-Anweisung in AT&T-Syntax;\n \ naechste Assembler-Anweisung;\n \ ... letzte Assembler-Anweisung;");Zum Glueck gibt es in den neueren GCC-Compilern einen Schalter um von der umstaendlichen AT&T-Syntax auf die einfachere Intel-Syntax umzustellen.
Ich moechte nun ein Makro schreiben welches in Abhaengigkeit vom benutzten Compiler unterschiedlich definiert ist, also etwa so:#ifdef __GNUC__ #define ASM_BEGIN __asm__(".intel-syntax noprefix;\n" #define ASM_(a) "a\n" // !!! funktioniert leider nicht !!! #define ASM_END ".att-syntax noprefix\n"); #elif #define ASM_BEGIN __asm { #define ASM_(a) a #define ASM_END } #endifSoweit funktioniert's, so lange ich kein Assembler-Code mit dem ASM_(a)-Makro dazwischen packe.
Das Problem ist jetzt, dass ich Assembler-Code schreibe umrahmt von Makro-Befehlen, welche dafuer sorgen, dass unter GCC Anfuehrungsszeichen gesetzt werden und unter MSVC nicht. Zum Beispiel sollASM_BEGIN ASM_(mov eax,ebx) ASM_ENDzu entweder (MSVC)
__asm { mov eax,ebx }oder zu (GCC)
__asm__(".intel-syntax noprefix" "mov eax,ebx\n" ".att-syntax noprefix");werden.
Obige Makro-Deklararion funktioniert aber nicht, aus zwei Gruenden:
1.) ich kann kein Makroargument per Makro in Anfuehrungzeichen setzen lassen, zu mindest nicht wie oben versucht.
2.) Assembler-Anweisungen mit Kommata (wie im Beispiel) werden vom Preprozessor als zwei Makroargumente interpretiert nicht als eines in welchem ein Komma vorkommt.Weis jemand wie ich per Makrobefehl oder irgendwie anders in Abhaengigkeit vom Compiler Anfuehrungzeichen einfuegen oder auch gesetzte Anfuehrungszeichen entfernen kann. Oder faellt jemand eine alternative Loesung zu meinem beschriebenen Problem ein?
Vielen Dank im Voraus
-
Zum Ersten:
define ASM(a) #a "\n"(# ist ein Präprozessor-Operator und setzt verwandelt sein Argument in ein String-Literal)
Zum Zweiten:
Tut mir leid, aber afaik gibt es keine Möglichkeit, das Komma als Teil des Makros zu verwerten. Du könntest es höchstens entschärfen, indem du doppelte Klammern verwendest (aber ich weiß nicht, wie der Inline Assambler mit den zusätzlichen Klammern umgehen kann).