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    

Информация о работе «Разработка виртуальных лабораторных работ средствами эмулятора Emu8086»
Раздел: Информатика, программирование
Количество знаков с пробелами: 193894
Количество таблиц: 73
Количество изображений: 12

0 комментариев


Наверх