
- •Контрольна робота №1 з курсу "Системне програмування"
- •Завдання:
- •Рішення
- •Недоліки
- •Лабараторна робота №1
- •Короткі теоретичні відомості
- •Лабораторне завдання
- •Текст програми Hello.Asm
- •Лабораторна робота №2
- •Короткі теоретичні відомості Стандартні способи вводу-виводу dos
- •Ввід з клавіатури символьної інформації.
- •Функції dos виводу даних на екран.
- •Лабораторне завдання
- •Текст програми
- •Лабараторна робота №3
- •Короткі теоретичні відомості
- •Характеристика атрибута символа у відеобуфері.
- •Коди кольорів стандартної палітри. Таблиця 1
- •Довідкові дані по функціях bios
- •Лабораторне завдання
- •Текст програми
Ввід з клавіатури символьної інформації.
Буфер вводу даних з клавіатури.
Натиснення будь-якої клавіші клавіатури викликає сигнал апаратного переривання (переривання з типом 09h), що примушує процесор перервати програму, що виконується і перейти на підпрограму обробки переривання від клавіатури[6]. Обробник переривання формує двобайтовий код з подальшим засиланням його в кільцевий буфер вводу даних з клавіатури, розташований за адресою 0040h:001Eh в системний області оперативної пам'яті. Для алфавітно-цифрових клавіш старший байт цього коду представляє scan- код клавіші (умовний номер клавіші на клавіатурі), а молодший -ASCII-код клавіші, тобто 8- бітовий код закріпленого за цією клавішею символа.
Заповнення буфера клавіатури, розрахованого на 15 слів або ударів по клавішах, відбувається по мірі натиснення клавіш і не пов'язане з виконанням поточної програми. Якщо програмі потрібно ввести з клавіатури певний символ (або рядок), вона за допомогою відповідної системної функції DOS звертатися до буфера вводу і, при наявності в ньому даних, передає перший з символів, що поступили в цей буфер в програму. Справа в тому, що запис і зчитування кодових слів в буфер клавіатури відповідає принципу FIFO (first in- first out, перший увійшов - першим вийшов), тому зчитування символа з буфера звільняє місце для вводу подальших символів.
Якщо до моменту виклику функції DOS буфер вводу виявляється пустий, DOS буде безперервно опитувати його стан, чекаючи на появу в буфері чергового коду, а виконання програми припиняється до натиснення клавіші.
Процес зчитуваннякодів з буфера вводу може дати непередбачуваний ефект, якщо перед викликом функції DOS цей буфер не був пустий. Програма що не бажає вводити набрані достроково коди, повинна очистити клавіатури з допомогою спеціальної функції 0Ch переривання 21h (при al=0).
Системні функції DOS вводу даних з клавіатури.
DOS надає декілька способів вводу даних з клавіатури [19]):
-
використаннягрупи функцій Int 21h (01h, 06h, 08h, 0Ah 0Ch), що забезпечують посимвольний ввід з клавіатури в різних режимах;
-
звертання до клавіатури, як до файла, за допомогою функції 3Fh.
Всі функції DOS, що зчитують дані з клавіатури, передають в програму тільки ASCII- код (молодший байт кодового слова клавіші), залишаючи scan- код (старший байт) без уваги. Правда це відноситься тільки до алфавітно-цифрових клавіш, тобто клавішам, за якими закріплені символи, що відображаються на екрані (94 символи зі значеннями ASCII- коду від 32 до 126). Особливості зчитування інформаційних кодів з інших, так званих функціональних і керуючих клавіш, буде розглянуто далі в розділі Розширені коди ASCII.
-
Функція 01h. Ввід одиничного символа з відгуком.
Вводить символ з стандартного пристрою вводу і відображає його на пристрої стандартного виводу. При відсутності символа чекає вводу. При наборі рядка обробляються керуючі клавіші: BS (крок назад), TAB (табуляція), ENTER (перехід на початок поточного рядка). Допускає перенаправлення вводу. Якщо ввід не перенаправляти, виконує обробку <Ctrl/С> (натиснення даної комбінації клавіш викликає обробник переривання int 23h, що завершує поточну програму з виходом в DOS). Для читання розширеного коду ASCII вимагає повторного виконання функції.
Виклик:AH=01, Int 21h.
Вихід:AL= код символа.
Для одержання практичних знань для роботи з цією, а також деякими іншими функціями DOS, призначений демонстраційний файл-програма Demon.asm, приведений в Додатку A до даної роботі.
Функція 06h. Ввід одиничних символів з стандартного пристрою вводу і виводу одиничних символів на стандартний пристрій виводу.
Режим роботи визначається вмістом регістра DL в момент виклику функції: DL= FF- режим вводу, DL= {FFh- 00h}- режим виводу відповідного цьому коду символа . В режимі виводу коди ASCII: 07h- дзвінок, 0Dh- повернення каретки, 0Ah- перевід стрічки, розглядаються як керуючі і виконують відповідні їм дії.
Якщо символ, що вводиться в пристрої вводу присутній, то він вміщується в AL (без відгуку) з установкою прапора ZF=0, інакше ZF=1. Особливістю функції 06h є те, що вона, переглядаючи пристрій вводу, не зупиняє програми, якщо не виявляє в ньому символа, а просто встановлює прапор ZF=1 (виявлено 0- символів).Допускає перенаправлення вводу- виводу. Для читання розширеного коду ASCII потрібне повторне виконання функції.
Виклик:AH=06h, Int 21h.
Ввід (без відгуку): DL=FF. Вихід: ZF=0, AL= код символа;
ZF=1,- пристрій вводу пустий.
Вивід: DL=FE 00. Код в регістрі DL є одночасно і кодом символа, що виводиться .
Функція . Ввід символа без відгуку.
Вводить символ з стандартного пристрою вводу. При відсутності символа чекає його вводу. Допускає перенаправлення вводу. Для читання розширеного коду ASCII вимагає повторне виконання функції. Якщо ввід не перенаправляти, виконує обробку <Ctrl/С> (інакше треба заздалегідь включити режим BREAK).
Функція, як правило, використовується для вводу пароля для захисту програми від несанкціонованого запуску. Приклад використання даної функції буде розглянутий в одній з програм цієї роботи.
Виклик:AH=08h, Int 21h.
Вивід:AL= код символа.
-
Функція 0Ah. Буферизований ввід з клавіатури.
Вводить рядок байт з пристрою стандартного вводу в буфер користувача за адресою DS:DX, з відображенням на пристрої стандартного виводу. Допускає перенаправлення вводу. Якщо ввід не перенаправляти, виконує обробку <Ctrl/С> (інакше треба заздалегідь включити режим BREAK).
Функція допускає редагування даних при їх введенні клавішами: Backspace (скасування останнього символа), Exc (скасування усього набраного тексту), F5 (запам'ятовує поточний рядок як підказку) F3 (відновлює підказку для вводу). Ввід символів стрічки закінчується натисненням клавіші <Enter>, код якої (0Dh), вводиться як останній символ у відведений буфер.
Структура буфера (резервується в сегменті даних): байт 0- максимальна довжина стрічки (1 - 254), що призначається користувачем з урахуванням символа CR(0Dh), байт 1- число реально введених символів без врахування символа CR, байт 2 і далі - стрічка. У наступному прикладі наведена процедура In_string вводу стрічки в буфер, місткістю 50 символів. Вона повертає адресу першого символа стрічки в регістрі DX, а число символів в регістрі CX.
Buf DB |
50,?, 50 DUP(?) |
;буфер користувача |
PROC |
In_string |
|
|
push ax |
|
|
lea dx, [Buf] |
;Адреса буфера користувача |
|
mov ah, 0Ah |
;запит функції 0Ah |
|
int 21h |
;Виклик DOS |
|
sub ch, ch |
|
|
mov cl, [Buf+1] |
;Вмістити лічильник символів в cx |
|
add dx, 2 |
;Зробити dx покажчиком рядка |
|
pop ax |
|
|
ret |
|
|
ENDP |
In_string |
Функція0Ch.ВикликслужбовоїфункціїDOSдлявводуданихзпопереднімочищеннямбуфераклавіатури. Допускає перевизначити ввід.
Виклик: AH= 0Ch, Int 21h,
AL= номерфункціївводу: 01, 07, 08, 0Ah (якщоAL=0, тотількиочищення),
DS:DX = адреса буфера, якщо AL=0Ah.
Вихід: AL = байт вхідних даних (якщо при виклику Al=0Ah, дані вміщуються в буфер).
Універсальна функція вводу даних в буфер з вказівником DS:DX з джерела, визначеного дескриптором в регістрі BX.. Допускає перевизначення вводу. У регістрі CX вказується число байтів, яке необхідно ввести.
-
Функція 3Fh. Ввід даних з файла або пристрою.
In_Area |
DB |
20 DUP(?) |
|
mov ah, 3Fh |
;Запитфункції |
|
mov bx, 00h |
;Дескриптор вводу (клавіатури) |
|
mov cx, 20 |
;Число байт, що пересилаються |
|
lea dx, [In_Area] |
;Адреса буфера вводу |
|
int 21h |
;Виклик функції DOS |
Команда Int чекає закінчення вводу символів, яке фіксується натисненням клавіші Enter. Після вводу тексту і натиснення клавіші Enter в буфер In_Aria автоматично вводиться два керуючих символи: CR(код 0Dh) і LF(код 0Ah). Внаслідок даної особливості, максимальне число символів і розмір буфера вводу повинні містити місце для двох додаткових символів. При успішному завершенні операції прапор CF=0, а в регістрі AX встановлюється число байтів, введених з клавіатури (плюс два додаткових символи). Якщо CF=1, то в регістрі AX міститься поворотний код помилки. Це або 5 (відмова в доступі), або 6 (невірний дескриптор).
До особливостей використання даної функції потрібно віднести автоматичний перехід на новий рядок по закінченню вводу даних.