03 декабря 2009

Определение нажатия комбинации клавиш средствами BIOS на ассемблере

По учебе понадобилось написать программу на ассемблере, которая должна
распознать нажатие «горячей» комбинации клавиш 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
+2

Комментарии:10

avatar
Забыл указать под какой ОС это будет работать.

PS Какую же херню заставляют делать
avatar
Используются прерывания BIOS и DOS. Будет работать под Win* (пробовал под xp, vista).
Предмет требует программинга на ассемблере.
avatar
  • Slicer
  • 08 апреля 2011, 01:20
  • 0
Не будет работать под x64 ;) ибо вырезали 16-битовую подсистему. Rest in peace…
avatar
  • Slicer
  • 08 апреля 2011, 01:22
  • 0
Так что имеет смысл сюда же в студию пример для Win32 или линуха, если кто захочет развить тему =)
avatar
а можешь поделиться откомпиленной прогой?
avatar
Мог бы и сам собрать:
tasm.exe key.asm
tlink.exe key.obj

бинарник
avatar
спасибо огромное!
ЗЫ. я не дружу с ассемблером просто. в качестве курсача задали похожую прогу написать, только распознавать другие клавиши. екзешник собрал, но видимо из-за коэффициента кривизны рук он тупо вылетает с ошибкой. вот и думал, в чем косяк. значит все таки в руках…
avatar
  • Krizzly
  • 15 декабря 2010, 17:14
  • 0
а есть программа, которая озвучивала бы нажатие любой клавиши?
avatar
  • Slicer
  • 08 апреля 2011, 01:27
  • 0
Кстати, из источников, которые можно всегда иметь «под рукой», на будущее могу предложить старенький TechHelp (не знаю точно, где сейчас искать, но вон люди как-то находят — www.rsdn.ru/forum/asm/1945814.flat.aspx)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.