Инструменты пользователя

Инструменты сайта


examination:asm:question19

Вопрос №19. Описание и использование упакованных битовых полей (записей) на ЯА. Примеры

Запись — структурный тип данных, состоящий из фиксированного числа элементов длиной от одного до нескольких бит. При описании записи для каждого элемента указывается его длина в битах и, что необязательно, некоторое значение. Суммарный размер записи определяется суммой размеров ее полей и не может быть более 8, 16 или 32 бит. Если суммарный размер записи меньше указанных значений, то все поля записи “прижимаются” к младшим разрядам.

Использование записей в программе, так же, как и структур, организуется в три этапа:

Задание шаблона записи, то есть определение набора битовых полей, их длин и, при необходимости, инициализация полей.

Определение экземпляра записи. Так же, как и для структур, этот этап подразумевает инициализацию конкретной переменной типом заранее определенной с помощью шаблона записи. Организация обращения к элементам записи.

Описание записи

Описание шаблона записи имеет следующий синтаксис : имя_записи RECORD <описание элементов> Здесь: <описание элементов> представляет собой последовательность описаний отдельных элементов записи согласно синтаксической диаграмме :

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

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

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

- Ассемблер содержит оператор width, который позволяет узнать размер элемента записи в битах или полностью размер записи. Варианты применения оператора width:

width имя_экземпляра_записи

или

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

mov al,width i2

mov ax,width iotest

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

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

- Поместить запись во временную память — регистр (8, 16 или 32-битный в зависимости от размера записи).

- Получить битовую маску, соответствующую элементу записи, с помощью оператора mask.

- Локализовать биты в регистре с помощью маски и команды and.

- Сдвинуть биты элемента к младшим разрядам регистра командой shr. Число разрядов для сдвига получить с использованием имени элемента записи.

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

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

examination/asm/question19.txt · Последние изменения: 2014/01/15 12:12 (внешнее изменение)