Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Ввід з клавіатури




Операційна система представляє декілька способів вводу даних з клавіатури:

§ звернення до клавіатури з допомогою файлової функції 3Fh переривання INT 21h;

§ використання групи функцій вводу-виводу із діапазону 01h..0Ch переривання INT 21h;

§ посимвольний ввід шляхом звернення до BIOS з допомогою переривання INT 16h.

Ввід з клавіатури засобами файлової системи (INT 21h, функція 3Fh) відбувається точно так, як і читання із файла. Звичайно використовується дескриптор 0, який закріплений за стандартним пристроєм вводу, тобто за клавіатурою. Число введених символів вказується в регістрі CX, однак ввід закінчується лише після того, коли нажата клавіша Enter, незалежно від того, чи введено фактично менше символів, чим було заплановано або більше. Тому при вводу рядка з клавіатури немає необхідності наперед задавати їх довжину, достатньо загрузити в регістр CX максимальну довжину рядка, наприклад 80 байт. У любому випадку в регістрі AX повертається число реально введених байтів, при тому враховуються також і 2 байта (13 і 10), які поступають у вхідний буфер при натисканні клавіші Enter.

Особливо ситуація виникає, якщо попробувати ввести більше символів, ніж потрібно функцією 3Fh. В процесі виконання цієї функції всі символи, що вводяться, тут же забираються із кільцевого буфера вводу і пересилаються в буфер DOS. Зафіксувавши у вхіднім потоці коди клавіші Enter, DOS пересилає із цього буфера в буфер користувача у програмі точно потрібне число символів (тут зрозуміло, без кодів Enter, які розміщуються в кінці введеного рядка). Інші символи залишаються в буфері DOS, які готові до вводу. Якщо не прийняти спеціальних заходів до очистки буфера, вони поступлять у програму при наступному запиті 3Fh, навіть, якщо оператор ще не почав вводити наступну порцію даних. Очевидно, що у цьому випадку буде порушена синхронізація ходу виконання програми з роботою оператора.

Другий спосіб отримання даних з клавіатури у програму, за допомогою функцій DOS із діапазону 01h...0Ch, є більш громіздкий, але забезпечує більш різнообразні можливості. Взагалі відмінність цих функцій DOS заключається в тому, що вони виконуються на окремому стеці DOS і до них можна звертатися в обробнику апаратних переривань, якщо в основній програмі використовується лише функції „дискової” групи (тобто всі останні функції DOS). Однак у програмах, незв’язаних із обробкою апаратних переривань, належність функції до цієї чи іншої групи немає особливого значення і при виборі для використання у програмі треба керуватися чисто функціональними уявами.

Функції вводу з коротким описом перелічені у таблиці 1.1.

 

Таблиця 1.1. Функції вводу із групи функцій вводу-виводу

Функція Призначення
01h Ввід символу з відгуком і обробкою Ctrl+c
06h Прямий символьний ввід-вивід через консоль
07h Ввід символу без відгуку і без обробки Ctrl+c
08h Ввід символу без відгуку і з обробкою Ctrl+c
0Ah Буферний ввід рядка з відгуком
0Bh Перевірка стану стандартного пристрою вводу
0Сh Скидання кільцевого буфера клавіатури і ввід однієї із функції

 

Функції 01h, 06h, 07h, 08h при кожному визові вводять у програму один символ із кільцевого буфера вводу; при необхідності ввести групу символів (стрічку) ці функції треба використати у циклі. Розрізняються вони наявністю або відсутністю відображення символу на екрані (відгуку), а також реакцією на ввід з клавіатури Ctrl+c. Функції 01h і 0Ah відображають на екрані символи, які вводяться; функції 07h і 08h цього не роблять, що дає можливість вводити дані таємно від сторонніх (наприклад, пароль або ключ). Друга відмінність описаних функцій торкається їх реакції на ввід Ctrl+c. При виконанні функції 01h і 08h DOS перевіряє кожний символ, який вводиться і, знайшовши у вхідні потоці код Ctrl+c (03h), аварійно закінчує програму. Функції 06h і 07h пропускають код Ctrl+c в програму, не роблячи по ньому ніяких спеціальних дій. Таким чином, якщо програма здійснює ввід з клавіатури функція 06h або 07h, її не можна аварійно закінчити командою Ctrl+c. В наш час, коли відомо і широко використовується методика перехвату переривання 23h з передачею управління на прикладний обробник команд Ctrl+c і Ctrl+Break, всі ці роздуми про Ctrl+c зазнали краху.

Функції 01h, 07h і 08h призначені тільки для виводу; функція 06h реалізує як посимвольний ввід з клавіатури, так і вивід символів на екран. Режим роботи цієї функції задається в регістрі AL: код FFh означає ввід, любий інший код приводить до виводу на екран відповідного цьому коду символу.

Функція 0Ah передає в буфер користувача стрічку, яка вводиться з клавіатури. Рядок повинен закінчуватись натисканням клавіші Enter, а її довжина не повинна бути більшою 254 символів. Символи, які вводяться, відображаються на екран; при вводі Ctrl+c проходить аварійне завершення програми.

