Предыдущий раздел | ОСНОВНЫЕ ОПЕРАТОРЫ АССЕМБЛЕРА | Следующий раздел |
В отличие от простых данных, определяемых с помощью псевдооператоров db, dw, dd, dq, resb, resw, структура представляет собой сложный тип данных, т.к. ее элементы (поля) имеют разную длину. Программист определяет структуру с помощью псевдооператоров struc и endstruc:
struc <имя>
. . . . . . . . ; Описание полей структуры
endstruc
Здесь описание полей представляет собой последовательность псевдооператоров определения данных (db, dw, dd, dq, resb и resw). Их операнды определяют размер полей. Пример описания структуры:
struc WINDOW
.Height resw 1 ; Высота окна
.Width resw 1 ; Ширина окна
.Color resb 1 ; Цвета символов и фона
.Text resd 1 ; Дальний указатель (сегмент и смещение) на буфер, содержащий выводимый текст
endstruc
Где расположить описание структуры? Здесь можно использовать два варианта. В первом из них описание структуры располагается в начале того же файла, где эта структура будет использоваться. Недостаток такого варианта очевиден, т.к. в каждом файле, где предполагается использовать структуру, ее придется описывать заново. Во втором варианте описание структуры выносится в отдельный файл с расширением inc (текстовый файл, полученный с помощью любого текстового редактора). А в начале каждого ассемблерного файла, где предполагается использовать структуру, записывается псевдооператор %include (включить) с указанием имени включаемого файла. Например:
%include Window.inc
Вне зависимости от того, каким из двух способов определена структура, она может использоваться в программе следующим образом. Во-первых, имя структуры фактически является типом данных, пользуясь которым можно требовать от транслятора создание любого числа экземпляров данной структуры в памяти. Для создания экземпляра структуры следует использовать пару псевдооператоров: istruc (включить структуру) и iend (конец включения структуры). Например, для создания трех экземпляров структуры WINDOW достаточно записать:
Wind1 istruc WINDOW iend
Wind2 istruc WINDOW iend
Wind3 istruc WINDOW iend
Для инициализации экземпляра структуры, т.е. для задания первоначального значения какого-то ее поля, используется вспомогательный псевдооператор at. При этом поля экземпляра структуры должны указываться в той же последовательности, что и в описании структуры, но некоторые поля могут быть пропущены. Например:
Wind istruc WINDOW
at WINDOW.Height, db 10
at WINDOW.Width, db 20
iend
Здесь высота и ширина окна инициализируются значениями 10 и 20, а цвет и выводимый в окно текст первоначально не задаются. Обратите внимание на запятую после имени поля. Ее запись обязательна.
Если экземпляр структуры определен в программе, с его полями можно работать так же, как с обычными данными, используя прямую адресацию. Напомним, что при использовании такой адресации имя (метка) элемента данных заключается в квадратные скобки. При работе с полем структуры в квадратные скобки записывается сумма имени экземпляра структуры и составного имени, образованного из имени структуры и имени ее поля, разделенных точкой. Например, следующие операторы выполняют запись в поле Text экземпляра Wind1 адреса сообщения, находящегося в поле памяти с меткой Buff:
mov [Wind1+WINDOW.Text], Buff ; Запись адреса-смещения
mov [Wind1+WINDOW.Text+2], seg Buff ; Запись адреса-сегмента
Предыдущий раздел | В начало | Следующий раздел |