Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_1-3.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
997.89 Кб
Скачать

1.4. Введення та виведення даних в мові асемблера

В мові асемблера, на відміну від мов програмування високого рівня, не існує команд введення даних з клавіатури та виведення на екран, аналогічних командам READ та WRITE. Тому робота з зовнішніми пристроями реалізується іншим чином. Перша можливість - це безпосереднє звертання до портів введення-виведення або відповідних комірок пам’яті (наприклад відеопам’яті або буфера клавіатури). Такий засіб роботи у літературі характеризується як програмування на «низькому рівні» [3]. Введення даних через порт реалізується за допомогою асемблерної команди IN, а виведення - за допомогою команди OUT. Формат команди IN:

{позначка} [код команди] [операнд], [операнд-адреса]

Формат команди OUT:

{позначка} [код команди] [операнд-адреса], [операнд]

Операнд-адреса у командах введення-виведення даних мусить містити номер порту, який програміст повинен знати наперед. Номер порту може вказуватись безпосередньо або завантажуватись до регістру DX. Наприклад:

MOV AX,20

MOV DX,40H

IN AX,60H

OUT AX,DX

Наведемо адреси деяких портів для комп’ютерів, сумісних з IBM PC XT [5]:

40H...42Н

Таймер

60H

Клавіатура

61H

Звуковий порт внутрішнього динаміка комп’ютера

3B0H...3BFH

Паралельний порт LPT1 та адаптер друку

ЗD0H...3DFH

Відеоадаптер

ЗF0H...3F7H

Контролер диска

Безпосередня робота з портами введення-виведення використовується при написані складних системних програм керування зовнішніми пристроями (драйверів зовнішніх пристроїв).

Другий засіб роботи з зовнішніми пристроями - використання апаратних або системних переривань. У літературі такий засіб роботи розглядається як програмування на «середньому рівні» [3]. В MS-DOS обробники апаратних перериваннь реалізовані у файлі io.sys, програмних у файлі msdos.sys. Звернутися до переривання досить просто - треба лише вказати його номер. Апаратні переривання (переривання BIOS) мають номери 01H-1FH, а системні переривання MS-DOS - номери 20H-27H. Використання системних переривань дає більше можливостей при введенні та виведенні даних, але працюють вони повільніше за апаратні.

Загальний формат команди переривання:

{позначка} INT [операнд (номер переривання)]

Але кожне з перервань може виконувати багато функцій, які визначаються вмістом регістрів загального призначення. Наприклад, за допомогою переривання MS-DOS 21H можна виводити дані на монітор, працювати з дисками, відкривати або закривати файли тощо. Функції базових переривань BIOS та MS-DOS наведені у додатку 2.

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

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

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

  • через використання переривання 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 (від англійського скорочення складових частин білого кольору: Red - червоний, Green - зелений, Blue - синій). Четвертий біт - біт яскравості кольору (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).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]