Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / Турбо Ассемблер / Использование Турбо Ассемблера /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Определение данных - Программирование от RIN.RU
Определение данных



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


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


ASTRUC STRUC
B DB "xyz"
C DW 1
D DD 2
ASTRUC ENDS


BUNION UNION
X DW ?
Y DD ?
Z DB ?
BUNION ENDS


Тогда операторы:


ATEST ASTRUC ?
BTEST BUNUION ?


будут создавать экземпляры структуры astruc (определяя переменную atest) и объединения bunion (определяя переменную btest). Поскольку в примере указывается значение неинициализированных данных ?, то начальные данные в текущий сегмент не вводятся.


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


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


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 (?)


<<<  НазадВперед  >>>
 1  2  3  4  5  6 


 8  Комментарии к статье  8 8  Обсудить в чате

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь