Переопределение таблицы векторов прерываний
Модератор: Andy
Если кто знает-подскажите пожалуста....
Я пишу резидентную прогу.
Мне надо переопределить аппаратное прерывание int 09h. В общем я создаю собственный обработчик этого прерывания. Но у меня отключается клавиатура. Может это связано с тем, что в обработчике 9 прерывания нельзя использовать 16 или 21-я не знаю...
Я пишу резидентную прогу.
Мне надо переопределить аппаратное прерывание int 09h. В общем я создаю собственный обработчик этого прерывания. Но у меня отключается клавиатура. Может это связано с тем, что в обработчике 9 прерывания нельзя использовать 16 или 21-я не знаю...
Ну кой-что использовать можно если осторожно... Хотя вот int 16h в обработчике int 9h пахнет глюками.в обработчике 9 прерывания нельзя использовать 16 или 21-я не знаю...
На всякий случай напомню:
1) Вызывается ли оригинальный обработчик?
2) Сохраняются ли в обработчике все регистры и флаги (9h - аппаратное прерывание)
*provided AS IS
Привет, Andy! Спасибо, что помог в предыдущей задаче.Мне всё стало ясно.
Послушай, а что, в обработчике аппаратн. прерывания я должен сохранять все регистры и регистр флагов.?

Да. Обработчик аппаратного прерывания к которому также относится int 9h (IRQ1) обязан сохранять все регистры, в т.ч. сегментные ds,es. Флаги тоже лучше не портить.а что, в обработчике аппаратн. прерывания я должен сохранять все регистры и регистр флагов.?
Регистры лучше сразу сохранить ври входе в обработчик и восстановить пере вызовом оригинального (если он вызывается в конце, а не сразу):
Код: Выделить всё
new_handler proc far
pusha
push es
push ds
; ... do something ...
pop ds
pop es
popa
jmp cs:old_int_handler
old_int_handler dd ?
new_handler endp
*provided AS IS
Andy, привет. Послушай, в чём тогда смысл, резидентная это программа или нет, если мы всё равно восстанавливаем старый обработчик. У нас что, в ОП все равно остаётся наш обработчик? Если да, то все ясно, если нет-то зачем тогда int 27h, если мы и так можем написать нов. обработчик, а затем заменить его на старый? Если я задал глупый вопрос, то не отвечай пожалуста...
Игрек, честно скажу, напрягался-напрягался но смысл вопроса не понял


На то он и форум чтоб вопросы задаватьЕсли я задал глупый вопрос

*provided AS IS
Извини. Смысл в том, что я не понимаю смысла резидентной программы. Я знаю, что она остаётся в ОП. Но как это проявляется конкретно в моей программе?
Смысл простой. ДОС - система однозадачная. К примеру программа должна постоянно предоставлять какой-нибудь сервис, скажем управлять отображением символов на экране (как keyrus.com). Тогда эта программа должна резидентно висеть в памяти, иначе она будет предоставлять сервис только сама себе.Смысл в том, что я не понимаю смысла резидентной программы

*provided AS IS
То есть, когда я запущу свою прогу, я могу любое количество раз нажимать на клаву(прерывание int 9h)- и будет всегда это прерывание обрабатываться моим обработчиком?
Если обработчик перехвачен тобой, то да. Разумеется. На то это и перехват прерывания.я могу любое количество раз нажимать на клаву(прерывание int 9h)- и будет всегда это прерывание обрабатываться моим обработчиком
*provided AS IS