Вывод на экран в текстовом режиме
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
На прикладі першої програми на асемблері ми вже познайомилися з одним зі способів виводу тексту на екран — викликом функції DOS 09h. Це далеко не єдиний спосіб виводу тексту — DOS надає для цього кілька функцій. Функція DOS 02h — Записати символ у STDOUT з перевіркою на Ctrl-Break
Ця функція при виводі на екран обробляє деякі керуючі символи — вивід символу 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 не встановлений у 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-видеорежим
Якщо біт 15 регістра ВХ встановлений у 1, відеопам'ять не очищається. Текстові режими, які можна викликати з використанням цієї функції: 80x60 (режим 108h), 132x25 (109h), 132x43 (10Ah), 132x50 (10Bh), 132x60 (10Ch). Відеорежим, використовуваний у DOS за замовчуванням, — текстовий режим 3. Управління положенням курсору INT 10h, АН = 02 — Установити положення курсору
За допомогою цієї функції можна установити курсор у будь-яку позицію екрана, і подальший вивід тексту буде походити з цієї позиції. Відлік номера рядка і стовпця ведеться від верхнього лівого кута екрана (символ у лівій верхній позиції має координати 0, 0). Номера сторінок 0 – 3 (для режимів 2 і 3)і 0 – 7 (для режимів 1 і 2) відповідають області пам'яті, уміст якої в даний момент відображається на екрані. Можна вивести текст у неактивну в даний момент сторінку, а потім переключитися на неї, щоб зображення змінилося миттєво. INТ 10h, АН = 03 — Вважати положення і розмір курсору
Повертає поточний стан курсору на обраній сторінці (кожна сторінка використовує власний незалежний курсор).
Вивід символів на екран Кожен символ на екрані описується двома байтами — ASCII-кодом символу і байтом атрибута, що вказує колір символу і тла, а також чи є символ миготливої. Атрибут символу: Біт 7: символ мигає (за замовчуванням) або тло яскравого кольору (якщо його дія була перевизначена відеофункцією 10h). Біти 6 – 4: колір тла. Біт 3: символ яскравого кольору (за замовчуванням) або тло мигає (якщо його дія була перевизначена відеофункцією 11h). Біти 2 – 0: колір символу. Кольори кодуються в бітах, як показано в таблиці 1. Таблиця 1. Атрибути символів
INT 10h, АН = 08 — Вважати символ і атрибут символу в поточній позиції курсору
INT 10h, АН = 09 — Вивести символ із заданим атрибутом на екран
За допомогою цієї функції можна вивести на екран будь-який символ, включаючи навіть символи CR і LF, що звичайно інтерпретуються як кінець рядка. У графічних режимах СХ не повинний перевищувати число позицій, що залишилося до правого краю екрана. INT 10h, АН = 0Ah — Вивести символ з поточним атрибутом на екран
Ця функція також виводить будь-як символ на екран, але як атрибут символу використовується атрибут, що мав символ, що знаходився раніше в цій позиції. INT 10h, АН = 0Eh — Вивести символ у режимі телетайпа
Символи CR (0Dh), LF (0Ah), BEL (7) інтерпретуються як керуючі символи. Якщо текст при записі виходить за межі нижнього рядка, екран прокручивается нагору. Як атрибут використовується атрибут символу, що знаходився в цій позиції.
INT 10h, AH = 13h — Вивести рядок символів із заданими атрибутами
Функція 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 зручні для переключення і настроювання відеорежимів, але часто виявляється, що вивід тексту на екран набагато швидше і простіше виконувати просто копіюванням зображення у відеопам'ять.
Читайте также: B) оказание помощи в выводе акций инвестируемых предприятий на фондовый рынок Воспользуйтесь поиском по сайту: ©2015 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|