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

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Игрек
Сообщения: 12
Зарегистрирован: 28 май 2004, 20:35

Если кто знает-подскажите пожалуста....
Я пишу резидентную прогу.
Мне надо переопределить аппаратное прерывание int 09h. В общем я создаю собственный обработчик этого прерывания. Но у меня отключается клавиатура. Может это связано с тем, что в обработчике 9 прерывания нельзя использовать 16 или 21-я не знаю...
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

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

1) Вызывается ли оригинальный обработчик?
2) Сохраняются ли в обработчике все регистры и флаги (9h - аппаратное прерывание)
*provided AS IS
Игрек
Сообщения: 12
Зарегистрирован: 28 май 2004, 20:35

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

а что, в обработчике аппаратн. прерывания я должен сохранять все регистры и регистр флагов.?
Да. Обработчик аппаратного прерывания к которому также относится 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
Игрек
Сообщения: 12
Зарегистрирован: 28 май 2004, 20:35

Andy, привет. Послушай, в чём тогда смысл, резидентная это программа или нет, если мы всё равно восстанавливаем старый обработчик. У нас что, в ОП все равно остаётся наш обработчик? Если да, то все ясно, если нет-то зачем тогда int 27h, если мы и так можем написать нов. обработчик, а затем заменить его на старый? Если я задал глупый вопрос, то не отвечай пожалуста...
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

Игрек, честно скажу, напрягался-напрягался но смысл вопроса не понял :)
Если я задал глупый вопрос
На то он и форум чтоб вопросы задавать :)
*provided AS IS
Игрек
Сообщения: 12
Зарегистрирован: 28 май 2004, 20:35

Извини. Смысл в том, что я не понимаю смысла резидентной программы. Я знаю, что она остаётся в ОП. Но как это проявляется конкретно в моей программе?
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

Смысл в том, что я не понимаю смысла резидентной программы
Смысл простой. ДОС - система однозадачная. К примеру программа должна постоянно предоставлять какой-нибудь сервис, скажем управлять отображением символов на экране (как keyrus.com). Тогда эта программа должна резидентно висеть в памяти, иначе она будет предоставлять сервис только сама себе. :)
*provided AS IS
Игрек
Сообщения: 12
Зарегистрирован: 28 май 2004, 20:35

То есть, когда я запущу свою прогу, я могу любое количество раз нажимать на клаву(прерывание int 9h)- и будет всегда это прерывание обрабатываться моим обработчиком?
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

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