__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:
__asm
Assembly-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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für