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     }
    #endif
    

    Soweit 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 soll

    ASM_BEGIN
      ASM_(mov eax,ebx)
      ASM_END
    

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


Anmelden zum Antworten