Реалізація екранних операцій у мові програмування асемблер 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Реалізація екранних операцій у мові програмування асемблер



Розглянемо головні екранні операції та їх реалізацію у мові програмування асемблер. Виведення даних на екран можна реалізувати трьома засобами:

* через безпосереднє звертання до відеопам’яті;

* через використання переривання BIOS 10H;

* через використання переривання MS-DOS 21H;

Нижче наведені засоби реалізацій найбільш важливих екранних операцій.

Встановлення курсора на задану позицію. Як вам відомо, екран монітора у текстовому режимі містить 25 рядків по 80 символів у кожному. Координати встановлення курсора містять номер рядка та стовпця, але нумерація починається з нуля. Тобто, можливі горизонтальні координати - 0...24 (0...18H), а вертикальні - 0...79 (0...4FH). Встановити курсор на задану позицію можна через використання функції 2 переривання BIOS 10H чином:

* до регістру AH треба завантажити число 02 (номер функції переривання, що відповідає цій операції);

* завантажити до регістру DH номер рядку, а до регістру - DL номер стовпця;

* завантажити до регістру BX номер сторінки екрану (для одноекранних програм обов’язково завантажити число 0).

Наприклад, для встановлення курсора на 12-у позицію 5-го рядку треба написати такий фрагмент програми:

MOV AH,02

MOV BH,00

MOV DH,05

MOV DL,12

INT 10H

Очищення екрану. На початку роботи програми часто-густо треба виконати функцію очищення екрану. Переривання BIOS 10H дозволяє очищувати будь-яку прямокутну область екрану, тобто область для очищення може починатися з будь-якої позиції та будь-якою позицію закінчуватись. Початкове значення рядка завантажується до регістру СH, початкове значення стовпця - до регістру CL, кінцеве значення рядка - до регістру DH, кінцеве значення стовпця - до регістру DL. Для визначення функції переривання треба занести до регістру АH число 06H. Треба чітко слідкувати за тим, щоб координати кінцевої позиції перевищували координати початкової. Для придання екрану нормального атрибуту (виведення білих символів на чорному фоні) треба занести в регістр ВН число 07H. Наступний фрагмент програми виконує очищення всього екрану:

 

MOV AX,0600H

MOV BH,07

MOV CX,00

MOV DX,184FH

INT 10H

Встановлення розміру курсора. Як вам відомо, вертикальний розмір курсора при роботі у текстовому режимі MS-DOS може змінюватись від великого значення (майже на всю довжину рядка, перекриваючи літери) до малого (тонка рисочка). Переривання BIOS 10H дозволяє ефективно змінювати розмір курсора. Але нажаль, операції, яка б могла встановити однотипну форму курсора для будь-яких типів монітора, не існує. Більш того, якщо програміст вирішив «загасити» курсор при виконанні своєї програми, на моніторі з іншими параметрами (наприклад на чорно-білому) він при виконанні цієї ж програми може прийняти максимальний розмір. Проте, для більшості сучасних моніторів максимальна висота курсора становить 13 ліній.

Для встановлення розміру курсора може бути ефективно використана функція 01H переривання BIOS 10H. У регістр CL заноситься нижня, а у регістр CH - верхня лінія курсору. Наприклад, фрагмент програми для придання курсору мінімального розміру (одна лінія) можна записати так:

MOV AH,01H

MOV CH,00

MOV CL,01

INT 10H

Читання поточного положення курсора та його розміру. Ця функція виконується через викликання переривання BIOS 10Н, функція 03H. Після повернення до головної програми в регістрах процесора містяться такі числа:

DH - номер рядка;

DL - номер стовпця;

CH - верхня лінія курсора;

CL - нижня лінія курсора.

Зрозуміло, що всі дані, які знаходились у цих регістрах до виконання команди INT, будуть втрачені.

Виведення символів на екран. Всі процедури BIOS та MS-DOS для виведення на екран розміщують символ, що виводиться, на поточній позиції курсора, та зміщують курсор на одну позицію праворуч. При досягненні 80 позиції курсор переміщується на першу позицію наступного рядка (якщо програмістом не були дані «особливі вказівки» зміщувати в цьому випадку символ на 1 позицію праворуч). Більшість переривань, призначених для виведення символів на екран, потребують задавання його атрибуту (атрибут - це чисельний опис кольорів символу та його фону), а у деяких випадках виводять символ з поточним атрибутом.

Але не є складним і безпосереднє виведення даних на екран монітору через звернення до відеопам’яті. Для цього достатньо розташувати ASCII-код символу та його атрибут у відповідних комірках пам’яті. У всіх кольорових моніторах пам’ять відеоадаптера розташована за адресою B8000H (див. рис. 2 у описі лабораторної роботи №1). Перша комірка пам’яті містить ASCII-код символу, що виводиться, а друга його атрибут. Таким чином, для виведення символу на першу позицію першого рядку треба у комірку пам’яті з адресою B8000H занести його ASCII-код, а у комірку з адресою B8001H його атрибут. ASCII-код символу, що розташований на другій позиції першого рядку, буде міститися за адресою B8002H і так далі.