Функція 0Bh дозволяє провірити наявність в кільцевому буфері вводу символів. При наявності символів програма повинна вилучити їх із буфера однією із функцій вводу; якщо символів немає, програма може продовжити виконання. Така методика використовується в програмах, які носять циклічний характер, коли треба забезпечити управлінням ходом виконання програми з клавіатури термінала. У кожному кроці циклу після виконання запланованих дій провіряється стан кільцевого буфера вводу; якщо протягом наступного кроку циклу оператор натиснув на будь-яку клавішу, програма проаналізує введений код і здійснить вихід із циклу і перехід в ту іншу точку; якщо ж буфер являється пустим, то циклічне виконання продовжиться.

Функція 0Bh чутлива до Ctrl+c. Це дає можливість організувати за її допомогою аварійне завершення програм на тих її ділянках, де виконується чисто процесорні дії. Якщо, наприклад, включити виклик функції 0Bh в цикл, то при відсутності вводу з клавіатури цикл буде виконуватись звичайним чином, але після вводу Ctrl+c програма аварійно завершиться, хоча на виконуваній ділянці не використовуються функції вводу-виводу.

Функція 0Ch служить для організації вводу з попередньою очисткою кільцевого буфера. Ці функції, крім 07h, вводять в програму найбільш старий із символів, які накопичились в кільцевому буфері вводу, реалізуючи тим самим можливість вводу з повідомленням. В цьому режимі оператор може нажимати на клавіші ще до видачі програмою запиту на ввід; коди на натиснутих клавішах (не більше 15) будуть накопичуватись у кільцевому буфері вводу і вилучатись звідси в програму по мірі виконання нею запитів на ввід. Залежності від того функція 07h спочатку очищає кільцевий буфер і лише потім чекає вводу символу з клавіатури. В результаті коди всіх раніше натиснутих (випадково) клавіш губляться. Звичайно функцію 0Сh використовують в програмі слідом за функцією виводу на екран символьного рядка з пропозицією оператора вводити дані. В результаті із кільцевого буфера забирається все „сміття” від випадкових натиснень, в програму поступає лише це, що вводиться оператором після запиту програми. При цьому режим вводу (з відгуком або без нього) визначає, яка саме функція вводу (01h, 07h, 08h або 0Ah) реалізується „всередині” функції 07h.

Функції 01h, 07h, 08h і 0Ah являються синхронними, так чи інакше при відсутності символу в кільцевім буфері чекають його вводу. Функція 06h дозволяє визначити стан кільцевого буфера і при наявності в нім коду вилучити цей код і обробити його, а при відсутності – продовжити виконання програми.

Функції 01h, 06h, 07h і 08h дозволяють вводити в програму розширені коди ASCII. Для того, виявивши, що введений код ASCII рівний нулю, потрібно виконати функцію заново. Це дає можливість керувати прикладними програмами з допомогою функціональних клавіш, а також комбінації Alt+цифра, Alt+буква і інш.

Функції 06h, 07h і 08h дозволяють вводити в програму коди символів з допомогою комбінацій Alt+цифра на цифровій клавіатурі (в тому числі деякі із перших 32 символів кодової таблиці і всю другу половину кодової таблиці).

Робота з клавіатурою на рівні BIOS (INT 16h) дозволяє зчитувати 2-байтові коди, які поступають в кільцевий буфер вводу (код ASCII+ска код) і аналізувати слово прапорців клавіатури (натискання клавіш Ctrl, Alt, Shift і інш.). Функціі BIOS, які використовуються для вводу з клавіатури, перечислені в табл. 1.2.

Функція 00h дозволяє в одній дії дістати повний 2-байтовий код натисненої клавіші або комбінацію клавіш, із якого можна взяти скан-код (деякі програми фіксують натиснені клавіші не по кодам ASCII, а по їх скан-кодам), а також дістати значну частину розширеного коду ASCII (при натисканні, наприклад, функціональних клавіш). Функція 00h являється синхронною: при її дії програма зупиняється і очікує натиснення клавіші.

 

Таблиця 1.2. Функції вводу BIOS (переривання int 16h)

Функція Призначення
00h Читання 2-байтового коду із вхідного буфера
01h Читання стану клавіатури і 2-байтового коду без витирання його із буфера
02h Читання прапорців клавіатури

 

Функція 01h відноситься до числа асинхронних: визначивши стан клавіатури (точніше, буфер вводу), вона віддає управління програмі. Стан буфера повертається в прапорець ZF: якщо в буфері є очікування вводу в програму символу, ZF=0; якщо ж буфер пустий, ZF=1. при наявності в буфері коду символу його можна проаналізувати, так як він повертається функцією в регістрі AX (АН=скн-код, AL=код ASCII). Необхідно мати на увазі, що функція 01h копіює 2-байтовий код в регістр AX і не очищує при тому кільцевий буфер. Забрати символ з очисткою буфера можна пізніше функцією 00h.

 




Поделиться с друзьями:


Дата добавления: 2015-08-31; Просмотров: 574; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.