На этом шаге мы рассмотрим доступ к членам структуры.
Встраиваемые операторы asm могут ссылаться на члены структур по имени. Однако следует быть осторожным и различать, когда инструкциям необходимо значение, а когда адрес (относительное смещение члена структуры).
Предположим, вы объявили структуру TPoint с двумя целочисленными членами x и y. С помощью typedef (необязательно в C++, но полезно в ANSI C) вы можете объявить структуру следующим образом:
typedef struct point { int x; int y; } TPoint;
Затем можно объявить глобальную или локальную переменную с именем cursor типа TPoint:
TPoint cursor;
В операторах C и C++ выражения cursor.x и cursor.y ссылаются на члены переменной cursor. В операторах asm можно пользоваться аналогичными выражениями. Например, можно заменить в регистре ax значение члена у переменной cursor следующим образом:
asm mov ax, WORD PTR cursor.y //Запомнить значение y в ax
Для ссылки на адресное смещение относительно первого байта структуры следует воспользоваться ключевым словом OFFSET:
asm mov bx, OFFSET cursor.y //Запомнить значение y в bx
Можно также адресовать структуру регистрами. Например, можно запомнить в паре регистров ds:di адрес структуры cursor и запомнить значение у в регистре ax следующим образом:
asm{ mov di, OFFSET cursor //Запомнить местоположение cursor в di mov ax, [di].y //Запомнить значение члена у в ax }
Регистр ds уже ссылается на глобальный сегмент данных программ. В инициализации нуждается только di. Компилятор распознает у как член структуры cursor типа TPoint. Конечно, могут возникнуть конфликты, если в еще одной структуре будет объявлен член с именем y. Вы можете решить эту проблему, указав явным образом перед членом имя структуры в круглых скобках:
asm{ mov di, OFFSET cursor //Запомнить местоположение cursor в di mov ax, [di].(TPoint)y //Указать какая структура имеется в виду }
На следующем шаге мы рассмотрим написание внешних модулей на Турбо ассемблере.