__asm

Microsoft-spezifisch

Das __asm-Schlüsselwort ruft den Inlineassembler auf und kann immer da auftreten, wo eine C- oder C++-Anweisung gültig ist. Sie kann nicht allein angezeigt werden. Es muss eine Assemblyanweisung, eine Gruppe von Anweisungen in geschweifte Klammern oder mindestens ein leeres Paar geschweifte Klammern folgen. Der Begriff "__asm-Block" bezieht sich hier auf eine beliebige Anweisung bzw. Gruppe von Anweisungen, unabhängig davon, ob in geschweifte Klammern gesetzt oder nicht.

Hinweis

Visual C++-Unterstützung für das standardmäßige asm-C++-Schlüsselwort ist dahingehend eingeschränkt, dass der Compiler keinen Fehler für das Schlüsselwort generiert. Ein asm-Block generiert jedoch keinen sinnvollen Code. Verwenden Sie __asm anstelle von asm.

Grammatik

asm-block:
__asmAssembly-Anweisung;opt
__asm {assembly-instruction-list};opt

Assembly-Anweisungsliste:
Assembly-Anweisung;opt
assembly-instruction assembly-instruction-assembly-instruction-list;opt;

Hinweise

Wenn es ohne geschweifte Klammern verwendet wird, bedeutet das __asm-Schlüsselwort, dass der Rest der Zeile eine Assemblysprachanweisung ist. Wenn es mit geschweiften Klammern verwendet wird, bedeutet es, dass jede Zeile zwischen den geschweiften Klammern eine Assemblysprachanweisung ist. Aus Gründen der Kompatibilität mit früheren Versionen wird _asm synonym für __asm verwendet.

Da das __asm-Schlüsselwort ein Trennzeichen für Anweisungen ist, können Sie Assemblyanweisungen in die gleiche Zeile einfügen:

Vor Visual Studio 2005, der Anweisung

__asm int 3

hat nicht bewirkt, dass systemeigener Code generiert wird, wenn er mit /clr kompiliert wurde. Der Compiler übersetzte die Anweisung in eine CLR-Unterbrechungsanweisung.

__asm int 3 führt jetzt zur Generierung von systemeigenem Code für die Funktion. Wenn eine Funktion in Ihrem Code einen Haltepunkt verursachen soll und diese Funktion in MSIL kompiliert werden soll, verwenden Sie __debugbreak.

Aus Gründen der Kompatibilität mit früheren Versionen ist ein Synonym, __asm es sei denn, _asm die Compileroption /Za (Sprachenerweiterungen deaktivieren) ist angegeben.

Beispiel

Das folgende Codefragment ist ein einfacher __asm-Block, der in geschweifte Klammern eingeschlossen ist:

__asm {
   mov al, 2
   mov dx, 0xD007
   out dx, al
}

Alternativ können Sie __asm vor jede Assemblyanweisung setzen:

__asm mov al, 2
__asm mov dx, 0xD007
__asm out dx, al

Da das __asm-Schlüsselwort ein Trennzeichen für Anweisungen ist, können Sie auch Assemblyanweisungen in die gleiche Zeile einfügen:

__asm mov al, 2   __asm mov dx, 0xD007   __asm out dx, al

Alle drei Beispiele generieren den gleichen Code, aber das erste Format (der __asm-Block ist in geschweifte Klammern eingeschlossen) bietet einige Vorteile. Die geschweiften Klammern trennen den Assemblycode klar von C- oder C++-Code und vermeiden so die unnötige Wiederholung des __asm-Schlüsselworts. Geschweifte Klammern können auch Mehrdeutigkeiten verhindern. Wenn Sie eine C- oder C++- Anweisung in die gleiche Zeile wie einen __asm-Block eingeben möchten, müssen Sie den Block in geschweifte Klammern einschließen. Ohne die geschweiften Klammern kann der Compiler nicht erkennen, wo Assemblycode beendet wird, und C- oder C++-Anweisungen beginnen. Und Sie können Text einfach aus bestehenden MASM-Quelldateien kopieren und einfügen, da der Text in geschweiften Klammer das gleiche Format aufweist wie gewöhnlicher MASM-Text.

Anders als bei geschweiften Klammern in C und C++ wirkt sich das Einschließen eines __asm-Blocks in geschweifte Klammern nicht auf den Variablenbereich aus. Sie können auch Blöcke schachteln. Das Schachteln __asm wirkt sich nicht auf den Variablenbereich aus.

Ende Microsoft-spezifisch

Siehe auch

Schlüsselwörter
Inlineassembler