Использование элементов структуры
В операторах встроенного ассемблера вы можете ссылаться на
элементы структуры (используя формат "переменная.элемент_структуры"). При этом вы работаете с переменными и можете сохранять и
получать значения элементов структур. Однако, можно также ссылаться на элемент структуры непосредственно по имени (без имени
переменно). Такая ссылка имеет форму числовой константы. При этом
константы приравниваются смещению (в байтах) от начала структуры,
содержащей данный элемент. Рассмотрим фрагмент программы:
struct myStruct {
int a_a;
int a_b;
int a_c;
} myA;
myfumc()
{
...
asm {mov ax, WORD PTR myA.a_b
mov bx, WORD PTR myA.a_c
}
...
}
Этот фрагмент описывает структурный тип с именем myStruct с
тремя элементами a_a, a_b, a_c. Первый оператор встроенного ассемблера перемещает значение, содержащееся в myA.a_b, в регистр
AX. Второй перемещает значение по адресу [di]+offset(a_c) в регистр BX (он берет адрес, записанный в DI, и добавляет его к смещению a_c от начала myStruct). Оператор ассемблера даст следующий
код:
mov ax, DGROUP : myA+2
mov bx, [di+4]
Таким образом, если вы загружаете регистр (такой как DI) адресом структуры типа meStruct, то можете использовать имена элементов структуры для непосредственной ссылки на них. Имя элемента
структуры можно использовать в любой позиции, где вы операторе
языка ассемблера допускается числовая константа.
Элементу структуры должна предшествовать точка. Она указывает, что это имя элемента структуры, а не обычный идентификатор
Си. В выводе ассебмлера имена элементов структуры заменяются соответствующими числовым смещением элемента, а информация о типе
не сохраняется. Такие элементы структуры могут использоваться в
операторах ассебмлера в качестве констант этапа компиляции.
Однако есть одно ограничение: если две используемые во
встроенном ассебмлере структуры имеют элемент с одинаковыми именем, их нужно сделать различными. Укажите между точкой и именем
элемента тип структуры в скобках (как в случае приведения типа),
например:
asm mov bx.[di].(struct tm)tm_hour