Страница 1 из 2

Переопределение таблицы векторов прерываний

Добавлено: 29 май 2004, 10:28
Игрек
Если кто знает-подскажите пожалуста....
Я пишу резидентную прогу.
Мне надо переопределить аппаратное прерывание int 09h. В общем я создаю собственный обработчик этого прерывания. Но у меня отключается клавиатура. Может это связано с тем, что в обработчике 9 прерывания нельзя использовать 16 или 21-я не знаю...

Добавлено: 29 май 2004, 15:00
Andy
в обработчике 9 прерывания нельзя использовать 16 или 21-я не знаю...
Ну кой-что использовать можно если осторожно... Хотя вот int 16h в обработчике int 9h пахнет глюками.
На всякий случай напомню:

1) Вызывается ли оригинальный обработчик?
2) Сохраняются ли в обработчике все регистры и флаги (9h - аппаратное прерывание)

Переопределение таблицы векторов прерываний

Добавлено: 29 май 2004, 17:17
Игрек
Привет, Andy! Спасибо, что помог в предыдущей задаче.Мне всё стало ясно. :D Послушай, а что, в обработчике аппаратн. прерывания я должен сохранять все регистры и регистр флагов.?

Добавлено: 29 май 2004, 19:18
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

Добавлено: 31 май 2004, 12:00
Игрек
Andy, привет. Послушай, в чём тогда смысл, резидентная это программа или нет, если мы всё равно восстанавливаем старый обработчик. У нас что, в ОП все равно остаётся наш обработчик? Если да, то все ясно, если нет-то зачем тогда int 27h, если мы и так можем написать нов. обработчик, а затем заменить его на старый? Если я задал глупый вопрос, то не отвечай пожалуста...

Добавлено: 31 май 2004, 18:50
Andy
Игрек, честно скажу, напрягался-напрягался но смысл вопроса не понял :)
Если я задал глупый вопрос
На то он и форум чтоб вопросы задавать :)

Добавлено: 31 май 2004, 21:34
Игрек
Извини. Смысл в том, что я не понимаю смысла резидентной программы. Я знаю, что она остаётся в ОП. Но как это проявляется конкретно в моей программе?

Добавлено: 01 июн 2004, 09:23
Andy
Смысл в том, что я не понимаю смысла резидентной программы
Смысл простой. ДОС - система однозадачная. К примеру программа должна постоянно предоставлять какой-нибудь сервис, скажем управлять отображением символов на экране (как keyrus.com). Тогда эта программа должна резидентно висеть в памяти, иначе она будет предоставлять сервис только сама себе. :)

Добавлено: 01 июн 2004, 23:08
Игрек
То есть, когда я запущу свою прогу, я могу любое количество раз нажимать на клаву(прерывание int 9h)- и будет всегда это прерывание обрабатываться моим обработчиком?

Добавлено: 02 июн 2004, 00:40
Andy
я могу любое количество раз нажимать на клаву(прерывание int 9h)- и будет всегда это прерывание обрабатываться моим обработчиком
Если обработчик перехвачен тобой, то да. Разумеется. На то это и перехват прерывания.