Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КНИГА_АСМ ассемблер.doc
Скачиваний:
61
Добавлен:
19.11.2019
Размер:
732.16 Кб
Скачать

Прерывания dos для работы с клавиатурой.

  1. Функция 7 прерывания int 21h

Входные параметры: нет

Ввод символа (его ASCII-кода) из буфера клавиатуры. Если буфер пуст (никакая клавиша не нажата), подпрограмма ждёт нажатия клавиши.

РЕЗУЛЬТАТ: в регистре al возвращается ASCII-код символа. Если нажата функциональная клавиша (например, F2) в al вер­нётся ноль. При этом чтобы прочитать СКЭН - ­код этой клавиши надо повторно вызвать int 21h c функцией 7.

ПРИМЕР 1: Проверить нажата ли клавиша q.

mov ah, 7

int 21h

cmp al, 'q' ; сравнение полученного кода с кодом q

jne m1 ; переход на метку m1 если «не равно»

ПРИМЕР 2: Выйти из программы по нажатию любой клавиши.

mov ah, 7

int 21h ; здесь программа будет «висеть» пока не будет нажата какая-

; либо клавиша mov ah, 4ch ; выход int 21h

  1. Функция 6 прерывания int 21h.

Входные параметры: в dl – 0ffh

Если в буфере есть символ, то его код возвращается в регистре al, а флаг процессора zf устанавливается в 0. Если в буфере нет символа, zf устанавливается в 1, а в al – «мусор». То есть, в отличие от предыдущей функции, здесь не ждут нажатия клавиши (так называемый ввод без ожидания).

ПРИМЕР: Проверка на нажатие ESC (код ESC = 1bh).

mov dl, 0ffh

mov ah, 6

int 21h

jz m1 ; никакая клавиша не нажата (zf=1)

cmp al, 0

je m2 ; нажата функциональная клавиша (в al из int 21h вернулся 0)

cmp al, 1bh

je m3 ; нажата Esc

  1. Функция 0ah прерывания int 21h.

Входные параметры: ds:dx - начальный адрес буфера в оперативной памяти

Ввод строки символов с клавиатуры в созданный заранее буфер. Формат буфера: в нулевом байте программист записывает ожидаемую длину строки, в первом байте подпрограмма вернет фактически набранную длину строки, далее будет записаны ASCII – коды набранных символов.

Вводимая строка набирается на клавиатуре и заканчивается на­жатием клавиши ENTER. В результате в буфер помещается следу­ющая информация:

байт 0 - ожидаемая длина строки;

байт 1 - фактическая длина строки;

байт 2 и далее - строка, заканчивающаяся ASCII-кодом клавиши ENTER (0dh).

ПРИМЕР: собираемся принять строку, состоящую из двадцати символов.

buf db 20, 0, 21 dup (0) ; сколько ожидаем, сколько получим, 20 байт под ; ожидаемый прием, плюс байт под код ENTER

.

.

.

mov ah, 0ah

mov dx, offset buf

int 21h ; здесь висим и ждем ввода информации

Пусть мы ввели 56 и нажали ENTER, тогда будем иметь в буфере (если смотреть в отладчике):

14 02 35 36 0D 00 …. 00

Здесь 14h – это 20 в шестнадцатеричной системе, 02 – число принятых символов, 35h – это ASCII – код цифры 5, 36h – ASCII – код цифры 6.

Прерывания bios для работы с клавиатурой

1. Функция 0 прерывания int 16h Входные параметры: нет

Чтение символа из буфера клавиатуры. Если клавиша символьная, в al возвращается её ASCII-код, а в ah - её СКЭН - код. Если клавиша функциональная, в al возвращается 0, а в ah -её СКЭН - код. Если в буфере нет символа, подпрог­рамма ждет нажатия клавиши.

ПРИМЕР: Проверка на нажатие клавиши «стрелкa – вверх». Это функциональная клавиша и её СКЭН - код = 48h.

mov ah, 0

int 16h

cmp al, 0

jne m1 ; нажата символьная клавиша

cmp ah, 48h

je m2 ; нажата «стрелка – вверх»

Примечание: прерывание int 16h имеет аналогичную функцию 10h, предназначенную для работы с расширенной (101 клавиша) клавиатурой.