Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Вывод на экран в текстовом режиме




3.1.1. Засоби DOS. Згадаємо ще раз першу програму.

; hello. asm

org 100h; початкове значення лічильника - 100h

use16

start: mov ah,9; номер функції DOS - в АН

mov dx, message; адреса рядка - у DX

int 21h; виклик системної функції DOS

ret; завершення Сома-програми

message db “Hello World!",0Dh,0Ah,'$'; рядок для виводу

Функція DOS 09h — Записати символ у STDOUT без перевірки на Ctrl-Break

Уведення: АН = 09h DL = ASCII-код символу (крім FFh)
Вивід: ? Ніякого?, відповідно до документації

На прикладі першої програми на асемблері ми вже познайомилися з одним зі способів виводу тексту на екран — викликом функції DOS 09h. Це далеко не єдиний спосіб виводу тексту — DOS надає для цього кілька функцій.

Функція DOS 02h — Записати символ у STDOUT з перевіркою на Ctrl-Break

Уведення: АН=02h DL = ASCII-код символу
Вивід: Ніякого, відповідно до документації, але насправді: AL = код останнього записаного символу (дорівнює DL, крім випадку, коли DL = 09h (табуляція), тоді в AL повертається 20h).

Ця функція при виводі на екран обробляє деякі керуючі символи — вивід символу BEL (07h) приводить до звукового сигналу, символ BS (08h) приводить до руху курсору вліво на одну позицію, символ НТ (09h) заміняється на кілька пробілів, символ LF (0Ah) опускає курсор на одну позицію вниз, і CR (0Dh) приводить до переходові на початок поточного рядка.

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

Наприклад, напишемо програму, що виводить на екран усі ASCII-символи, 16 рядків по 16 символів у рядку.

Приклад 1

; dosoutl. asm

; Виводить на екран усі ASCII-символи

;

org 100h; початок Сома-файлу

use16

mov cx, 256; вивести 256 символів

mov dl,0; перший символ - з кодом 00

mov ah,2; номер функції DOS “вивід символу”

cloop: int 21h; виклик DOS

inc dl; збільшення DL на 1 - наступний символ

test dl,0Fh; якщо DL не кратний 16,

jnz continue_loop; продовжити цикл,

push dx; інакше: зберегти поточний символ

mov dl,0Dh; вивести CR

int 21h

mov dl,0Ah; вивести LF

int 21h

pop dx; відновити поточний символ

continue_loop:

loop cloop; продовжити цикл

ret

Тут за допомогою команди LOOP оформляється цикл, що виконується 256 разів (значення регістра СХ на початку циклу). Регістр DL містить код символу, що дорівнює нулеві на початку циклу і збільшується щораз на 1 командою INC DL. Якщо значення DL відразу після збільшення на 1 кратно 16, воно тимчасово зберігається в стеці і на екран виводяться символи CR і LF, що виконують перехід на початок нового рядка. Перевірка виконується командою TEST DL,0Fh — результат операції AND над DL і 0Fh буде нулем, тільки якщо молодші чотири біти DL дорівнюють нулеві, що і відповідає кратності шістнадцяти.

Засобу BIOS

Функції DOS виводу на екран дозволяють перенаправляти вивід у файл, але не дозволяють вивести текст у будь-яку позицію екрана і не дозволяють змінити колір тексту. DOS припускає, що для більш тонкої роботи з екраном програми повинні використовуватися відеофункції BIOS. BIOS (базова система введення-виводу) — це набір програм, розташованих у постійній пам'яті комп'ютера, що виконують його завантаження відразу після включення і забезпечують доступ до деяких пристроїв, зокрема до відеоадаптера. Усі функції відеосервісу BIOS викликаються через переривання 10h. Розглянемо функції, що можуть бути корисні для виводу текстів на екран.

Вибір відеорежиму

BIOS надає можливість переключення екрана в різні текстові і графічні режими. Режими відрізняються друг від друга дозволом (для графічних) і кількістю рядків і стовпців (для текстових), а також кількістю можливих квітів.

INT 10h, АН = 00 — Установити відеорежим

Уведення: AL = номер режиму в молодших 7 бітах
Вивід: Звичайно ніякого, але деякі BIOS (Phoenix і AMI) поміщають у AL 30Н для текстових режимів і 20h для графічних

