Freigeben über


Definieren von __asm-Blöcken als C-Makros

Microsoft-spezifisch

C-Makros bieten eine bequeme Möglichkeit zum Einfügen von Assemblycode in Den Quellcode, erfordern aber zusätzliche Sorgfalt, da ein Makro in eine einzige logische Zeile erweitert wird. Gehen Sie wie folgt vor, um problemefreie Makros zu erstellen:

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

  • Platzieren Sie die __asm Schlüsselwort (keyword) vor jeder Assemblyanweisung.

  • Verwenden Sie C-Kommentare im alten Stil ( /* comment */) anstelle von Kommentaren im Assemblystil ( ; comment) oder einzeilige C-Kommentare ( // comment).

Das folgende Beispiel definiert ein einfaches Makro:

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

Auf den ersten Blick scheinen die letzten drei __asm Schlüsselwort (keyword) überflüssig zu sein. Sie sind jedoch erforderlich, da das Makro in eine einzelne Zeile erweitert wird:

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

Die dritten und vierten __asm Schlüsselwort (keyword) werden als Anweisungstrennzeichen benötigt. Die einzigen in __asm Blöcken erkannten Anweisungstrennzeichen sind das Neuelinezeichen und __asm Schlüsselwort (keyword). Da ein als Makro definierter Block eine logische Zeile ist, müssen Sie jede Anweisung trennen mit __asm.

Die geschweiften Klammern sind ebenfalls unerlässlich. Wenn Sie sie weglassen, kann der Compiler von C- oder C++-Anweisungen in derselben Zeile rechts neben dem Makroaufruf verwechselt werden. Ohne die schließende geschweifte Klammer kann der Compiler nicht erkennen, wo assemblycode beendet wird, und er sieht C- oder C++-Anweisungen nach dem __asm Block als Assemblyanweisungen.

Kommentare im Assemblystil, die mit einem Semikolon (;) beginnen, fahren mit dem Ende der Zeile fort. Dies verursacht Probleme in Makros, da der Compiler alles nach dem Kommentar ignoriert, bis zum Ende der logischen Zeile. Das gleiche gilt für einzeilige C- oder C++-Kommentare ( // comment). Um Fehler zu vermeiden, verwenden Sie C-Kommentare im alten Stil ( /* comment */) in __asm Blöcken, die als Makros definiert sind.

Ein als C-Makro geschriebener __asm Block kann Argumente annehmen. Im Gegensatz zu einem normalen C-Makro kann ein __asm Makro jedoch keinen Wert zurückgeben. Daher können Sie solche Makros nicht in C- oder C++-Ausdrücken verwenden.

Achten Sie darauf, Makros dieses Typs nicht diskriminierend aufzurufen. Beispielsweise kann das Aufrufen eines Assemblysprachenmakros in einer funktion, die mit der __fastcall Konvention deklariert ist, zu unerwarteten Ergebnissen führen. (Siehe Verwenden und Beibehalten von Registern in Inlineassembly.)

Ende Microsoft-spezifisch

Siehe auch

Inlineassembler