· Буфер вводу даних з клавіатури.
Натиснення будь-якої клавіші клавіатури викликає сигнал апаратного переривання (переривання з типом 09h), що примушує процесор перервати програму, що виконується і перейти на підпрограму обробки переривання від клавіатури[6]. Обробник переривання формує двобайтовий код з подальшим засиланням його в кільцевий буфер вводу даних з клавіатури, розташований за адресою 0040h:001Eh в системний області оперативної пам'яті. Для алфавітно-цифрових клавіш старший байт цього коду представляє scan - код клавіші (умовний номер клавіші на клавіатурі), а молодший - ASCII -код клавіші, тобто 8- бітовий код закріпленого за цією клавішею символа.
Заповнення буфера клавіатури, розрахованого на 15 слів або ударів по клавішах, відбувається по мірі натиснення клавіш і не пов'язане з виконанням поточної програми. Якщо програмі потрібно ввести з клавіатури певний символ (або рядок), вона за допомогою відповідної системної функції DOS звертатися до буфера вводу і, при наявності в ньому даних, передає перший з символів, що поступили в цей буфер в програму. Справа в тому, що запис і зчитування кодових слів в буфер клавіатури відповідає принципу FIFO (first in- first out, перший увійшов - першим вийшов), тому зчитування символа з буфера звільняє місце для вводу подальших символів.
|
|
Якщо до моменту виклику функції DOS буфер вводу виявляється пустий, DOS буде безперервно опитувати його стан, чекаючи на появу в буфері чергового коду, а виконання програми припиняється до натиснення клавіші.
Процес зчитуваннякодів з буфера вводу може дати непередбачуваний ефект, якщо перед викликом функції DOS цей буфер не був пустий. Програма що не бажає вводити набрані достроково коди, повинна очистити клавіатури з допомогою спеціальної функції 0Ch переривання 21h (при al=0).
· Системні функції DOS вводу даних з клавіатури.
DOS надає декілька способів вводу даних з клавіатури [ 1¸9 ]):
· використаннягрупи функцій 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 є одночасно і кодом символа, що виводиться.
Функція 08h. Ввід символа без відгуку.
Вводить символ з стандартного пристрою вводу. При відсутності символа чекає його вводу. Допускає перенаправлення вводу. Для читання розширеного коду 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 (невірний дескриптор).
До особливостей використання даної функції потрібно віднести автоматичний перехід на новий рядок по закінченню вводу даних.