Сборник по задачам и примерам Assembler

       

Вложенные структуры



Вложенные структуры

В общем случае поле структуры может само являться структурой. Тогда структура представляет собой иерархическую конструкцию, которую можно изобразить в виде дерева (Рисунок 2.6).

Рисунок 2.6. Иерархическая структура сложной записи

Листы в этом дереве являются той полезной информацией, к которой необходимо получить доступ. Для этого нужно некоторым образом указать последовательность идентификаторов, в которой первым идентификатором является имя структуры, далее следуют идентификаторы промежуточных узлов и последним идентификатором является идентификатор нужного листа. Но в ассемблере подобная схема реализована очень ограниченно — можно указать только имена первого и последнего идентификаторов (промежуточных попросту нет). Рассмотрим пример. Как обычно, прежде чем работать со структурой, необходимо задать ее шаблон. Далее для работы со структурой в программе необходимо создать ее экземпляр. В программе ниже шаблон структуры называется element, а соответствующий ему экземпляр структуры — si. Отметим лишь, что не стоит искать в приведенных ниже примерах какой-либо смысл, так как они предназначены только для демонстрации механизма вложенности структур (и объединений).

:prg02_01.asm - программа, демонстрирующая описание и использование структуры в программе на ассемблере.

elementstruc

INN dd 0 ;ИНН

name db 30 dup С ') ;Ф.И.О.

у_birthday dw 1962 :год рождения

m birthday db 05 ;месяц рождения

d_birthday db 30 :месяц рождения

nationality db 20 национальность



;и так далее

ends

.data

si element<>

.code

mov al,si.m_birthday

Информацию о дате рождения можно оформить в виде отдельной структуры, вложенной в текущую структуру, так как это сделано в программе ниже:

:prg02_02.asm - программа, демонстрирующая вложение структуры в текущую структуру в программе на ассемблере.

:

elementstruc

INN dd 0 :ИНН

fiodb 30 dup (' ') ;Ф.И.О.

struc

y_birthday dw 1962 ;год рождения m_birthday db 05 ;месяц рождения d_birthday db 30 ;месяц рождения

ends


nationality db 20 национальность ;и так далее

ends

.data

si element<>

.code

mov al ,sl.m_birthday

Синтаксис ассемблера допускает вынести описание вложенной структуры за пределы текущей структуры. При этом можно инициализировать необходимые поля структуры birthday внутри отдельного экземпляра структуры element. Но работает такое описание структуры только в режиме IDEAL, что и продемонстрировано в программе ниже.

:prg02_03.asm - программа, демонстрирующая вложение структуры в другую структуру в программе на ассемблере.

birthday struc

y_bi rthday dw 1962 :год рождения

m_birthday db 05 :месяц рождения

d_birthday db 30 :день рождения

ends

element struc

INN dd 0 ;ИНН

Birthday struc (m_birthday-06. d_birthday=21)

fio db 30 dup С ') ;Ф.И.О.

nationality db 20 национальность

;и так далее

ends

.data

si element <.<»

.code

ideal

mov al,si.m_birthday masm

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

:prg02_04.asm - программа, демонстрирующая взаимное вложение объединений и структур в программе на ассемблере.

elementstruc INN del 0 :ИНН fiodb 30 dup С ') :Ф.И.О. union

struc

y_birthday_l dw 1962 :год рождения m_birthday_l db 06 ;месяц рождения d_birthday_l db 03 ;месяц рождения ' ends

struc

d_birthday_2 db ? ;месяц рождения m_birthday_2 db ? :месяц рождения y_birthday_2 dw ? ;год рождения

ends

ends ;конец объединения nationality db 20 -.национальность :и так далее ends .data si element<>

!code"

mov al.si.m_bi rthday_l

mov sl.m_birthday_2,0ffh mov al,sl.m_birthday_2


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