Zugreifen auf C- oder C++-Daten in __asm-Blöcken
Microsoft-spezifisch
Ein großer Vorteil der Inlineassembly ist die Möglichkeit, nach Namen auf C- oder C++-Variablen zu verweisen. Ein __asm
Block kann auf alle Symbole, einschließlich Variablennamen, verweisen, die sich im Bereich befinden, in dem der Block angezeigt wird. Wenn sich beispielsweise die C-Variable var
im Bereich befindet, wird die Anweisung
__asm mov eax, var
speichert den Wert von var
in EAX.
Wenn ein Klassen-, Struktur- oder Union-Mitglied einen eindeutigen Namen hat, kann ein __asm
Block nur mithilfe des Membernamens darauf verweisen, ohne die Variable oder typedef
den Namen vor dem Periodenoperator (.) anzugeben. Wenn der Membername jedoch nicht eindeutig ist, müssen Sie eine Variable oder typedef
einen Namen unmittelbar vor dem Periodenoperator platzieren. Die Strukturtypen in der folgenden Beispielfreigabe same_name
werden beispielsweise als Membername verwendet:.
Wenn Sie Variablen mit den Typen deklarieren
struct first_type hal;
struct second_type oat;
Alle Verweise auf das Element same_name
müssen den Variablennamen verwenden, da same_name
er nicht eindeutig ist. Das Mitglied weasel
hat jedoch einen eindeutigen Namen, sodass Sie nur mit seinem Membernamen darauf verweisen können:
// InlineAssembler_Accessing_C_asm_Blocks.cpp
// processor: x86
#include <stdio.h>
struct first_type
{
char *weasel;
int same_name;
};
struct second_type
{
int wonton;
long same_name;
};
int main()
{
struct first_type hal;
struct second_type oat;
__asm
{
lea ebx, hal
mov ecx, [ebx]hal.same_name ; Must use 'hal'
mov esi, [ebx].weasel ; Can omit 'hal'
}
return 0;
}
Beachten Sie, dass das Weglassen des Variablennamens lediglich eine Codierungsfreundlichkeit ist. Die gleichen Assemblyanweisungen werden generiert, unabhängig davon, ob der Variablename vorhanden ist.
Sie können ohne Zugriffsbeschränkungen auf Datenmitglieder in C++ zugreifen. Sie können jedoch keine Memberfunktionen aufrufen.
Ende Microsoft-spezifisch