Читайте также:
|
|
Теоретичні відомості
DOS надає ряд сервісних функцій, що забезпечують роботу з клавіатурою. Серед них можна виділити групу функцій, що забезпечують посимвольне введення з клавіатури, тобто одноразовий виклик функції дозволяє ввести один символ:
У АН | Опис | Вхід | Вихід |
h | Введення символу з БТОІК з очікуванням, з луною, що фільтрує | АЬ = код символу | |
h | Введення символу з БТПта без очікування, без луня, що не фільтрує | D | І? = 0, якщо символ готовий; АЬ - код символу |
h | Введення символу з БТОШ з очікуванням, без луни, що не фільтрує | АЬ = код символу | |
h | Введення символу з ЗТВІК з очікуванням, без луни, що фільтрує | АЬ = кед символу |
Незалежно від роботи поточної програми інформація, що вводиться з клавіатури, потрапляє в буфер клавіатури — область розміром 16 слів в оперативній пам'яті. Якщо працююча програма не обробляє інформацію, що поступає, буфер заповнюється у міру введення, і після 15-ти натиснень на клавіші подальше введення блокується. Завдяки такому буферированию користувач може вводити дані ще до того, як їх запитала програма.
Функції 1, 6, 7, 8 забезпечують введення одного символу з пристрою стандартного введення STDLN. Як STDIN зазвичай виступає клавіатура (також може бути файл, пристрої, підключені до комунікаційних портів). У разі введення з клавіатури функція прочитує один елемент з буфера клавіатури, тобто відомості про одне натиснення користувачем клавіші. Відповідна інформація поміщається в регістр AL.
Клавіші стандартної клавіатури (а також їх певні комбінації) можна умовно розділити на дві групи: атфавітно-цифрові і такі, що управляють. До алфавітпо-цифрових відносяться клавіші (а також їх комбінації з клавішею Shift), яким зіставлені символи з певними ASCII- кодами. За допомогою таких клавіш користувач може вводити текстову інформацію. До клавіш, що управляють, і комбінацій відносяться функціональні клавіші (Fl - F12), управління курсором (Insert, Home, PageUp і ін.), їх комбінації з Alt, Ctrl і Shift, а також комбінації будь- яких клавіш з Alt. З їх допомогою користувач має можливість
віддавати клавіатурні команди. Клавішам, що управляють, і комбінаціям зіставлені розширені коди.
Сенс значення в регістрі AL, повертаного будь-якою функцією посимвольного введення, залежить від того, які саме клавіші натискав користувач при введенні, а також коли саме була викликана функція:
16. якщо користувач натиснув одну з алфавітно-цифрових клавіш або комбінацій, в AL повертається ASCII-код відповідного символу;
17. якщо користувач натиснув одну з клавіш, що управляють, або комбінацій, в AL повертається 0 (ознака введення команди з певним розширеним кодом);
18. якщо функція була викликана безпосередньо після попереднього випадку, в AL повертається розширений код.
Опишемо тепер відмінності між перерахованими функціями:
Очікування. Функції 1, 7 і 8 чекають введення символу: функція, отримавши управління, перевіряє буфер клавіатури, і якщо там немає символу, чекає, поки він там не з'явиться. Функція 6 працює без очікування: якщо в буфері немає символу, вона відразу повертає управління в програму, що викликала, встановивши заздалегідь прапор нуля ZF; якщо ж символ в буфері виявлений, функція скидає ZF і поміщає в AL код символу, як і інші функції.
Луна. При введенні з клавіатури за допомогою функції 1 відбувається відображення на екрані символу з кодом, рівним значенню вихідного регістра AL (луна на екран), інші функції луни на екран не дають.
Фільтрація. У таблиці описів також вказано, чи здійснює функція фільтрацію введення. У разі фільтрації функція реагує на натиснення комбінацій Ctrl-Break і CTRL-C, що управляють, здійснюючи аварійне завершення програми.
Аналіз введеної інформації як правило здійснюється шляхом порівняння коди введеного символу в AL з яким-небудь зумовленим значенням і перехід на відповідну ділянку програми командою умовного переходу.
Якщо потрібно ввести рядок символів, необхідно організувати цикл, що містить команди запиту символу і, можливо, його перевірки, обробки, виходу по натисненню певної клавіші і т. п. Можна також скористатися спеціальною функцією введення рядка OAh int 21h (див. слід, роботу) або функцією файлового введення, указуючи як дескриптор файлу 0 (стандартний пристрій введення).
У наступній таблиці приведені значення розширених код деяких клавіш і комбінаці
Клав і | Код | Клав | Кол | Клаві | Код | Клавіша | Код | Клав | Код | ||||
ша | (hex) | іша | (hex) | ша | (hex) | (hex) | іша | (hex) | |||||
F1 | 3Bh | ALT- 3 | 30h | ALT-О | 18h | Alt-1 | 78h | left | 4Bh | ||||
F2 | 3Ch | ALT- C | 2 Eh | I ALT-P | 19h | Alt-2 | 79h | righ t | 4Dh | ||||
F3 | F | 3Dh | ALT- D | 2 Oh | ALT-Q A | lOh | Alt-3 Ait | 7 Ah | up | 48h | |||
F | Eh | LT-E | 2h | LT-R A | 3h | -4 Alt | 3h | own | Or. | ||||
F | Fh | LT-F | lh | LT-S A | fh | -5 Alt | Ch | ome | 7 л | ||||
F | Oh | LT-G | 2h | LT-T A | 4h | -6 Alt | Dh | nd | Fh | ||||
F | lh | LT-H | 3h | LT-U A | 6h | -7 Alt | Sh | gUp | 9h | ||||
2h | LT-I | 7h | LT-V | Fh | -8 | Fh | g Dr. | lh | |||||
F | A | Alt | |||||||||||
3h | LT-J | 4h | LT-W | lh | -9 | Ch | gDn | lh | |||||
F | 4h | LT-K | 5h | A LT-X | Dh | Alt | 2h | hift -F10 | Dh | ||||
F | 5h | LT-L | 6h | A ; LT-Y | 5h | Alt | 3h | trl- F10 | 7 h | ||||
F | 6h | LT-M | 2h | A LT-2 | Ch | Ins | 2h | lt- F10 | lh | ||||
LT-A | A | Eh | LT-N | lh | A lt-0 | lh | Del | 3h | 5 | I |
Клавіші, що управляють, з розширеними кодами найчастіше використовують для управління програмою, що виконується, а звичайні алфавітно-цифрові — для введення текстової інформації у вигляді послідовності ASCII-кодов. Своєрідним виключенням є чотири клавіші, що управляють, яким призначені не розширені, а звичайні ASCII-кодьг:
Backspace- 8h Tab - 9h Enter - ODh = 13 Esc - lBh = 27
Нижче приведений приклад, що запрошує введення в клавіатури одного символу. Якщо цей символ - цифра (N = 0...9), на екран видається повідомлення 'Натиснута цифра N', після чого здійснюється вихід з програми, інакше здійснюється повторний запит символу. При
натисненні П виводиться довідкове повідомлення 'Натискайте цифри'. Опис сегментів, команди ініціалізації ОБ і виходу з програми опущені скорочено.
; Дані
mes db
num db
ASCII-кода helpmes db; Код
again: mov
клавіатури символу з луною int 21h cmp al, 0
клавіша?
je function
cmp al, 4' діапазону - нижня межа jb less
cmp al, '9' ja greater
mov [num], al
повідомлення
mov ah, 9 повідомлення на екран
lea dx, mes повідомлення - в DX)
int 21h jmp exit
19. на вихід
function: mov ah, 8
20. отримання розширеної коди
int 21h засмічувати екран)
cmp al, 3Bh je help
greater:
less: jmp again
межі діапазону - повторити
help:
ah, 9
dx, helpmes
21h"
again
для
введення 3
розширена
перевірка
верхня межа заносимо код в і виводимо (відносна адреса
справа зроблена повторний виклик (8 - щоб не ЕІ?
якщо вишли за виводимо довідку
повторити введення exit:
Для простоти вихід за верхню і нижню межі діапазону обробляються однаково — повторно запрошується введення, тому влучні greater і less указують на одну і ту ж команду (jmp again).
Завдання
Організувати посимвольне введення без луни в циклі і аналіз певної групи символів. При натисненні клавіші F1 вивести на екран довідкове повідомлення вигляду "Реагування на клавіші... Вихід -...). Забезпечити вихід з програми при натисненні заданої клавіші. У протокол лабораторної роботи включити блок-схему програми.
Варіанти:
20. При введенні цифр видавати з нового рядка на екран повідомлення "Натиснута цифра <N>", а при введенні символів — повідомлення "Натиснутий символ <S>" (<N> і <S> — відповідні ASCII-символьі). Вихід — по F10.
20.При введенні цифр видавати на екран знак 'Ц\ а при введенні символів — знак 'С'. Забезпечити вихід з програми при натисненні послідовно клавіш F9 і F10.
20. При введенні латинських символів у верхньому регістрі видавати на екран знак (код 219), в нижньому регістрі — знак (код 220). Вихід — Shift-F10.
20. При натисненні функціональних клавіш F1...F10 видавати на екран повідомлення "Натиснута F<n>" (<п> — номер функціональної клавіші). Вихід — по ALT-X.
20.При натисненні алфавітно-цифрових клавіш (з Shift і без) видавати з нового рядка на екран повідомлення "Введений символ У" (х — відповідний ASCII-символ). Вихід — по ALT-Q.
20.При введенні цифр видавати з нового рядка на екран повідомлення "Натиснута цифра <N>" (<N> —• відповідний ASCII- символ). Вихід — по F10. При натисненні користувачем функціональної клавіші F2...F9, видати повідомлення "Вихід •— F10".
20.При введенні символів з кодами 33...43 ('!'...'+') видавати з нового рядка на екран повідомлення "Введений символ <х>" (<х> — відповідний ASCII-символ). Вихід — по F10. При натисненні клавіші виходу видати повідомлення "Ви упевнені? Повторне натиснення — вихід". При натисненні після цього клавіші, відмінної від F10, стерти повідомлення з екрану.
20.При введенні прописних латинських букв (у верхньому регістрі) видавати з нового рядка на екран повідомлення "Введений символ <Х>", а при натисненні цих клавіш в комбінації з Alt —
овідомлення "Натиснута комбінація Alt-<X>" (<Х> — відповідний ASCII-символ). Вихід — Esc.
9. Забезпечити вихід з програми при натисненні F10, а при натисненні F9 вивести на екран послідовність введених раніше символів (не розширених). Якщо за виведенням цієї послідовності не послідувала клавіша виходу, відновити буфер символів, що вводяться, в пам'яті,
20. При введенні цифр видавати з нового рядка на екран повідомлення "Натиснута цифра <N>" (<N> — відповідний ASCII- символ). Після введення 5 клавіш, що немає цифровими, видати на екран довідкове повідомлення. Вихід — по Ctrl-Fl0.
20. При введенні з клавіатури шістнадцятиричних цифр (0...9, A...f) видавати з нового рядка на екран повідомлення "Введена 16- ричная цифра <h>" (<h> — відповідний ASCII-код). Після натиснення Alt-FlO видати попереджувальне повідомлення "Ви упевнені?". Якщо потім введене 'у1 або Т', завершити програму. Інакше повторити запит.
20. При введенні цифр видавати з нового рядка на екран повідомлення "Натиснута цифра <N>" (<N> — відповідний ASCII- символ). Забезпечити вихід з програми при натисненні двох клавіш — F9 і F10 — в будь-якій послідовності (наприклад, F9 і F10, або FI0 і F9, але не F10, F8, F9).
20. При введенні цифр видавати з нового рядка на екран повідомлення "Натиснута цифра <N>" (<N> — відповідний ASCII- символ). Якщо у міру введення була введена певна комбінація цифр (наприклад, 194536), вивести з нового рядка повідомлення 'Доступ дозволений!'.
Дата добавления: 2014-12-19; просмотров: 99 | Поможем написать вашу работу | Нарушение авторских прав |