Megosztás:


C vagy C++ adatok elérése __asm blokkokban

Microsoft-specifikus

A beágyazott assembly nagy előnye, hogy név szerint lehet hivatkozni a C vagy C++ változókra. A __asm blokkok bármilyen szimbólumra hivatkozhatnak, beleértve a változóneveket is, amelyek hatókörében a blokk jelenik meg. Ha például a C változó var hatókörben van, az utasítás

__asm mov eax, var

az var értékét tárolja az EAX-ben.

Ha egy osztály, struktúra vagy unió- vagy tagváltozó egyedi névvel rendelkezik, egy __asm blokk csak a tagnév használatával hivatkozhat rá, anélkül, hogy a pont (typedef) operátor előtt megadná a változó vagy nevet. Ha azonban a tagnév nem egyedi, akkor egy változót vagy typedef nevet közvetlenül az időszak operátora elé kell helyeznie. Például a következő példában a same_name szereplő struktúratípusok tagnévként szerepelnek.

Ha változókat deklarál a típusokkal

struct first_type hal;
struct second_type oat;

A tagra same_name mutató összes hivatkozásnak a változó nevét kell használnia, mert same_name nem egyedi. A tagnak weasel azonban egyedi neve van, így csak a tag nevével hivatkozhat rá:

// 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;
}

Vegye figyelembe, hogy a változó nevének kihagyása csupán kódolási kényelem. A rendszer ugyanazokat az összeállítási utasításokat hozza létre, függetlenül attól, hogy a változó neve jelen van-e.

A C++-ban az adattagokat hozzáférési korlátozások nélkül érheti el. Tagfüggvényeket azonban nem hívhat meg.

END Microsoft-specifikus kifejezés

Lásd még

C vagy C++ használata __asm blokkokban