__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. Es kann nicht allein angezeigt werden. Ihm muss eine Assemblyanweisung, eine Gruppe von Anweisungen, die in geschweifte Klammern eingeschlossen sind, oder zumindest ein leeres Paar geschweifter 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:
__asm
assembly-instruction ;
opt
__asm {
assembly-instruction-list }
;
opt
assembly-instruction-list:
assembly-instruction ;
opt
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 war die Anweisung
__asm int 3
nicht dazu da, dass nativer Code generiert wurde, 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 einen Haltepunkt im Code verursachen und diese Funktion in MSIL kompiliert werden soll, verwenden Sie __debugbreak.
Aus Gründen der Kompatibilität mit früheren Versionen ist _asm
ein Synonym für __asm
, es sei denn, die Compileroption /Za (Spracherweiterungen 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 Klammern kann der Compiler nicht feststellen, wo Assemblycode endet 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 __asm
-Blöcke auch schachteln. Schachtelung wirkt sich nicht auf den Variablenbereich aus.
Ende Microsoft-spezifisch