Изменение прерывания в 16-битном реальном режиме
Вопрос
Я пытаюсь изменить таблицу прерываний, чтобы взять на себя прерывание клавиатуры.Моя конечная цель — написать новую процедуру обработки прерываний, скопировать себя в ОЗУ и сделать так, чтобы таблица прерываний реального режима указывала на меня.
Я нашел случайное образец кода 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