Предыдущий раздел ОСНОВНЫЕ ОПЕРАТОРЫ АССЕМБЛЕРА Следующий раздел

1.4.5. Структуры

В отличие от простых данных, определяемых с помощью псевдооператоров 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 ; Запись адреса-сегмента

 


Предыдущий раздел В начало Следующий раздел