Виклик цієї функції приводить до того, що екран переводиться в обраний режим. Якщо старший біт AL не встановлений у 1, екран очищається. Номера текстових режимів — 0, 1, 2, 3 і 7.0 і 1 — 16-кольорові режими 40x25 (з 25 рядками по 40 символів у рядку), 2 і 3 — 16-кольорові режими 80x25, 7 — монохромний режим 80x25. Ми не будемо поки розглядати графічні режими, хоча функції виводу тексту на екран DOS і BIOS можуть працювати й у них. Існує ще багато текстових режимів з більш високим дозволом (80x43, 80x60, 132x50 і т. д.), але їхнього номера для виклику через цю функцію різні для різних відеоадаптерів (наприклад, режим 61h — 132x50 для Cirrus 5320 і 132x29 для Genoa 6400). Однак, якщо відеоадаптер підтримує стандарт VESA BIOS Extention, у режими з високим дозволом можна переключатися, використовуючи функцію 4Fh.

INT 10h, АН = 4Fh, AL = 02 — Установити SuperVGA-видеорежим

Уведення: ВХ = номер режиму в молодших 13 бітах
Вивід: AL = 4Fh, якщо ця функція підтримується АН = 0, якщо переключення відбулося успішно АН = 1, якщо відбулася помилка

Якщо біт 15 регістра ВХ встановлений у 1, відеопам'ять не очищається. Текстові режими, які можна викликати з використанням цієї функції: 80x60 (режим 108h), 132x25 (109h), 132x43 (10Ah), 132x50 (10Bh), 132x60 (10Ch).

Відеорежим, використовуваний у DOS за замовчуванням, — текстовий режим 3.

Управління положенням курсору

INT 10h, АН = 02 — Установити положення курсору

Уведення: АН = 02 ВН = номер сторінки DH = рядок DL = стовпець

За допомогою цієї функції можна установити курсор у будь-яку позицію екрана, і подальший вивід тексту буде походити з цієї позиції. Відлік номера рядка і стовпця ведеться від верхнього лівого кута екрана (символ у лівій верхній позиції має координати 0, 0). Номера сторінок 0 – 3 (для режимів 2 і 3)і 0 – 7 (для режимів 1 і 2) відповідають області пам'яті, уміст якої в даний момент відображається на екрані. Можна вивести текст у неактивну в даний момент сторінку, а потім переключитися на неї, щоб зображення змінилося миттєво.

INТ 10h, АН = 03 — Вважати положення і розмір курсору

Уведення: АН = 03 ВН = номер сторінки
Вивід: DH, DL = рядок і стовпець поточної позиції курсору СН, CL = перший і останній рядки курсору

Повертає поточний стан курсору на обраній сторінці (кожна сторінка використовує власний незалежний курсор).

Вивід символів на екран

Кожен символ на екрані описується двома байтами — ASCII-кодом символу і байтом атрибута, що вказує колір символу і тла, а також чи є символ миготливої.

Атрибут символу:

Біт 7: символ мигає (за замовчуванням) або тло яскравого кольору (якщо його дія була перевизначена відеофункцією 10h).

Біти 6 – 4: колір тла.

Біт 3: символ яскравого кольору (за замовчуванням) або тло мигає (якщо його дія була перевизначена відеофункцією 11h).

Біти 2 – 0: колір символу.

Кольори кодуються в бітах, як показано в таблиці 1.

Таблиця 1. Атрибути символів

  Звичайний колір Яскравий колір
000b чорний темно-сірий
001b синій ясно-синій
010b зелений ясно-зелений
011b голубой світло-блакитний
100b червоний ясно-червоний
101b пурпурний світло-пурпурний
110b коричневий жовтий
111b ясно-сірий білий

INT 10h, АН = 08 — Вважати символ і атрибут символу в поточній позиції курсору

Уведення: АН = 08 ВН = номер сторінки
Вивід: АН = атрибут символу AL = ASCII-код символу

INT 10h, АН = 09 — Вивести символ із заданим атрибутом на екран

Уведення: АН = 09 ВН = номер сторінки AL = ASCII-код символу BL = атрибут символу СХ = число повторень символу

