Самая популярная архитектура для персональных компьютеров в мире

Работа с клавиатурой в ассемблере

Работать с клавиатурой из ассемблера можно используя один из трех методов: порты, BIOS или DOS. Каждый из этих способов обладает своими преимуществами, ограничения и возможности.

Работа с клавиатурой через порты

Через порты можно работать и в реальном и защищенном режиме работы процессора. Но для полноценной работы с клавиатурой нужно иметь обработчик прерывания клавиатуры (IRQ 1).

Работа с клавиатурой через сервис BIOS (INT 16H)

В BIOS есть стандартный способ взаимодействия с клавиатурой - прерывание 16h. У этой точки входа есть несколько функций:

  • AH = 00h - читать следующий символ из буфера
  • AH = 01h - определить наличие символов в буфере
  • AH = 02h - определить статус клавиш-модификаторов (Shift/Control/Alt)
  • Функция 00 INT 16h

    Для чтения очередного символа, принятого от клавиатуры существует функция 00 прерывания 16h. Для ее вызова нужно поместить номер функции (00) в регистр AH и вызвать прерывание 16h:

    mov ah, 00h
    int 16h
    ; после этого в регистре al окажется ASCII-код символа, а в регистре ah - сканкод.
    	
    Если символа в очереди не оказалось, то функция будет ждать символа. Если в al поместился 0, то в регистр ah помещается расширенный сканкод. Эта функция очень старая. Она делалась еще для первых IBM-PC XT компьютеров, когда на клавиатуре было 84 клавиши. Использовать эту функцию для современных клавиатур не рекомендуется.

    Функция 01 INT 16h

    Функция с номером 1 служит для определения наличия символов в буфере клавиатуры. Если буфер пуст, то флаг ZF устанавливается в 1. Если в буфере есть символ, то в AH и AL содержится информация о нем, как и при вызове функции 00. Важно отметить, что если символ есть и функция возвратила его код в регистре AL, он никуда не денется из буфера. Функцию 01h можно сравнить с прощупыванием буфера клавиатуры. Еще эту операцию называют Peek. Пример вызова:

    mov ah, 01h
    int 16h
    ; ZF = 1 если символа нет
    ; ZF = 0 если символ есть
    ;        AL - ASCII-код
    ;        AH - сканкод
    	

    Функция 02 INT 16h

    Если вызвать функцию 02 прерывания 16h, то в регистре AL будут установлены флаги соответствующие состоянию так называемых shift-клавиш. Пример использования:

    mov ah, 02h
    int 16h
    ; AL = битовое поле
    	
    Описание бит регистра AL после вызова функции 02h:
    БитКлавиша
    0Правый Shift
    1Левый Shift
    2Control
    3Alt
    4ScrollLock
    5NumLock
    6CapsLock
    7Режим Insert

    Работа с клавиатурой через сервис DOS

    DOS предоставляет доступ к клавиатуре посредством программного прерывания 21h. Хотя на самом деле доступ обеспечивается не к клавиатуре, а к стандартному потоку ввода-вывода.

    Copyright (c) 2014, cpubook.ru
    Архитектура x86