Определение записей с битовыми полями
Данные типа записи представляют собой набор битовых полей. Каждое битовое поле имеет заданную длину (в битах) и начальное значение. Размер данных типа записи равен сумме длин всех полей.
Вы можете использовать данные типа записи для максимально компактного представления данных. Например, можно представить группу из 16 флагов (каждый из которых может быть либо установлен (ON), либо сброшен (OFF)) как 16 отдельных бит, 16 отдельных слов, или как запись, содержащую 16 1-битовых полей (наиболее эффективный метод).
Приведем синтаксис описания данных типа записи режима Ideal:
RECORD имя [поле_записи [,поле_записи.]]
В режиме MASM этот синтаксис имеет вид:
имя RECORD [поле_записи [,поле_записи.]]
Каждое "поле_записи" имеет следующий синтаксис:
имя_поля : размер_выражения [=значение]
где "имя_поля" - это имя поля записи. Турбо Ассемблер будет выделять для него битовое поле размером "размер_выражения". "Значение" и размер выражений не могут быть относительными или иметь опережающие ссылки. Имена поля записи имеют глобальную область действия и переопределяться не могут.
"Имя" - это имя типа записи. Далее вы можете использовать его в модуле для получения различной информации о данных типа записи. Вы можете также использовать имена для этого имена отдельных полей записи. Значения и выражения размера не могут быть относительными и иметь опережающие ссылки. Имена полей записи являются по области действия глобальными и переопределяться не могут.
Вы можете переопределить тип записи и определить в модуле одно и то же имя, как данные типа записи, несколько раз.
Вы можете также использовать имена типов записи для создания переменных и выделения памяти. Подробности можно найти в этой главе.
Турбо Ассемблер обеспечивает для полей записи специальную поддержку, которая представляет флаги и данные перечислимого типа. Более эффективный доступ к полям записи обеспечивают расширенные и дополнительные инструкции. Эта концепция описывается здесь.
Для определений данных типа записи, требующих большого числа полей, в Турбо Ассемблере предусмотрен расширенный синтаксис, аналогичный синтаксису перечислимого типа данных. Например, все следующие определения типа данных эквивалентны:
foo RECORD f1:1,f2:2,f3:3,f4:4 ; исходная версия
foo RECORD { ; версия, использующая f1:1, ; несколько строк f2:2, f3:3, f4:4 }
foo RECORD f1:1,f2:2, { ; более компактная версия f3:3,f4:4 }
Определение структур и объединений
Структуры и объединения позволяют вам совмещать и накладывать друг на друга данные различного типа. Структура в Турбо Ассемблер представляет собой тип данных, который содержит один или более элементов структуры. Структуры отличаются от записей, поскольку элементы структуры занимают всегда целое число байт, а записи описывают поля с произвольным числом бит. Размер структуры равен общему размеру всех входящих в нее элементов.
Объединения аналогичны структурам, но все элементы объединения занимают одну и ту же область памяти. Размер объединения равен размеру наибольшего элемента объединения. Объединения полезно использовать, когда блок памяти должен предоставлять несколько разных возможностей, для каждой из которых требуется разная память.
Турбо Ассемблер позволяет вам полностью вкладывать структуры и объединения друг в друга, но это может привести в чрезмерной сложности. Например, вы можете получить элемент структуры, который на самом деле является объединением. В качестве элемента объединения можно также использовать структуры.
Открытие определения структуры или объединения
В режиме Ideal для открытия определения данных типа структуры или объединения используется следующий синтаксис:
STRUC имя или UNION имя
В режиме MASM то же самое можно сделать с помощью следующего синтаксиса:
имя STRUC или имя UNION
Турбо Ассемблер рассматривает все данные или код между открытым определением структуры и соответствующей директивой ENDS как часть данного типа структуры или объединения.
Турбо Ассемблер интерпретирует имена типов данных структуры или объединения как глобальные, но переопределяемые. В модуле вы можете несколько раз определить структурный тип или тип объединения с одни и тем же именем.
Задание элементов структуры и объединения
Турбо Ассемблер включает данные в структуры или объединения построчно. Для выделения памяти для данных и создания элементов при определении структуры и объединения используются те же директивы, что и для выделения данных и создания меток в открытом сегменте. Например, директива:
member1 DW 1
одинаково допустима в сегменте и в определении структуры. В сегменте данный оператор означает "зарезервировать слово со значением 1 и именем member1". В определении структуры или объединения это означает "зарезервировать слово с начальным значением 1 и именем элемента member1".
Если в сегменте или структуре выделяется экземпляр структуры или объединения, вы можете использовать начальное значение элемента структуры. Если вы не распределять элементы структуры таким образом, для указания этого используйте в качестве значения данных символ ? (символ неинициализированных данных).
Турбо Ассемблер позволяет использовать в определении структуры все методы выделения данных, включая экземпляры других структур, объединений, записей, перечислимых типов данных, таблиц и объектов. Более подробно о выделении данных рассказывается в здесь.
В режимах MASM и Ideal имена элементов структур интерпретируются по-разному. В режиме MASM имена элементов структур являются глобальными и не могут переопределяться. В режиме Ideal имена элементов структур считаются локальными для структуры или объединения.
1 2 3 4 5 6
8 8 8
| |