За допомогою цієї функції можна вивести на екран будь-який символ, включаючи навіть символи CR і LF, що звичайно інтерпретуються як кінець рядка. У графічних режимах СХ не повинний перевищувати число позицій, що залишилося до правого краю екрана.

INT 10h, АН = 0Ah — Вивести символ з поточним атрибутом на екран

Уведення: АН = 0Ah ВН = номер сторінки AL = ASCII-код символу СХ = число повторень символу

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

INT 10h, АН = 0Eh — Вивести символ у режимі телетайпа

Уведення: АН = 0Eh ВН = номер сторінки AL = ASCII-код символу

Символи CR (0Dh), LF (0Ah), BEL (7) інтерпретуються як керуючі символи. Якщо текст при записі виходить за межі нижнього рядка, екран прокручивается нагору. Як атрибут використовується атрибут символу, що знаходився в цій позиції.

INT 10h, AH = 13h — Вивести рядок символів із заданими атрибутами

Уведення: АН = 13h AL = режим виводу: біт 0 — перемістити курсор у кінець рядка після виводу бітів 1 — рядок містить не тільки символи, але також і атрибути, так що кожен символ описується двома байтами: ASCII-код і атрибут біти 2 – 7 зарезервовані СХ = довжина рядка (тільки число символів) BL = атрибут, якщо рядок містить тільки символи DH, DL = рядок і стовпець, починаючи з яких буде виводитися рядка ES: BP = адреса початку рядка в пам'яті

Функція 13h виводить на екран рядок символів, інтерпретуючи керуючі символи CR (0Dh), LF (0Ah), BS (08) і BEL (07). Якщо рядок підготовлений у форматі символ, атрибут — набагато швидше просто скопіювати неї у відеопам'ять, про що розказане в наступному розділі.

Скористаємося тепер функціями BIOS, щоб удосконалити програму DOSOUT1 і вивести на екран усі 256 символів, включаючи навіть символи перекладу рядка. Крім того, для кращої читаності таблиці після кожного символу буде виводитися пробіл.

Приклад 2

; biosout. asm

; Виводить на екран усі ASCII-символи без винятку

org 100h; Початок Сома-файлу

use16

start:

mov ax,0003h

int 10h; Відеорежим 3 (очищення екрана

; і установлення курсору в 0, 0)

mov dx,0; DH і DL будуть використовуватися

; для збереження положення курсору.

; Початкове положення - 0,0

mov si,256; SI буде лічильником циклу

mov al,0; Перший символ - з кодом 00h

mov ah,9; Номер відеофункції “вивід символу з атрибутом”

mov cx,1; Виводиться один символ за раз

mov bl,00011111b

; атрибут символу - білий на синьому

cloop:

int 10h; Вивести символ на екран

push ax; Зберегти поточний символ і номер функції

mov ah,2; Номер відеофункції 2 -

; змінити положення курсору

inc dl; Збільшити поточний стовпець на 1

int 10h; Перемістити курсор

mov ax,0920h; АН = 09, AL = 20h (ASCII-код пробілу)

int 10h; Вивести пробіл

mov ah,2; Номер відеофункції 2

inc dl; Збільшити стовпець на 1

int 10h; Перемістити курсор

pop ax; Відновити номер функції в ah

; і поточний символ у al

inc al; Збільшити AL на 1 - наступний символ

test al,0Fh; Якщо AL не кратний 16,

jnz continue_loop

; продовжити цикл,

push ax; інакше - зберегти номер функції

; і поточний символ

mov ah,2; Номер відеофункції 2

inc dh; Збільшити номер рядка на 1

mov dl,0; Стовпець = 0

int 10h; Установити курсор на початок наступного рядка

pop ax; Відновити номер відеофункції

; і поточний символ

continue_loop:

dec si; Зменшити SI на 1,

; якщо він не став нулем - продовжити

jnz cloop; CX використовується усередині циклу,

; так що не можна використовувати команду LOOP

; для його організації

ret; Завершення Сома-файлу

Тому що функція 09 виводить символ у позиції курсору, але не переміщає сам курсор, це приходиться робити щораз спеціально.

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

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...