Справочник по языку Ассемблера IBM PC



       

Работа с записями - часть 2


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

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

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

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

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

    инвертированной маски элемента записи на исходную запись.

  • С помощью команды наложить значение в регистре на исходную запись.
  • В качестве примера рассмотрим листинг 8, который обнуляет поле i2 в записи iotest.

    Листинг 8. Работа с полем записи ;prg_12_7.asm masm model small stack 256 iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00 .data flag iotest <>

    .code main: 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 21h end main ;конец программы

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




    Содержание  Назад  Вперед