2.2 служебные функции DOS для работы с клавиатурой.
Кроме перечисленных функций используются некоторые служебные функции DOS для работы с клавиатурой.
Функция DOS 0Bh - Проверить состояние клавиатуры
Ввод: | АН = 0Bh |
Вывод: | AL = 0, если не была нажата клавиша AL = 0FFh, если была нажата клавиша |
Эту функцию удобно использовать перед функциями 01, 07 и 08, чтобы не ждать нажатия клавиши. Кроме того, вызов этой функции позволяет проверить, не считывая символ с клавиатуры, была ли нажата комбинация клавиш Ctrl-Break; если это произошло, выполнится прерывание 23h.
Функция DOS 0Ch - Очистить буфер и считать символ
Ввод: | АН = 0Ch AL = Номер функции DOS (01, 06, 07, 08, 0Ah) |
Вывод: | Зависит от вызванной функции |
Функция 0Ch очищает буфер клавиатуры, так что следующая функция чтения символа будет ждать ввода с клавиатуры, а не использовать нажатый ранее и еще не обработанный символ. Например, именно эта функция используется для считывания ответа на вопрос "Уверен ли пользователь в том, что он хочет отформатировать диск?".
Функции посимвольного ввода без эха можно использовать для интерактивного управления программой.
. model tiny | ; модель памяти, в которой сегменты кода, данных и стека объединены. |
. code | ; сегмент кода, который содержит данные. |
org 100h | ; начало СОМ-файла |
Begin: | ; метка начала кода программы |
call Wait_key | ; вызываем подпрограмму |
cmp al,27 | ; сравниваем значение в al с кодом 27 (ESC) ; если да - то на метку Quit_prog |
je Quit_prog | |
cmp al,0 | ; код клавиши расширенный? (F1-F12 и т.п.) |
je Begin | ; да - повторим запрос... |
call Out_char | ; вызываем процедуру вывода нажатой клавиши на экран |
jmp Begin | ; ждем дальше... |
Quit_prog: | ; метка, на которую придет программа в случае нажатия ESC |
mov al,32 | ; помещаем в AL <пробел> |
call Out_char | ; вызываем процедуру вывода символа в AL |
int 20h | ; выходим... |
Wait_key proc | ; процедура ожидания клавиши от пользователя |
mov ah,10h | ; окончание подпрограммы |
int 16h | ; прерывание DOS |
ret | ; функция DOS "завершить работу процедуры" |
Wait_key endp | ; окончание процедуры Wait_key |
Out_char proc | ; начало процедуры out_char |
push cx | ; сохраним все регистры, которые будут изменены подпрограммой... |
push ax | ;... сделаем это для того, чтобы в последствии не было путаницы |
push es | ; сохраним сегментный регистр |
push ax | ; сохраним AX, т.к в нем код нажатой клавиши... |
mov ax,0B800h | ; установим ES на сегмент видеобуфера |
mov es,ax | |
mov di,0 | ; DI - первый символ первой строки |
mov cx, 2000 | ; выводим 2000 символов (80 символов в строке 25 строк) |
pop ax | ; восстановим код клавиши |
mov ah,31 | ; цвет символа |
Next_sym: | ; метка для цикла |
mov es: [di],ax | ; заносим код клавиши и ее цвет (цвет всегда 31) |
inc di | ; увеличиваем указатель на 2 (первый байт - символ, второй байт - цвет) |
inc di | |
loop Next_sym | ; обработка следующего символа |
pop es | ; восстановим сохраненные регистры и выровним стек |
pop ax | |
pop cx | |
ret | ; вернемся из процедуры |
Out_char endp | ; окончание процедуры Out_char |
end Begin | ; метка окончания кода программы |
Программа делает следующее:
Ждет от пользователя клавиши;
если это расширенный ASCII (F1-F12, стрелки), то игнорирует ее;
если это не расширенный ASCII (A-Z, 0-9 и т.п.) - заполнить экран данным символом;
если нажимаем ESC (27 или 1Bh), то заполнить экран пробелами (mov al,32) и выйти.
Задание для выполнения.
3.1 C помощью редактора эмулятора EMU 8086 напишите программы, исходный текст которых приводится в примерах данной лабораторной работы.
3.2 Создайте исполняемые файлы типа *.com.
3.3 Изучите работу полученных программ.
3.4 Напишите программу для вывода на экран содержимого регистра DS (на основе примера №2.1). Сравните результат работы своей программы и того, что показывает отладчик.
3.5 Опишите работу команд DIV, PUSH, POP, SHL, TEST.
3.6 Установите (найдите адреса и запишите), где находятся числа, помещенные в стек.
3.7 Напишите программу для вывода на экран содержимого регистра СS (на основе примера №3.1).
3.8 Предложите другие способы решения поставленных задач.
5. Контрольные вопросы
Преимущества использования команды SHL вместо TEST (пример №1.1)?
Чем отличаются команды
SHL dx,1
и
SHL dx, cl
Как переслать содержимое X в стек и получить обратно?
Опишите методику вывода значения байта в десятеричной системе счисления?
Опишите методику вывода значения байта в шестнадцатеричной системе счисления?
Опишите методику вывода двоичного кода числа, записанного в регистр X
Стек. Принцип работы. Команды работы со стеком.
Укажите отличия в работе тандема команд.
push DS
pop ES
от
push DS
pop ES
Приложение №1
Основные Скан-Коды клавиш клавиатуры.
Клавиша | Код | Клавиша | Код | Клавиша | Код | Клавиша | Код |
Esc | 01h | Enter | 1Ch | K* | 37h | Ins | 52h |
1! | 02h | Ctrl | 1Dh | Alt | 38h | Del | 53h |
2 @ | 03h | A | 1Eh | SP | 39h | SysRq | 54h |
3 # | 04h | S | 1Fh | Caps | 3Ah | Macro | 56h |
4 $ | 05h | D | 20h | F1 | 3Bh | F11 | 57h |
5% | 06h | F | 21h | F2 | 3Ch | F12 | 58h |
6 ^ | 07h | G | 22h | F3 | 3Dh | PA1 | 5Ah |
7 & | 08h | H | 23h | F4 | 3Eh | F13/LWin | 5Bh |
8 * | 09h | J | 24h | F5 | 3Fh | F14/RWin | 5Ch |
9 ( | 0Ah | K | 25h | F6 | 40h | F15/Menu | 5Dh |
0) | 0Bh | L | 26h | F7 | 41h | F16 | 63h |
- _ | 0Ch | ;: | 27h | F8 | 42h | F17 | 64h |
= + | 0Dh | ' " | 28h | F9 | 43h | F18 | 65h |
BS | 0Eh | ` ~ | 29h | F10 | 44h | F19 | 66h |
Tab | 0Fh | LShift | 2Ah | Num | 45h | F20 | 67h |
Q | 10h | \ | | 2Bh | Scroll | 46h | F21 | 68h |
W | 11h | Z | 2Ch | Home | 47h | F22 | 69h |
E | 12h | X | 2Dh | - | 48h | F23 | 6Ah |
R | 13h | C | 3Eh | PgUp | 49h | F24 | 6Bh |
T | 14h | V | 2Fh | K- | 4Ah | EraseEOF | 6Dh |
Y | 15h | B | 30h | 4Bh | Copy/Play | 6Fh | |
U | 16h | N | 31h | K5 | 4Ch | CrSel | 72h |
I | 17h | M | 32h | ® | 4Dh | Delta | 73h |
O | 18h | , < | 33h | K+ | 4Eh | ExSel | 74h |
P | 19h | . > | 34h | End | 4Fh | Clear | 76h |
[{ | 1Ah | /? | 35h | I | 50h | ||
] } | 1Bh | RShift | 36h | PgDn | 51h |
0 комментариев