cseg segment
assume cs:cseg,ds:cseg,es:cseg,ss:cseg
org 100h
start: jmp begin
old_int09h dw '??'
begin:
;сохраняем адрес старого обработчика
push 0
pop es
mov ax,es:[09h*4]
mov word ptr old_int09h,ax
mov ax,es:[09h*4+2]
mov word ptr old_int09h+2,ax
;меняем обработчик
pushf
cli
mov es:[09h*4],offset hand_int09h
mov es:[09h*4+2],cs
popf
xor ax,ax
;зацикливаемся
c1: jmp c1
hand_int09h proc far
;считываем скан-код из клавиатуры и сообщаем ей об этом
in al,60h
push ax
in al,61h
or al,80h
out 61h,al
pop ax
;если нажата не ESC, возвращаем управление программе
cmp al,01h
jne ccc
;если нажата ESC, возвращаем старый обработчик
pushf
cli
mov ax,word ptr [old_int09h]
mov es:[09h*4],ax
mov ax,word ptr [old_int09h+2]
mov es:[09h*4+2],ax
popf
;возвращаем управление операционной системе
mov ah,4ch
int 21h
ccc: iret
hand_int09h endp
cseg ends
end start
замена прерывания клавиатуры
нужно написать программу, которая "повесит" комп до нажатия клавиши ESC, заменив обработчик прерывания клавиатуры. При нажатии ESC старый обработчик возвращается на место, программа завершается.
все, что мне удалось наколупать:
Код:
она себя как-то странно ведет: если ESC нажать первой, то работает, как надо, а если перед ним нажать еще что-нибудь, то всё: нужно DOS перезапускать.
Помогите, плз.
Код:
mov al,20h
out 20h,al
out 20h,al
2. желательно сохранить, при входе в обработчик и потом востановаить перед выходом все используемые регистры.
Если не поможет будем искать дальше
спасибо, чувак, все работает :)