Запись — структурный тип данных, состоящий из фиксированного числа элементов длиной от одного до нескольких бит.
Суммарный размер записи определяется суммой размеров ее полей и не может быть более 8, 16 или 32 бит. Если суммарный размер записи меньше указанных значений, то все поля записи «прижимаются» к младшим разрядам. Использование записей в программе организуется в три этапа: 1. Задание шаблона записи, то есть определение набора битовых полей, их длин и, при необходимости, инициализация полей. 2. Определение экземпляра записи. Так же как и для структур, этот этап подразумевает инициализацию конкретной переменной типом заранее определенной с помощью шаблона записи. 3. Организация обращения к элементам записи. Описание записи Описание шаблона записи имеет следующий синтаксис: имя_записи RECORD <описание элементов>
Здесь: <описание эленентов> представляет собой последовательность описаний отдельных элементов записи согласно синтаксической диаграмме (рис. 2). При описании шаблона память не выделяется, так как это информация для транслятора ассемблера о структуре записи. Так же как и для структур, местоположение шаблона в программе может быть любым, но при этом необходимо учитывать логику работы однопроходного транслятора.
Рис. 2. Синтаксис описания шаблона записи Определение экземпляра записи Для использования шаблона записи в программе необходимо определить переменную с типом данной записи, для чего применяется следующая синтаксическая конструкция (рис. 10.3).
Рис. 10.3. Синтаксис описания экземпляра записи
Рассмотрим несколько вариантов инициализации. Пример: Если инициализировать поля не требуется, то достаточно указать? при определении экземпляра записи: ...
Iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00; 8 бит ... Flag iotest?;все поля записи после выполнения данной ; инициализации обнуляются
Пример_1: согласиться со значениями по умолчанию можно так:
iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00; _11_1100 ... flag iotest<>;согласились со значением по умолчанию
Пример_2: Изменить значение поля i2 можно так:
iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00 ... flag iotest<,10,,,>; переопределили i2
Пример_3: Переопределим поле i2:
iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00 ... flag iotest{i2=10};переопределили i2, не обращая внимания ; на порядок следования других ; компонентов записи
Работа с записями При работе с записями: – Каждому имени элемента записи ассемблер присваивает числовое значение, равное количеству сдвигов вправо, которые нужно произвести для того, чтобы этот элемент оказался «прижатым» к началу ячейки. Это дает возможность локализовать его и работать с ним. Но для этого нужно знать длину элемента в битах. – Ассемблер содержит оператор width, который позволяет узнать размер элемента записи в битах или полностью размер записи. Варианты применения оператора width: – Сдвиг вправо производится с помощью команды сдвига shr.
А) width имя_элемента_записи — значением оператора будет размер элемента в битах; Б) width имя_экземпляра_записи или width имя_типа_записи — значением оператора будет размер всей записи в битах.
Mov al,width i2 ... Mov ax,width iotest
– Ассемблер содержит оператор mask, который позволяет локализовать биты нужного элемента записи. Эта локализация производится путем создания маски, размер которой совпадает с размером записи. В этой маске обнулены биты во всех позициях, за исключением тех, которые занимает элемент в записи. – Действия по преобразованию элементов записи производятся с помощью логических команд. Непосредственно обратиться к элементу записи невозможно. Чтобы произвести обработку интересующего нас элемента, нужно сначала выделить его, сдвинуть при необходимости к младшим разрядам, выполнить требуемые действия и поместить обратно на свое место в записи.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|