Атрибут символу формується таким чином. Перші три біти містять колір тексту, що закодований у форматі RGB (від англійського скорочення складових частин білого кольору: R ed - червоний, G reen - зелений, B lue - синій). Четвертий біт - біт яскравості кольору (0-мала, 1-велика). П’ятий, шостий та сьомий біт кодують колір текстового фону у форматі RGB, а встановлення в одиницю восьмого біту призводить до блимання символу.

Коди кольорів у форматі RGB такі:

Чорний - 000;

Синій - 001;

Зелений - 010

Блакитний - 011;

Червоний - 100;

Бузковий - 101;

Бурий - 110;

Білий - 111

Більш ефективно виведення символів на екран можна організувати за допомогою переривань BIOS та MS-DOS.

Функція 0AH переривання BIOS 10H виводить символ на поточну позицію курсора. Номер функції, як завжди, завантажується до регістру AH. До регістру AL завантажується ASCII-код символу, а до регістру CX - число повторень при виведенні, але воно буде здійснюватися на ту ж саму позицію. Курсор не переміщується. Таке виведення даних можна ефективно використовувати для створення ефекту візуальної ротації у текстовому режимі. Наприклад, такий ефект створює послідавне виведення на одну й ту ж саму позицію символів прямого слешу (/), зворотнього слешу (\) та символу “або” (|). При виведенні рядкових та чисельних даних поторення не використовуються.

Функція 09 переривання BIOS 10H ідентична функції 0AH, але забезпечує виведення символів з атрибутом. Атрибут символа завантажується до регістру BL.

Функція 13H переривання BIOS 10H дозволяє виводити на екран рядок символів з встановленням атрибуту та зміщенням курсора. Адреса рядку завантажується до регістру BL, а довжина – до регістру CX.

Як можна побачити, використання переривання BIOS 10H не завжди є ефективним, особливо при виведенні рядків символів. Проте через використання цього апаратного переривання зручно здійснювати елементарні екранні операції.

Переривання MS-DOS 21Н є більш зручним при практичному вирішенні задач виведення інформації на екран. Головні його функції такі:

Функція 06 – є дуже зручною, оскільки забезпечує введення символу з клавіатури та його виведення на екран. Якщо в регістр DL завантажене число FFH, то переривання буде здійснювати зчитування символу з порту клавіатури. ASCII-код символу буде завантажений до регістру AL. A якщо в регістр DL завантажене число, яке менше за FFH, то воно буде ідентифіковано як розширений ASCII-код символу, що треба вивести на екран.

Функція 09 – виведення рядка символів. Це теж дуже зручна функція, яка часто-густо використовується. Виведення на екран проводиться послідовно з сусідніх комірок пам’яті на поточну позицію курсора, доки у комірці пам’яті, яку треба відобразити на екрані, не зустрінеться символ долару (“$”). Наприклад:

N1 DB ’Групи ДЕ-71, ДЕ-72$’

…………………………………………….

MOV AH, 09

LEA DX, N1

INT 21H

Після виконання цього невеликого фрагменту програми на екрані з поточної позиції курсора буде виведений рядок:

 

Групи ДЕ-71, ДЕ-72

 

Курсор буде встановлений на позицію, яка розташована після останньго символа строки, (тобто після цифри 2).

Функція 40H – виведення у файл або на пристрій. Записує вказану кількість байтів у відкритий файл або пристрій. Параметри функції:

BX — дескриптор файлу або пристрою (1 — для терміналу);

CX — кількість байтів, що мають бути записані;

DS:DX — адреса масиву, що буде записуватися.

Якщо під час операції виведення виникає помилка, встановлюється флаг CF, і в AX повертається код помилки. Якщо операція виконана успішно, флаг CF скидається, і в AX повертається кількість записаних байтів.

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

N1 DB ’Групи ДЕ-71, ДЕ-72’

N1_L DW $-N1

…………………………………………….

MOV AH, 40H

MOV BX, 1

MOV CX, N1_L

LEA DX, N1

INT 21H

Більш докладно функції переривання MS-DOS та BIOS для роботи з різноманітними пристроями наведені у додатку 2 (Функції переривань BIOS – розділ Д2.1, функції переривань MS-DOS, крім переривання INT 21H - розділ Д2.2, функції переривання MS-DOS INT 21H - розділ Д2.3, таблиця 25).

2. Індивідуальні завдання для виконання лабораторної роботи №4

