
Виділення елемента запису:
Помістити запис у тимчасову пам'ять - регістр (8, 16 або 32-бітний залежно від розміру запису).
Одержати бітову маску, що відповідає елементу запису, за допомогою оператора mask .
Локалізувати біти в регістрі за допомогою маски й команди and .
Зрушити біти елемента до молодших розрядів регістра командою shr . Число розрядів для зрушення одержати з використанням ім'я елемента запису.
У результаті цих дій елемент записи буде локалізований на початку робочого регістра й далі з ним можна робити будь-які дії.
Робота з елементом запису:
Як ми вже з'ясували, з елементами запису виробляються будь-які дії, як над звичайною двійковою інформацією. Єдине, що потрібно відслідковувати, - це розмір бітового поля. Якщо, приміром, розмір поля збільшиться, то згодом може відбутися випадкова зміна сусідніх полів бітів. Тому бажано виключити зміну розміру поля.
Приміщення зміненого елемента на його місце в запис:
Використовуючи ім'я елемента запису як лічильник зрушень, зрушити вліво біти елемента запису.
Якщо ви не впевнені в тому, що розрядність результату перетворень не перевищила вихідну, можна виконати “обрізання” зайвих бітів, використовуючи команду and і маску елемента.
Підготувати вихідний запис до вставки зміненого елемента шляхом обнуління битов у записі на місці цього елемента. Це можна зробити шляхом накладення командою and інвертованої маски елемента запису на вихідний запис.
За допомогою команди or накласти значення в регістрі на вихідний запис.
Як приклад розглянемо лістинг 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 ;кінець програми |
На закінчення ще раз проаналізуйте тип запису й особливості роботи з ним. При цьому зверніть увагу на ту обставину, що ми ніде явно не прораховуємо розташування битов. Тому якщо знадобиться змінити розмір елемента або його початкове значення, досить внести зміни в екземпляр запису або в опис її типу; функціональну частину програми, що працює із цим записом, торкати не потрібно.
Завдання для виконання лабораторної роботи.
Написати програму на мові асемблера яка обнуляє поле f3 в запису ftest:
ftest record f1:2=11, f2:2=00, f3:2=11, f4:1, f5:2=11
Виконання лабораторної роботи.
Опрацювати теоретичні відомості.
Виконати поставлене завдання (п.4), записати результат.
Дати відповіді на контрольні питання(п.6).
Зробити висновки.
Контрольні питання.
Як провести вибіркову ініціалізацію полів запису?
Як організувати роботу з окремими елеметами запису?
Зміст звіту.