Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


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



Для использования шаблона записи в программе необходимо определить переменную с типом данной записи, для чего применяется следующая синтаксическая конструкция (рис. 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, не обращая внимания на порядок; следования других компонентов записи

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

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

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

  • Каждому имени элемента записи ассемблер присваивает числовое значение, равное количеству сдвигов вправо, которые нужно произвести для того, чтобы этот элемент оказался “прижатым” к началу ячейки. Это дает нам возможность локализовать его и работать с ним. Но для этого нужно знать длину элемента в битах.
  • Сдвиг вправо производится с помощью команды сдвига shr.
  • Ассемблер содержит оператор width, который позволяет узнать размер элемента записи в битах или полностью размер записи. Варианты применения оператора width:
width имя_элемента_записи; значением оператора будет размер элемента в битах.

 

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

 

mov al, width i2... mov ax, width iotest
  • Ассемблер содержит оператор mask, который позволяет локализовать биты нужного элемента записи. Эта локализация производится путем создания маски, размер которой совпадает с размером записи. В этой маске обнулены биты на всех позициях, за исключением тех, которые занимает элемент в записи.
  • Сами действия по преобразованию элементов записи производятся с помощью логических команд.

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

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

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

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

  • Поместить запись во временную память — регистр (8, 16 или 32-битный в зависимости от размера записи).
  • Получить битовую маску, соответствующую элементу записи, с помощью оператора mask.
  • Локализовать биты в регистре с помощью маски и команды and.
  • Сдвинуть биты элемента к младшим разрядам регистра командой shr. Число разрядов для сдвига получить с использованием имени элемента записи.

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

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

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

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

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

  • Используя имя элемента записи в качестве счетчика сдвигов, сдвинуть влево биты элемента записи.
  • Если вы не уверены в том, что разрядность результата преобразований не превысила исходную, можно выполнить “обрезание” лишних битов, используя команду and и маску элемента.
  • Подготовить исходную запись к вставке измененного элемента путем обнуления битов в записи на месте этого элемента. Это можно сделать путем наложения командой and инвертированной маски элемента записи на исходную запись.
  • С помощью команды or наложить значение в регистре на исходную запись.

В качестве примера рассмотрим листинг 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; конец программы

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


Поделиться:



Популярное:

  1. PEST-анализ макросреды предприятия. Матрица профиля среды, взвешенная оценка, определение весовых коэффициентов. Матрицы возможностей и матрицы угроз.
  2. Анализ баланса реактивной мощности на границе раздела энергоснабжающей организации и потребителя, и при необходимости определение мощности батарей конденсаторов для сети напряжением выше 1 кВ
  3. Асинхронные триггеры без разделения процессов записи и чтения.
  4. Аудио- и видеозаписи как средство доказывания в гражданском процессе.
  5. Блок 1. Понятие о морфологии. Имена. Имя существительное: определение, грамматические признаки, правописание
  6. В случае непринятия судом признания иска ответчиком суд выносит об этом определение и продолжает рассмотрение дела по существу.
  7. Вопрос 1. Какое определение Маркетингу дал Филип Котлер и на чем базируется теория маркетинга?
  8. Вопрос 1. Определение триггера. Классификация, назначение, таблицы переходов.
  9. Вопрос 34 Определение радиационно-опасного объекта. Основные радиационные источники. Классификации аварий на РОО
  10. Вопрос № 39 Представительные органы в системе местного самоуправления, порядок их формирования и определение численности.
  11. Глава 1. Определение состояния здоровья собаки.
  12. Глава 3. День третий. Определение своих границ


Последнее изменение этой страницы: 2016-05-28; Просмотров: 620; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.014 с.)
Главная | Случайная страница | Обратная связь