<<
>>

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

Как организовать работу с отдельными элементами записи? Обычные механизмы адресации здесь бессильны, так как они работают на уровне ячеек памяти, то есть байтов, а не отдельных битов.
Здесь программисту нужно приложить некоторые усилия. Прежде всего, для понимания проблемы нужно усвоить несколько момен- тов. II Каждому имени элемента записи ассемблер присваивает числовое значение, равное количеству сдвигов вправо, которые нужно произвести для того, чтобы этот элемент оказался «прижатым» к началу ячейки. Это дает нам возможность локализовать его и работать с ним. Но для этого нужно знать длину элемента в битах. И Сдвиг вправо производится с помощью команды сдвига SНR. • Ассемблер содержит операторWIDТН, который позволяет узнать размер элемента записи в битах или полностью размер записи. Варианты применения оператора WIDTH: Р width имя_элемента_записи — значением оператора будет размер элемента в битах; ? width имя_экземпляра_записи или width имя_типа_записи — значением опера- тора будет размер всей записи в битах.
Например, mov at.width i2 mov ах,width iotest ж Ассемблер содержит оператор MASK, который позволяет локализовать биты нуж- ного элемента записи. Эта локализация производится путем создания маски, размер которой совпадает с размером записи. В этой маске должны быть обну- лены биты во всех позициях, за исключением тех, которые занимает элемент в записи. . • Сами действия по преобразованию элементов записи производятся с помощью логических команд. Подчеркнем еще раз то обстоятельство, что непосредственное обращение к кон- кретному элементу записи невозможно. Для этого нужно сначала выделить его, сдвинуть при необходимости к младшим разрядам, выполнить требуемые действия и поместить обратно на свое место в записи. Поэтому, чтобы вам каждый раз «не изобретать велосипед», далее мы опишем типовые алгоритмы осуществления этих операций над элементами записи.
Вам останется лишь оформить эти алгоритмы в виде кода соответствии с требованиями конкретной задачи. Для выделения элемента записи требуется выполнить описанную далее проце- ДУРУ· 1. Поместить запись во временную память — регистр (8-, 16- или 32-разрядный в зависимости от размера записи). 2. Получить битовую маску, соответствующую элементу записи, с помощью опе- ратора MASK. 3. Локализовать биты в регистре с помощью маски и команды AND. 4. Сдвинуть биты элемента к младшим разрядам регистра командой SHR. Число разрядов для сдвига получить с использованием имени элемента записи. В результате этих действий элемент записи будет локализован в начале рабоче- го регистра, и далее с ним можно производить любые действия (см. далее). В ходе предыдущих рассуждений мы показали, что с элементами записи произ- водятся любые действия, как с обычной двоичной информацией. Единственное, что нужно отслеживать, — это размер битового поля. Если, к примеру, размер поля увеличится, то впоследствии может произойти случайное изменение соседних по- лей битов. Поэтому желательно на этапе проектирования предусматривать все ва- рианты функционирования программы с тем, чтобы исключить любые изменения размеров полей. Измененный элемент помещается на его место в запись следующим образом. 1. Используя имя элемента записи в качестве счетчика сдвигов, сдвинуть влево биты элемента записи. 2. Если вы не уверены в том, что разрядность результата преобразований не пре- высила исходную, можно выполнить «обрезание» лишних битов, используя команду AND и маску элемента. 3. Подготовить исходную запись к вставке измененного элемента путем обнуле- ния битов в записи на месте этого элемента. Это можно сделать наложением командой AND инвертированной маски элемента записи на исходную запись. 4. С помощью команды OR наложить значение в регистре на исходную запись. В качестве примера рассмотрим листинг 13.7, в котором поле i2 в записи iotest обнуляется. [12] 290 Глава 13. Сложные структуры данных Листинг 13.7. Работа с полем записи В заключение стоит еще раз проанализировать приведенные сведения о запи- сях и особенностях работы с ними. При этом обратите внимание на то обстоятель- ство, что мы нигде явно не просчитываем расположение битов. Поэтому, если по- надобится изменить размер элемента или его начальное значение, то достаточно лишь внести изменения в экземпляр записи или в описание ее типа. Функцио- нальную часть программы, работающую с этой записью, трогать не нужно.
<< | >>
Источник: В. И. Юров. Assembler. Учебник для вузов. 2-е изд. 2003

Еще по теме Работа с записями:

  1. 10.8.1. Техника записи импровизаций
  2. ЗАВЕДИТЕ ПРИВЫЧКУ К ЗАПИСИ
  3. Глава первая Познакомьтесь с Крайоном Начало записей...
  4. Репортаж в записи
  5. Дети о взрослых из записей Д.С.
  6. Полторы дыры из записей Д.С.
  7. Стирание записи изображения и звука
  8. Упражнение ЗАПИСИ ДЛЯ ИСПРАВЛЕНИЯ КОНТРАКТА ДУШИ
  9. Прослушивание магнитофонной записи своего голоса проявляет детскую боязнь оказаться недостаточно хорошим.
  10. Врата настежь - налог на удобство из записей доктора Кстонова
  11. Очищение Старых Лемурийских Записей На рассвете Новой Эры на Земле