0988b24c

Инициализация экземпляра структуры или объединения


Инициализированные экземпляры структуры несколько более сложны, чем неинициализированные. Когда вы определяете структуру, вам нужно определить используемое по умолчанию начальное значение для каждого ее элемента. (В качестве начального значения можно использовать ключевое слово ?, которое указывает, что конкретного начального значения сохранять не следует.) Когда вы создаете эк- земпляр структуры, его можно создать с использованием значений по умолчанию или переопределяемых значений. Простейший инициализиро- ванный экземпляр структуры содержит просто заданные в определении начальные значения. Например:

ASTRUC {}

что эквивалентно следующему:

DB "xyz" DW 1 DD 2

Фигурные скобки ({}) представляет нулевой инициализатор для структуры. Значение-инициализатор определяет, что элементы (если они имеются) должны иметь начальные значения, которые следует пе- реопределить, и какими новыми значениями, если вы выделяете дан- ные для экземпляра структуры. Инициализатор в виде фигурных ско- бок имеет следующий синтаксис:

{ [имя_элемента = значение [,имя_элемента.]] }

где "имя_элемента" - это имя элемента структуры или объединения, а "значение" - это то значение, которое вы хотите присвоить эле- менту в данном экземпляре. Чтобы указать Турбо Ассемблеру, что для элемента нужно использовать начальное значение из определения структуры или объединения, задайте нулевое значение. Значение ? показывает, что этот элемент инициализировать не нужно. Турбо Ас- семблер присваивает всем элементам, которые не указываются в ини- циализаторе, начальное значение из определения структуры или объ- единения, например:

ASTRUC {C=2,D=?}

эквивалентно следующему:

DB "xyz" DW 2 DD ?

Вы можете использовать инициализатор в виде фигурных скобок для задания значения любого элемента структуры или объединения, даже если он находится во вложенной структуре или объединении.

Объединения отличаются от структур, поскольку элементы в объединении перекрывают друг друга. Будьте аккуратны, когда вы инициализируете экземпляр структуры, поскольку если несколько элементов перекрывают друг друга, Турбо Ассемблер допускает, что- бы в экземпляре только один элемент имел инициализирующее значе- ние. Например:


BUNION {}

допустимо, поскольку все три элемента в определении объединения являются неинициализированными. Данный оператор эквивалентен сле- дующему:

BD 4 DUP (?)

В данном примере 4 байта зарезервированы, поскольку размер объединения равен размеру его наибольшего элемента (в данном слу- чае DWORD). Если инициализированный элемент объединения не явля- ется наибольшим элементом объединения, то Турбо Ассемблер воспол- няет разницу, резервируя место, но не генерируя данные, например:

BUNION {Z=1}

эквивалентно следующему:



DB 1 DB 3 DUP (?)

Наконец, несколько инициализированных элементов объединения приведут к ошибке. Следующее, например, не допускается:

BUNION {X=1,Z=2}

Заметим, что если два или более поля объединения имеют на- чальные значения в определении объединения, то использование простого инициализатора в виде фигурных скобок также приведет к ошибке. Чтобы генерировался допустимый экземпляр, инициализатор должен устанавливать только одно значение ?.

Альтернативным методом инициализации структуры или объедине- ния является использование инициализатора в виде угловых скобок (<>). Значения такого инициализатора являются неименованными, но располагаются в том же порядке, что и соответствующие элементы в определении структуры или объединения. Для этого инициализатора используется следующий синтаксис:

< [значение [,значение.]] >

где "значение" представляет нужное значение соответствующего эле- мента в определении структуры или объединения. Пустое значение указывает, что вы будете использовать начальное значение из опре- деления структуры или объединения. Ключевое слово ? указывает, что элемент должен быть неинициализированным. Например:

ASTRUC <"ABC"',,?>

эквивалентно следующему:

DB "abc" DW 1 DD ?

Если вы задаете меньше значений, чем имеется элементов, Тур- бо Ассемблер закончит инициализацию, используя для остальных эле- ментов начальные значения из определения структуры или объедине- ния.

ASTRUC <"ABC"> ; то же, что ASTRUC <"ABC",,>



Когда вы используете инициализатор в виде угловых скобок, уделите особое внимание вложенным структурам и объединениям. Для каждого уровня вложенности в таком инициализаторе требуется ука- зывать свою пару угловых скобок, благодаря чему Турбо Ассемблер будет интерпретировать каждый инициализатор вложенной структуры или объединения как отдельную единицу (совпадающее со значением в экземпляре). Оставив соответствующие угловые скобки пустыми, вы можете пропустить инициализацию данного уровня вложенности (для вложенной структуры или объединения используется значение по умолчанию, либо использовать ключевое слово ? (для неинициализи- рованной вложенной структуры или объединения). Рассмотрите, нап- ример, следующую вложенную структуру и объединение:

CUNION STRUC CTYPE DB ? UNION ; начало объединения

; если CTYPE = 0, использовать следующее. STRUC CT0PAR1 DW 1 CT0PAR2 DW 2 ENDS

; если CTYPE = 1, использовать следующее. STRUC CT1PAR1 DW 3 CT1PAR2 DW 4 ENDS

ENDS ; конец объединения ENDS

Инициализатор в скобках для данной структуры/объединения имеет два уровня вложенности. Эта вложенность должна учитываться соответствующей парой угловых скобок в инициализаторе, например:

CUNION <0,<<2,>,?>>

Эта директива эквивалентна следующему:

DB 0 DW 2 DB 2 DB 2 DUP (?)


Содержание раздела