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

Siehe auch

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