Übersicht über Inlineassembler
Microsoft-spezifisch
Mit dem Inlineassemblyer können Sie Anweisungen zur Assemblysprache in Ihre C- und C++-Quellprogramme ohne zusätzliche Assembly- und Linkschritte einbetten. Der Inlineassembler ist im Compiler integriert, daher benötigen Sie keinen getrennten Assembler wie den Microsoft Macro Assembler (MASM).
Da der Inlineassembler keine separaten Assembly- und Verknüpfungsschritte erfordert, ist er einfacher als ein getrennter Assembler. Inlineassemblycode kann beliebige C- oder C++-Variablen oder Funktionsnamen verwenden, die sich im Gültigkeitsbereich befinden, sodass es einfach in den C- und C++-Code Ihres Programms integriert werden kann. Und da der Assemblycode mit C- und C++-Anweisungen gemischt werden kann, kann er Aufgaben ausführen, die allein in C oder C++ umständlich oder unmöglich sind.
Die __asm Schlüsselwort (keyword) ruft den Inlineassembler auf und kann überall dort angezeigt werden, wo eine C- oder C++-Anweisung legal ist. Es kann nicht allein stehen. 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.
Der folgende Code ist ein einfacher __asm
Block, der in geschweifte Klammern eingeschlossen ist. (Der Code ist eine Prologsequenz für eine benutzerdefinierte Funktion).
// asm_overview.cpp
// processor: x86
void __declspec(naked) main()
{
// Naked functions must provide their own prolog...
__asm {
push ebp
mov ebp, esp
sub esp, __LOCAL_SIZE
}
// ... and epilog
__asm {
pop ebp
ret
}
}
Alternativ können Sie __asm
vor jede Assemblyanweisung setzen:
__asm push ebp
__asm mov ebp, esp
__asm sub esp, __LOCAL_SIZE
Da das __asm
-Schlüsselwort ein Trennzeichen für Anweisungen ist, können Sie die Assemblyanweisungen auch in die gleiche Zeile einfügen:
__asm push ebp __asm mov ebp, esp __asm sub esp, __LOCAL_SIZE
Ende Microsoft-spezifisch