03 декабря 2009
Определение нажатия комбинации клавиш средствами BIOS на ассемблере
- написал: marselester
- 269
- 10
По учебе понадобилось написать программу на ассемблере, которая должна
распознать нажатие «горячей» комбинации клавиш LeftCtrl+RightShift+F3
и реагировать на него звуковым сигналом. Информации/примеров по этой теме маловато,
по этому решил опубликовать свою программку.
Для чтения символа используется функция 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
распознать нажатие «горячей» комбинации клавиш 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
- vsevolodp
- 03 декабря 2009, 17:00
- 0
Забыл указать под какой ОС это будет работать.
PS Какую же херню заставляют делать
PS Какую же херню заставляют делать
- marselester
- 03 декабря 2009, 17:06
- 0
Используются прерывания BIOS и DOS. Будет работать под Win* (пробовал под xp, vista).
Предмет требует программинга на ассемблере.
Предмет требует программинга на ассемблере.
- marselester
- 20 ноября 2010, 22:51
- 0
- insomnium
- 21 ноября 2010, 04:13
- 0
спасибо огромное!
ЗЫ. я не дружу с ассемблером просто. в качестве курсача задали похожую прогу написать, только распознавать другие клавиши. екзешник собрал, но видимо из-за коэффициента кривизны рук он тупо вылетает с ошибкой. вот и думал, в чем косяк. значит все таки в руках…
ЗЫ. я не дружу с ассемблером просто. в качестве курсача задали похожую прогу написать, только распознавать другие клавиши. екзешник собрал, но видимо из-за коэффициента кривизны рук он тупо вылетает с ошибкой. вот и думал, в чем косяк. значит все таки в руках…
- laser
- 28 декабря 2010, 11:18
- -1
спасибо огромное!
laser engraver
laser engraving machine
laser cutter
laser cutting machine
vinyl cutter
cutting plotter
cnc router
laser cutter
laser engraver
laser engraving machine
laser cutting machine
desktop laser engraver
mini laser engraver
vinyl cutter
plotter
cutting plotter
woodworking cnc router mini cnc router
stone cnc router
granite cnc router
woodworking cnc router cnc router
laser tube
laser engraving
laser cutter
desktop laser engraver
vinyl cutter
laser cutting
laser engraving machine
laser cutting machine
cutting plotter
laser cutter
laser engraver
cutting plotters
vinyl cutters
cutting plotter
vinyl cutter
laser engraver
laser cutting machine
cnc router
stone cnc router
granite cnc router
woodworking cnc router
laser engraver
laser engraving machine
laser cutter
laser cutting machine
vinyl cutter
cutting plotter
cnc router
laser cutter
laser engraver
laser engraving machine
laser cutting machine
desktop laser engraver
mini laser engraver
vinyl cutter
plotter
cutting plotter
woodworking cnc router mini cnc router
stone cnc router
granite cnc router
woodworking cnc router cnc router
laser tube
laser engraving
laser cutter
desktop laser engraver
vinyl cutter
laser cutting
laser engraving machine
laser cutting machine
cutting plotter
laser cutter
laser engraver
cutting plotters
vinyl cutters
cutting plotter
vinyl cutter
laser engraver
laser cutting machine
cnc router
stone cnc router
granite cnc router
woodworking cnc router
- Slicer
- 08 апреля 2011, 01:27
- 0
Кстати, из источников, которые можно всегда иметь «под рукой», на будущее могу предложить старенький TechHelp (не знаю точно, где сейчас искать, но вон люди как-то находят — www.rsdn.ru/forum/asm/1945814.flat.aspx)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
Комментарии:10