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

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

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

5.12.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 клавиша) клавиатурой.

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

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

Функция похожа на предыдущую, только не ждет нажатия клавиши. Если в буфере нет символов, флаг zf устанавливается в единицу. Внимание, эта функция не очищает буфер при считывании символа (от этого символа).  То есть, если мы этой функцией прочтем символ из буфера,  то в следующий раз мы прочтем оттуда тот же символ, и так до бесконечности. Решить эту проблему можно, например, так:

mov ah, 1

int 16h

jz nott         ; в буфере нет символа, уходим на метку nott

mov al, 0

int 16h        ; читаем символ и очищаем буфер.

А почему нельзя было здесь сразу использовать int 16h  с функцией 0? Дело в том, что если на экране что-то движется вне зависимости от нажатия клавиш (например, летает шарик), то не можем останавливаться и ждать нажатия клавиши (на время ожидания шарик пропадет). В приведенном выше фрагменте проверяем буфер и, если в нем нет символа, то прыгаем на дальнейшее обслуживание экранного движения. И если в буфере гарантированно есть символ, то используем int 16h с функцией 0.

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



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