Определение нажатия комбинации клавиш средствами BIOS на ассемблере
Thu 03 December 2009
По учебе понадобилось написать программу на ассемблере, которая должна распознать нажатие «горячей» комбинации клавиш LeftCtrl+RightShift+F3 и реагировать на него звуковым сигналом. Информации/примеров по этой теме маловато, по этому решил опубликовать свою программку.
masm
.model small
.stack 256
.data
Msg_about db 'Распознать нажатие «горячей» комбинации клавиш', 0Ah, 0Dh
db 'LeftCtrl+RightShift+F3', 0Ah, 0Dh
db 'и реагировать на него звуковым сигналом', 0Ah, 0Dh, '$'
.code
start:
; Инициализация сегментного регистра ds
mov ax, @data
mov ds, ax
; Видеорежим 3 (очистка экрана и установка курсора в 0, 0)
mov ax, 0003h
int 10h
; Вывод сообщения на экран
mov ah, 9
mov dx, offset Msg_about
int 21h
; Чтение символа с ожиданием
mov ah, 0
int 16h
; Проверка нажатия Ctrl+F3
cmp ah, 60h
jne exit
; Получение состояния клавиатуры
mov ah, 12h
int 16h
; Проверка нажатия LeftCtrl
test ah, 1b
jz exit
; Проверка нажатия RightShift
test al, 1b
jz exit
mov ah, 2 ; Вывод символа
mov dl, 7 ; Сигнал
int 21h
; Завершение программы, возврат управления ОС
exit:
mov ax, 4c00h
int 21h
end start
Для чтения символа используется функция 16h BIOS.
AH = 0
На выходе в AL = ASCII-код символа, 0 или префикс скан-кода, АН = скан-код нажатой клавиши или расширенный ASCII-код.
Далее производится сравнение регистра AH со скан-кодом 60h (нажатие Ctrl+F3).
Потом получаем состояния клавиатуры. Используется функция 16h BIOS.
AH = 12h
На выходе в AX заносится состояние клавиатуры. Нас интересует только первый бит AH (LeftCtrl) и первый бит AL (RightShift).
Состояние клавиатуры
AL
- Бит 7: Ins
- Бит 6: CapsLock
- Бит 5: NumLock
- Бит 4: ScrollLock
- Бит 3: Alt (любой Alt для функции 02h, часто только левый Alt для 12h/22h)
- Бит 2: Ctrl (любой)
- Бит 1: LeftShift
- Бит 0: RightShift
AH
- Бит 7: SysRq
- Бит 6: CapsLock
- Бит 5: NumLock
- Бит 4: ScrollLock
- Бит 3: RightAlt
- Бит 2: RightCtrl
- Бит 1: LeftAlt
- Бит 0: LeftCtrl