Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - Обработка нажатия клавиши 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


   Вперёд
   Содержание