Виведіть на екран числа, які містяться у регістрах процесора, після виконання Вами лабораторної роботи №3. Перед початком виведення даних на екран треба загасити курсор. Форма представлення чисел – десяткова або шістнадцятирічна (вказано у завданні). У таблиці 24 для індивідуальних завдань біля кожного з регістрів вказані координати виведення. Наприклад, запис AX®2,10 означає, що число, яке міститься у регістрі AX треба розташувати на другій позиції десятого рядку екрану монітора.

 

Таблиця 24. Початкові дані для лабораторної роботи №4

№ варіанту Завдання
  AX®5,10; BX®20,10; CX®35,10; DX®50,10. Шістнадцятирічна форма представлення.
  AX®5,12; BX®20,12; CX®5,15; DX®20,15. Десяткова форма представлення.
  AX®5,10; BX®20,10; CX®5,15; DX®20,15. Шістнадцятирічна форма представлення.
  AX®15,10; BX®30,10; CX®15,15; DX®30,15. Шістнадцятирічна форма представлення.
  AX®5,12; BX®20,12; CX®5,15; DX®20,15. Десяткова форма представлення.
  AX®5,10; BX®21,10; CX®5,16; DX®21,16. Шістнадцятирічна форма представлення.
  AX®25,17; BX®55,17; CX®25,21; DX®55,21. Шістнадцятирічна форма представлення.
  AX®5,18; BX®20,18; CX®5,10; DX®28,10. Десяткова форма представлення.
  AX®5,14; BX®24,14; CX®5,15; DX®24,15. Шістнадцятирічна форма представлення.
  AX®59,10; BX®25,10; CX®25,17; DX®59,15. Шістнадцятирічна форма представлення.
  AX®51,18; BX®20,18; CX®51,10; DX®20,10. Десяткова форма представлення.
  AX®12,14; BX®24,14; CX®12,19; DX®24,19. Шістнадцятирічна форма представлення.
  AX®55,10; BX®2,10; CX®2,15; DX®55,15. Шістнадцятирічна форма представлення.
  AX®5,8; BX®20,8; CX®5,1; DX®20,1. Десяткова форма представлення.
  AX®5,14; BX®24,14; CX®5,15; DX®24,15. Шістнадцятирічна форма представлення.
  AX®55,10; BX®25,10; CX®55,17; DX®25,17. Шістнадцятирічна форма представлення.
  AX®5,18; BX®20,18; CX®5,15; DX®20,15. Десяткова форма представлення.
  AX®5,12; BX®22,12; CX®5,15; DX®22,15. Шістнадцятирічна форма представлення.
  AX®5,1; BX®25,1; CX®5,8; DX®25,8. Десяткова форма представлення
  AX®5,55; BX®5,22; CX®24,22; DX®24,55. Шістнадцятирічна форма представлення.
  AX®5,10; BX®25,10; CX®5,17; DX®25,17. Шістнадцятирічна форма представлення.
  AX®5,8; BX®25,8; CX®5,1; DX®25,1. Десяткова форма представлення.
  AX®5,10; BX®24,10; CX®5,15; DX®24,15. Шістнадцятирічна форма представлення.
  AX®35,18; BX®20,18; CX®35,15; DX®20,15. Десяткова форма представлення.
  AX®5,5; BX®5,22; CX®24,22; DX®24,5. Шістнадцятирічна форма представлення.

 

Порядок виконання роботи

Написати на мові асемблера процедуру для переведення чисел з двійкового формату до ASCII - формату та відлагодити її.

Включити цю процедуру до асемблерної програми, яку ви отримали за результатами лабораторних робіт 2 та 3.

Організувати обмін даними між головною програмою та процедурою.

За допомогою викликання процедури перевести отримані вами у роботі 3 результати розрахунків з двійкового формату до формату ASCII.

Вивести отримані ASCII-рядки даних на екран монітору через використання системного переривання 21H.

Зміст звіту

1. Роздрукована програма на мові асемблера.

2. Роздруковані результати.

3. Висновки за результатами роботи.

5. Контрольні питання

Дайте докладні відповіді на питання, що їх поставлено у наведених завданнях для самоперевірки 1-14.

1. Які ви знаєте команди обробки рядків в асемблері?

2. Що уявляють собою формати ASCII та BCD? Як вони пов’язані з двійковим форматом представлення чисел?

3. Команди асемблера для введення та виведення даних через порт. Їх використання для роботи з зовнішніми пристроями.

4. Поняття переривання та використання переривань для роботи з зовнішніми пристроями.

5. Безпосереднє звертання до зовнішніх пристроїв через порти введення-виведення даних

6. Головні функції апаратного переривання 10h, що використовуються для виведення даних на монітор.

7. Головні функції системного переривання 21h, що використовуються для виведення даних на монітор.

8. Структура відеопам’яті.



Поделиться:


Последнее изменение этой страницы: 2016-04-26; просмотров: 437; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.149.214.32 (0.023 с.)