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