Freigeben über


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

Siehe auch

Referenz

Verwenden von C oder C++ in __asm-Blöcken