Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

замена прерывания клавиатуры

31K
15 июня 2008 года
annufriy
18 / / 15.06.2008
господа эксперты, нужна помощь:
нужно написать программу, которая "повесит" комп до нажатия клавиши ESC, заменив обработчик прерывания клавиатуры. При нажатии ESC старый обработчик возвращается на место, программа завершается.
все, что мне удалось наколупать:

Код:
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 нажать первой, то работает, как надо, а если перед ним нажать еще что-нибудь, то всё: нужно DOS перезапускать.

Помогите, плз.
274
15 июня 2008 года
Lone Wolf
1.3K / / 26.11.2006
1. Добавь перед iret
 
Код:
mov     al,20h

        out     20h,al

2. желательно сохранить, при входе в обработчик и потом востановаить перед выходом все используемые регистры.
Если не поможет будем искать дальше
31K
16 июня 2008 года
annufriy
18 / / 15.06.2008
спасибо, чувак, все работает :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог