0 / 0 / 0
Регистрация: 15.04.2012
Сообщений: 20
|
|
1 | |
[Вопрос] Перехват прерывания прямым доступом к вектору прерывания06.05.2012, 21:01. Показов 8404. Ответов 20
Метки нет (Все метки)
Всех приветствую!
В данный момент разбираюсь с обработкой аппаратного прерывания (прерывание таймера 08h и 1Ch, -//- клавиатуры 09h). Освоил способ с помощью функций 25h и 35h. Но не могу понять, как сделать тоже самое прямой записью (установить и возвратить текущее значение вектора..). Прошу помощи!
0
|
06.05.2012, 21:01 | |
Ответы с готовыми решениями:
20
Перехват прерывания 20h Вычислить адрес вектора прерывания по номеру прерывания. Перехват прерывания int 09h Перехват прерывания, скроллинг экрана |
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
|
|
07.05.2012, 07:07 | 2 |
Это задачка очень простая. Вектора прерывания находится в памяти по адресу 0000h:0000h. Вначале идет смещение, затем сегмент. Например, тебе нужно обработчик на 8 прерывание посадить. 8*4(длина элемента) = 20h, то есть по адресу 0000H:0020h находится смещение обработчика прерывания, а по адресу 0000H:0022h - сегмент обработчика. Просто читаешь оттуда начальный адрес, сохраняешь его у себя в резидентной, затем запихиваешь туда адрес своего обработчика и остаешься резидентом. Когда выходишь читаешь из своего буфера, ставишь по адресу исходный адрес и выходишь.
0
|
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
|
|
07.05.2012, 10:47 | 3 |
Немного добавлю. Перед изменением в системной области память, надо запретить аппаратные прерывания командой CLI, а после внесения изменений разрешить - STI. Так надежней будет.
0
|
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
|
|
07.05.2012, 13:54 | 4 |
А, ну да, я у Калашникова читал такое про изменение стековых указателей. Это правда, особенно про таймер, потому что таймер может вылететь чертикуда. И непонятно, что будет с ДОСОм. Скорее всего упадет.
0
|
0 / 0 / 0
Регистрация: 15.04.2012
Сообщений: 20
|
||||||
07.05.2012, 19:03 [ТС] | 5 | |||||
Не по теме: не получилось на готовом примере( Вот код, работает с функциями 35h\25h, но стоит "попытаться" напрямую к вектору обратится, то зацикливается... Может не так обращаюсь. Вот код оригинальной программы (могу и свою с ошибками):
0
|
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
|
|
08.05.2012, 07:33 | 6 |
О, какой подход прикольный.
Go.D-bq, знаешь почему у тебя виснет. Ты ставь вначале cli и sti после, потому что если кто-то обратится к прерыванию, когда ты меняешь, то пойдет программа непонятно куда. Мой совет - cli перед сменой и sti после смены. Ну а для таймера это просто обязательно. Int 25h и Int 35h блокирует прерывания перед сменой тоже.
1
|
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
||||||
08.05.2012, 10:34 | 7 | |||||
ВотЪ, поправил немножко.О_о
Сообщение от programmisto
1
|
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
|
|||||||||||
08.05.2012, 13:53 | 8 | ||||||||||
Нет. Вот макрос для замены вектора в DS:SI адрес нового обработчика, в CL - номер:
0
|
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
|
08.05.2012, 14:29 | 9 |
Сообщение от programmisto
Через замену обработчика напрямую, сохранение старого и т.д. Типа SetVector IntNum, MyHandler и RestoreVector IntNum. Ы?
0
|
0 / 0 / 0
Регистрация: 15.04.2012
Сообщений: 20
|
|
08.05.2012, 16:02 [ТС] | 10 |
Ребят, благодарю!
Не по теме: сижу вот теперь в отладчик, с листом бумаги и разбираюсь: втолкнул в стек, вытолкнул из стека..:umnik: Код получается снова нагруженный.. Просто я не знаю шаблона для простого написания прерывания.. Части раскиданы по все программе Есть какая-нибудь программа, на которую можно опереться как шаблон? Что-то типа этого не встречали? : процедура (вызов-запрет-цикл выводимого сообщений) - главная часть - EXIT ? Не по теме: Может просто где натыкались на такое.. А то будет сложно потом знакомым объяснять другим что за функции типа retf или lds своими словами.
0
|
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
|
||||||
09.05.2012, 06:25 | 11 | |||||
Смотри образец обработчика прерывания:
1
|
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
|
09.05.2012, 08:40 | 12 |
Сообщение от programmisto
0
|
0 / 0 / 0
Регистрация: 15.04.2012
Сообщений: 20
|
||||||
12.05.2012, 13:08 [ТС] | 13 | |||||
Не по теме: Виноват за долгую задержку в коде ;) Проверьте на правильность, может что лучше заменить-переделать? Вопрос в шапке указан! Вот сам код! :
0
|
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
||||||
12.05.2012, 13:16 | 14 | |||||
стр. 29,30 можно заменить на одну:
0
|
Go.D-bq
|
12.05.2012, 14:02
[ТС]
#15
|
Не по теме: Момент всплыл грустный: программа то отработает нормально, то может с ошибкой.. Перепроверил код - тщетно.
0
|
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
|
12.05.2012, 14:09 | 16 |
В стр. 68 забыто восстановление старого вектора.
0
|
0 / 0 / 0
Регистрация: 15.04.2012
Сообщений: 20
|
||||||
12.05.2012, 14:44 [ТС] | 17 | |||||
Понятно. Просто суть была перевести команды:
Не по теме: Исправляю ..
0
|
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
||||||
12.05.2012, 14:57 | 18 | |||||
Сообщение от Go.D-bq
0
|
0 / 0 / 0
Регистрация: 15.04.2012
Сообщений: 20
|
||||||
12.05.2012, 15:05 [ТС] | 19 | |||||
Charles Kludge Сделал так:
Не по теме: Сделал сам и вижу ваш код :) Все равно благодарю! :good:
0
|
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
|
|
12.05.2012, 15:14 | 20 |
Может, pushf/popf убрать, а вместо popf - sti ? И pop es забыт.
0
|
12.05.2012, 15:14 | |
12.05.2012, 15:14 | |
Помогаю со студенческими работами здесь
20
Перехват прерывания int 21h Глобальный перехват аппаратного прерывания Перехват прерывания жесткого диска Вывод на экран. Перехват прерывания int 05h Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |