Доступ к данным C или C++ в блоках __asm

Блок, относящийся только к системам Майкрософт

Большое удобство встроенного кода на языке ассемблера — это возможность ссылаться на переменные C или C++ по имени. В блоке __asm можно обращаться ко всем символам, включая имена переменных из области видимости, в которой находится этот блок. Например, если переменная C var находится в области видимости, инструкция

__asm mov eax, var

сохраняет значение переменной var в регистре EAX.

Если класс, структура или член объединения имеет уникальное имя, __asm блок может ссылаться на него, используя только имя члена, не указывая переменную или typedef имя до оператора периода (.). Однако если имя члена не является уникальным, необходимо поместить переменную или имя typedef непосредственно перед оператором точки. Например, в типах структур в следующем примере в качестве имен членов используется общее имя same_name.

Если переменные объявлены с типами

struct first_type hal;
struct second_type oat;

во всех ссылках на член same_name необходимо указывать имя переменной, поскольку имя same_name не является уникальным. Однако имя члена weasel уникально, поэтому на него можно ссылаться, используя только имя члена:

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

Обратите внимание, что возможность не указывать имя переменной — это всего лишь вопрос удобства при написании кода. Создаваемые инструкции ассемблера не зависят от наличия или отсутствия имени переменной.

В C++ доступ к данным-членам возможен без учета ограничений доступа. Однако вызов функций-членов невозможен.

Завершение блока, относящегося только к системам Майкрософт

См. также

Использование C или C++ в блоках __asm