Изменить прерывание в 16-битном реальном режиме - PullRequest
3 голосов
/ 23 октября 2009

Я пытаюсь изменить свою таблицу прерываний, чтобы перехватить прерывание клавиатуры. Моя конечная цель - написать мою новую подпрограмму прерывания, скопировать себя в оперативную память и сделать так, чтобы таблица прерываний реального режима указывала на меня.

Я нашел случайный пример кода в сети, но в нем отсутствуют объяснения того, как получить адрес исходного прерывания. У них просто есть переменные на своем месте, и как поместить себя в память.

Итак, мой вопрос: как мне определить или распечатать на экране таблицу прерываний реального режима?

И / ИЛИ если у кого-нибудь есть хорошие примеры кода, позволяющие отключить определенные клавиши или подать звуковой сигнал по определенным клавишам, я был бы очень признателен.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 23 октября 2009

В 16-битном реальном режиме таблица прерываний начинается с адреса 0 с 256 4-байтовыми записями. Каждый из 256 векторов прерываний получает 4-байтовый адрес (сегмент + смещение) в этой таблице.

http://en.wikipedia.org/wiki/Interrupt_descriptor_table имеет больше деталей.

2 голосов
/ 26 октября 2009

Если ваша программа работает под DOS, вы можете (и, вероятно, должны) использовать API, предоставляемый DOS:

  MOV  AH,35H    ; function 35H is Get Vector
  MOV  Al,9      ; slot in IDT for keyboard interrupt
  INT  21H       ; call DOS, contents of old vector in ES:BX (save them somewhere)
   .
   .
  MOV  AH,25H    ; function 25H is Set Vector
  MOV  AL,9
  PUSH CS        ; the new vector is passed in DS:DX, so copy CS to DS
  POP  DS        :  (assuming your new handler is in the same seg as other code)
  MOV  DX,NewHandler
  INT 21H
...