 |
Ассемблер в примерах - Обработка нажатия клавиши F1
- Вопрос:
- Нужно написать резидентный модуль на асме, который по нажатию клавиши F1 записывал бы слово OPEN в буфер клавиатуры.
- Ответ:
-
По большому счету, после отработки кнопки, ее код надо убирать
из клавиатуры, чтобы не допустить лишнюю отработку.
Но, исходя из того, что нажатие на кнопку F1
в командном интерпретаторе ни к чему не приводит, то можно
сделать, как в программе - завершение вектора для всех кодов
поручено старому вектору.
;prog.asm
;делаем COM-файл
;tasm prog.asm
;tlink prog /t
;запускаем в командном интерпретаторе cmd.exe
.model tiny ;модель для COM-программы (все в одном сегменте)
.code ;сегмент кода
.startup ;макро для настройки старта программы
jmp init ;на инициализацию резидента
old_09 dw 0, 0 ;здесь будет старый клавиатурный вектор 9
new_09: ;новая отработка вектора 9
push ax ;надо сохранять все используемые регистры (для начала только ax)
in al, 60h ;прочитаем код из клавиатуры
cmp al, 3bh ;F1 ?
jne to_old_09 ;если не F1, то на старый вектор
push cx ;сохраним еще cx
mov ah, 5 ;функция записи в буфер клавиатуры
mov cx, 'O' ;ch=0 - скан-код нам не нужен, cl=ASCII-код
int 16h
cmp al, 0 ;проверим на ошибку
jne to_iret ;если ошибка, то больше в буфер не писать
mov ah, 5
mov cx, 'P'
int 16h
cmp al, 0
jne to_iret
mov ah, 5
mov cx, 'E'
int 16h
cmp al, 0
jne to_iret
mov ah, 5
mov cx, 'N'
int 16h
to_iret:
pop cx ;восстановим cx
to_old_09:
pop ax ;восстановим ax
jmp dword ptr cs:old_09 ;на старый вектор
init: ;инициализация программы
mov ax, 3509h ;прочитаем старый вектор
int 21h
mov old_09, bx ;сохраним в переменной смещение
mov old_09+2, es ; и сегмент
mov ax, 2509h ;установим новый вектор отработки прерывания 9
lea dx, new_09 ; адрес нового обработчика
int 21h
lea dx, init ;последний адрес программы, который оставляем в памяти
int 27h ;оставляем резидент в памяти и завершаемся
end
|  |