Freigeben über


Definieren von __asm-Blöcken als C-Makros

Microsoft-spezifisch

C-Makros bieten eine einfache Möglichkeit gezeigt, Assemblycode in den Quellcode einfügen, jedoch erfordern zusätzliche Sorgfalt, da ein Makro in eine einzelne logische Zeile hinausgeht. Um störungsfreie Makros erstellen, führen Sie die folgenden Regeln:

  • Schließen Sie den __asm-Block in geschweiften Klammern ein.

  • Setzen Sie das Schlüsselwort __asm vor jeder Assemblyanweisung.

  • Verwenden Sie alte C-Kommentare ( /* comment */) statt der AssemblyFormatkommentare ( ; comment) oder C-Kommentare einzeiliger ( // comment).

Um zu veranschaulichen, wird im folgenden Beispiel ein einfaches Makro:

#define PORTIO __asm      \
/* Port output */         \
{                         \
   __asm mov al, 2        \
   __asm mov dx, 0xD007   \
   __asm out dx, al       \
}

Auf den ersten Blick erscheint die letzten drei __asm überflüssig. Schlüsselwörter Sie werden jedoch benötigt da das Makro in einer einzelnen Zeile erweitert:

__asm /* Port output */ { __asm mov al, 2  __asm mov dx, 0xD007 __asm out dx, al }

Beim dritten und vierten __asm Schlüsselwörter werden als Anweisungstrennzeichen erfordert. Die einzigen Anweisungstrennzeichen, die in __asm Blöcken erkannt werden, sind das Zeilenumbruchzeichen und das __asm-Schlüsselwort. Da ein Block, der als Makro definiert ist, eine logische Zeile ist, müssen Sie jede Anweisung mit __asm.

Die Klammern sind ebenfalls wichtig. Wenn Sie sie auslassen, kann der durch C- oder C++-Anweisungen auf derselben Zeile auf der rechten Seite des Makroaufrufs verwirrt werden. Ohne die schließende Klammer kann der Compiler nicht mitteilen, wo Assemblycode angehalten und der C- oder C++-Anweisungen nach der __asm-Block als Assemblyanweisungen anzuzeigen.

Kommentare im Assembly-Format, die mit einem Semikolon (;) anfangen, werden bis zum Ende der Zeile fortgesetz. Dies verursacht Probleme in Makros, da der Compiler alle nach dem Kommentar, ähnlich dem Ende der logischen Zeile ignoriert. Dasselbe gilt von einzeiligen C- oder C++-Kommentaren ( // comment). Um Fehler zu vermeiden, können Sie alte C-Kommentare ( /* comment */) in __asm, die als blockiert Makros definiert werden.

Ein __asm-Block, der als Wechselstrom-Makro geschrieben wird, kann Argumente akzeptieren. Anders als ein normales C-Makro kann jedoch ein __asm-Makro keinen Wert zurückgeben. Daher können Sie diese Makros in C- oder C++-Ausdrücken nicht verwenden.

Achten Sie darauf, dass Sie keine Makros dieses Typs wahllos aufrufen. Beispielsweise wird beim Aufrufen eines Assemblersprachenmakros in einer Funktion, die der Konvention __fastcall deklariert wird, unerwartete Ergebnisse. (Siehe Anwendung und Register im Inlineassembly von.)

END Microsoft-spezifisch

Siehe auch

Referenz

Inlineassembler