Доступ к данным 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++ доступ к данным-членам возможен без учета ограничений доступа. Однако вызов функций-членов невозможен.
Завершение блока, относящегося только к системам Майкрософт