Изменение прерывания в 16-битном реальном режиме

StackOverflow https://stackoverflow.com/questions/1615538

Вопрос

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

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

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

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

Спасибо!

Это было полезно?

Решение

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

http://en.wikipedia.org/wiki/Interrupt_descriptor_table есть более подробная информация.

Другие советы

Если ваша программа работает под 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top