Перехват прерываний Int 09h - PullRequest
3 голосов
/ 05 марта 2012

У меня проблема с перехватом int 09h. Я изменил указатель на мой новый Isr, если я отлаживаю в Windows, прерывание срабатывает каждый раз, когда я нажимаю клавишу. Но в VMWare кажется, что срабатывает только один раз и не более. Я тестировал в DOS 6.22 и происходит точно так же.

Мой код выглядит так:

MyIsr:
    pusha
    pushf
    ;tell PIC that interrupt has finished
    mov al,0x20
    out 0x20,al
    popf
    popa
    iret

Если я использую клавиатуру USB, могу ли я отправлять те же команды, что и Ps / 2?

1 Ответ

1 голос
/ 20 марта 2012

Здесь может быть несколько проблем, так как вы еще не опубликовали полный код написанного вами кода. Не могли бы вы объяснить, чего именно вы пытаетесь достичь?

Если ISR вызывается и не обрабатывается, вы ничего не сможете сделать, так что имейте это в виду. Ваша проблема может быть связана с тем, как вы устанавливаете ISR в таблицу векторов прерываний.

  • В реальном режиме вы делаете это с INT 21h, AH = 25h
  • В защищенном режиме в DJGPP вам необходимо использовать функцию DPMI (либо с использованием функций INT 21H, либо с использованием функций C. См. Документация DPMI
  • Блокировка памяти для ISR также необходима при работе в PM, поскольку память может быть «выгружена» (это необходимо для ISR, потому что мы действительно не «знаем», когда она будет работать).

В любом случае, ваш ISR должен выглядеть примерно так:

newInt9:

enter 0,0
push eax

in al, 60h
mov [raw_key], al

mov al, 20h
out 20h, al

pop eax
leave
iret     

; ENDPROC

...