Ввід з клавіатури символьної інформації

· Буфер вводу даних з клавіатури.

Натиснення будь-якої клавіші клавіатури викликає сигнал апаратного переривання (переривання з типом 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 (невірний дескриптор).

До особливостей використання даної функції потрібно віднести автоматичний перехід на новий рядок по закінченню вводу даних.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: