M Используя имя элемента записи в качестве счетчика сдвигов, сдвинуть влево биты элемента записи.
M Локализовать биты в регистре с помощью маски и команды and.
M Получить битовую маску, соответствующую элементу записи, с помощью оператора mask.
M Поместить запись во временную память — регистр (8-, 16- или 32-битный, в зависимости от размера записи).
Типовые алгоритмы для работы с элементами записи.
Mov ax,width iotest
...
Mov al,width i2
– Ассемблер содержит оператор mask, который позволяет локализовать биты нужного элемента записи. Эта локализация производится путем создания маски, размер которой совпадает с размером записи. В этой маске обнулены биты во всех позициях, за исключением тех, которые занимает элемент в записи.
– Действия по преобразованию элементов записи производятся с помощью логических команд.
Непосредственно обратиться к элементу записи невозможно. Чтобы произвести обработку интересующего нас элемента, нужно сначала выделить его, сдвинуть при необходимости к младшим разрядам, выполнить требуемые действия и поместить обратно на свое место в записи.
1) Для выделения элемента записи необходимо:
m Сдвинуть биты элемента к младшим разрядам регистра командой shr. Число разрядов для сдвига получить с использованием имени элемента записи.
В результате этих действий элемент записи будет локализован в начале рабочего регистра и далее с ним можно производить любые действия.
2) Чтобы поместить измененный элемент на его место в запись необходимо:
m Подготовить исходную запись к вставке измененного элемента путем обнуления битов в записи на месте этого элемента. Это можно сделать путем наложения командой and инвертированной маски элемента записи на исходную запись.
В качестве примера рассмотрим листинг, который переопределит поле i2 в записи iotest как 10.
Листинг 10.5. Работа с полем записи
.386
.model flat, stdcall
includelib import32.lib
extrn ExitProcess:PROC
extrn MessageBoxA:PROC
iotest record i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00 ; 01101100
.data
flag iotest<>
.code
main:
mov al,mask i2 ; al=01100000
shr al,i2 ; биты i2 в начале ax al=00000011
and al,0feh ;переопределили i2 00000011 and 11111110;