Определение меток элементов структур с помощью директивы LABEL
Директива LABEL позволяет вам создавать элементы структур без выделения данных. Обычно LABEL задает метку с именем или маркер в той точке, где она обнаруживается в сегменте. Директива LABEL внутри определения структуры определяет элементы этой структуры. Приведем синтаксис директивы LABEL:
LABEL имя сложный_тип
В режиме MASM вы можете использовать следующий синтаксис:
имя LABEL сложный_тип
где "имя" - это имя элемента структуры. "Тип" - это желаемый тип элемента структуры. Он может представлять собой любое допустимое имя типа. Описание имеющихся спецификаторов типов можно найти в здесь.
Выравнивание элементов структуры
В определения структуры для выравнивания элементов структур на соответствующие границы можно использовать директиву ALIGN. Например:
ALIGN 4 ; выравнивание на границу двойного слова member dd ? ; member будет выравниваться на DWORD
Закрытие определения структуры или объединения
После того, как вы определите все элементы структуры или объединения, нужно закрыть определение структуры или объединения. Для этого используется директива ENDS.
В режиме Ideal директива ENDS имеет следующий синтаксис:
ENDS [имя]
В режиме MASM вы можете использовать синтаксис:
имя ENDS
где "имя" (если оно присутствует) соответствует имени открытого определения структуры или объединения. Если имя не указано, то закрывается открытая в данный момент структура или объединение.
Вы можете также использовать директиву ENDS для закрытия сегментов. Это не приводит к конфликту, поскольку открытие сегмента внутри структуры или объединения не допускается.
Вложенные структуры и объединения
Турбо Ассемблер позволяется для управления смещениями, присваевыми элементам структуры, использовать вложенные директивы STRUC, UNION и ENDS внутри открытого определения данных типа структуры или объединения.
В структуре каждый элемент данных начинается, когда заканчивается предыдущий элемент. В объединении каждый элемент данных начинается с того же смещения, что и предыдущий элемент данных. Если отдельный элемент данных может целиком включать в себя структуру или объединение, это дает существенную гибкость и открывает большие возможности. Описание директив STRUC, UNION и ENDS можно найти в следующей таблице:
Директивы STRUC, UNION и ENDSДиректива | Смысл |
---|
STRUC | При использовании внутри открытой структуры или объединения данная директива начинает блок элементов, который внешняя (охватывающая) структура или объединение рассматривает, как один элемент. Смещения элементам в блоке присваиваются в возрастающем порядке. Размер блока представляет собой сумму размеров всех элементов в нем. | UNION | При использовании внутри открытой структуры или объединения данная директива начинает блок элементов, который охватывающая структура или объединение рассматривает как один элемент. Элементам блока присваивается одно и то же смещение. Размер блока равен размеру наибольшего элемента в нем. | ENDS | Завершает блок элементов, начинающихся предыдущей директивой STRUC или UNION. |
Например, в следующем определении данных типа структуры/объединения содержится в общей сложности 5 элементов.
CUNION STRUC CTYPE DB ? UNION ; начало объединения ; если CTYPE = 0, использовать следующее. STRUC CT0PAR1 DW 1 CT0PAR2 DW 1 ENDS ; если CTYPE = 1, использовать следующее. STRUC CT1PAR1 DW 3 CT1PAR2 DW 4 ENDS ENDS ; конец объединения ENDS ; конец структурного типа
Список этих элементов приведен в следующей таблице:
Элементы блокаЭлемент | Тип | Смещение | Значение по умолчанию |
---|
CTYPE | Byte | 0 | ? (не инициализирован) | CT0PAR1 | Word | 1 | 1 | CT0PAR2 | Byte | 3 | 2 | CT1PAR1 | Byte | 1 | 3 | CT1PAR2 | Dword | c | 4 |
Длина данной структуры/объединения равна 6 байтам.
1 2 3 4 5 6
8 8 8
| |