Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторна робота14.doc
Скачиваний:
2
Добавлен:
23.11.2019
Размер:
91.65 Кб
Скачать

Визначення екземпляра запису

Для використання шаблона запису в програмі необхідно визначити змінну з типом даного запису, для чого застосовується наступна синтаксична конструкція (рис. 2):

Рис. 2. Синтаксис опису екземпляра запису

Аналізуючи цю синтаксичну діаграму, можна зробити вивід, що ініціалізація елементів запису здійснюється досить гнучко. Розглянемо кілька варіантів ініціалізації.

Якщо инициализировать поля не потрібно, то досить указати ? при визначенні екземпляра запису:

...

iotest record

i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00

...

flag iotest ?

Якщо ви складете й досліджуєте в отладчике тестовий приклад з даним визначенням запису, то побачите, що всі поля змінної типу запис flag обнуляются. Це відбувається незважаючи на те, що у визначенні запису задані початкові значення полів.

Якщо потрібна часткова ініціалізація елементів, то вони полягають у кутові ( < і > ) або фігурні ( { і } ) дужки. Розходження тут у тім, що в кутових дужках елементи повинні бути задані в тому ж порядку, що й у визначенні запису. Якщо значення деякого елемента збігається з початковим, то його можна не вказувати, але обов'язково позначити його комою. Для останніх елементів коми, що йдуть підряд, можна опустити. Приміром, погодитися зі значеннями за замовчуванням можна так:

iotest record

i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00

...

flag iotest

<>

;погодилися зі значенням за замовчуванням

Змінити значення поля i2 можна так:

iotest record

i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00

...

flag iotest

<,10,>

; перевизначили i2

Застосовуючи фігурні дужки, також можна вказати вибіркову ініціалізацію полів, але при цьому необов'язково позначати комами поля, зі значеннями за замовчуванням яких ми згодні:

iotest record

i1:1,i2:2=11,i3:1,i4:2=11,i5:2=00

...

flag iotest {i2=10} ;перевизначили i2, не обертаючи уваги на порядок

;проходження інших компонентів запису

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

Як організувати роботу з окремими елементами запису? Звичайні механізми адресації тут неспроможні, тому що вони працюють на рівні комірок пам'яті, тобто байтів, а не окремих битов. Тут програмістові потрібно прикласти деякі зусилля. Насамперед для розуміння проблеми потрібно засвоїти кілька моментів:

  • Кожному ім'ю елемента запису асемблер привласнює числове значення, рівне кількості зрушень вправо, які потрібно зробити для того, щоб цей елемент виявився “притиснутим” до початку осередку. Це дає нам можливість локалізувати його й працювати з ним. Але для цього потрібно знать довжину елемента в бітах.

  • Зрушення вправо виробляється за допомогою команди зрушення shr .

  • Асемблер містить оператор width , що дозволяє довідатися розмір елемента запису в бітах або повністю розмір запису. Варіанти застосування оператора width :

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

width ім'я_екземпляра_запису

або

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

mov al,width i2

...

mov ax,width iotest

  • Асемблер містить оператор mask , що дозволяє локалізувати біти потрібного елемента запису. Ця локалізація виробляється шляхом створення маски, розмір якої збігається з розміром запису. У цій масці обнулены біти на всіх позиціях, за винятком тих, які займає елемент у записі.

  • Самі дії по перетворенню елементів записи виробляються за допомогою логічних команд.

Тепер у вас є вся інформація про засоби асемблера для роботи із записами. Ви також зрозуміли, що безпосередньо звернутися до елемента запису неможливо. Щоб зробити обробку елемента, що цікавить нас,, потрібно спочатку виділити, зрушити його, при необхідності, до молодших розрядів, виконати необхідні дії й помістити його назад на своє місце в записі. Тому, щоб вам не винаходити щораз велосипед, далі ми опишемо типові алгоритми здійснення цих операцій над елементами запису. Ваше завдання - закодувати ці алгоритми тим або іншому способу відповідно до вимог завдання.