Zugreifen auf C- oder C++-Daten in __asm-Blöcken
Microsoft-spezifisch
Eine große Hilfe der Inline-Assembly ist die Fähigkeit, auf C- oder C++-Variablen anhand ihres Namens zu verweisen. Ein __asm-Block kann auf alle Symbole, einschließlich Variablennamen verweisen, die im Bereich enthalten sind, in dem der Block erscheint. Wenn sich z. B. die C var-Variable im Gültigkeitsbereich befindet, die Anweisung
__asm mov eax, var
Speichert den Wert von var in EAX.
Wenn eine Klasse-, eine Struktur- oder ein Unionmember über einen eindeutigen Namen verfügt, kann ein __asm-Block nur mit dem Namen darauf verweisen, ohne dass die Variable oder der typedef-Name vor dem Punktoperator . angegeben werden muss. Wenn der Membername jedoch nicht eindeutig ist, müssen Sie eine Variable oder einen typedef-Namen direkt vor den Punktoperator setzen. Die Strukturtypen im der folgenden Beispiel geben z.B. same_name als ihren Membernamen frei.:
Wenn Sie Variablen mit den Typen deklarieren
struct first_type hal;
struct second_type oat;
Alle Verweise auf den Member same_name müssen den Variablennamen verwenden, da same_name nicht eindeutig ist. Aber der Member weasel verfügt über einen eindeutigen Namen, daher können Sie auf ihn nur mithilfe seines Membernamens verweisen:
// 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 ein Auslassen des Variablennamens nur der erleichterten Codierung dient. Die gleichen Assemblyanweisungen werden generiert, ob der Variablenname vorhanden ist oder nicht.
Sie können auf Daten-Member in C++ ohne Berücksichtigung von Zugriffsbeschränkungen zugreifen. Sie können jedoch keine Memberfunktionen aufrufen.
END Microsoft-spezifisch