- Lektsia - бесплатные рефераты, доклады, курсовые работы, контрольные и дипломы для студентов - https://lektsia.info -

Определение экземпляра записи



Для использования шаблона записи в программе необходимо определить переменную с типом данной записи, для чего применяется следующая синтаксическая конструкция (рис. 7):

Рис. 7. Синтаксис описания экземпляра записи

Анализируя эту синтаксическую диаграмму, можно сделать вывод, что инициализация элементов записи осуществляется достаточно гибко. Рассмотрим несколько вариантов инициализации.

Если инициализировать поля не требуется, то достаточно указать ? при определении экземпляра записи:

...iotest recordi1:1,i2:2=11,i3:1,i4:2=11,i5:2=00 ...flag iotest ?

Если вы составите и исследуете в отладчике тестовый пример с данным определением записи, то увидите, что все поля переменной типа запись flag обнуляются. Это происходит несмотря на то, что в определении записи заданы начальные значения полей.

Если требуется частичная инициализация элементов, то они заключаются в угловые (< и >) или фигурные ({ и }) скобки.

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

К примеру, согласиться со значениями по умолчанию можно так:

iotest recordi1:1,i2:2=11,i3:1,i4:2=11,i5:2=00...flag iotest <> ;согласились со значением по умолчанию

Изменить значение поля i2 можно так:

iotest recordi1:1,i2:2=11,i3:1,i4:2=11,i5:2=00...flag iotest <,10,> ; переопределили i2

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

iotest recordi1:1,i2:2=11,i3:1,i4:2=11,i5:2=00...flag iotest {i2=10} ;переопределили i2, не обращая внимания на порядок;следования других компонентов записи

Работа с записями

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

Прежде всего для понимания проблемы нужно усвоить несколько моментов:

width имя_элемента_записи ;значением оператора будет размер элемента в битах.

 

width имя_экземпляра_записиили width имя_типа_записи ;значением оператора будет размер всей записи в битах.

 

mov al,width i2... mov ax,width iotest

Теперь у вас есть вся информация о средствах ассемблера для работы с записями.

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

Ваша задача — закодировать эти алгоритмы тем или иным способом в соответствии с требованиями задачи.

Выделение элемента записи:

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

Работа с элементом записи:

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

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

Помещение измененного элемента на его место в запись:

В качестве примера рассмотрим листинг 8, который обнуляет поле i2 в записи iotest.

Листинг 8. Работа с полем записи;prg_12_7.asmmasmmodel smallstack 256iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00.dataflag iotest <>.codemain: mov ax,@data mov ds,ax mov al,mask i2 shr al,i2 ;биты i2 в начале ax and al,0fch ;обнулили i2;помещаем i2 на место shl al,i2 mov bl,[flag] xor bl,mask i2 ;сбросили i2 or bl,al ;наложилиexit: mov ax,4c00h ;стандартный выход int 21hend main ;конец программы

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