Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Контрольна робота№1.doc
Скачиваний:
1
Добавлен:
18.12.2018
Размер:
441.86 Кб
Скачать

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

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

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

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