Лекции по Вычислительным машинам, системам и сетям   

5. Программирование на языке Ассемблер

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

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

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

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

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

Пример. Проверить, нажата ли клавиша q.

mov ah, 7

int 21h

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

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

Пример. Выйти из программы по нажатию любой клавиши.

mov ah, 7

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

;будет нажата какая-либо клавиша

mov ah, 4ch    ; выход int 21h

5.11.2. Функция 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

5.11.3. Функция 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.



*****
© Банк лекций Siblec.ru
Формальные, технические, естественные, общественные, гуманитарные, и другие науки.