Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - Две резидентные программы на одном прерывании

Вопрос:
Подскажите пожалуйста как выгрузить резидентную программу, перехватывающую прерывания, если после нее загружена еще резидентная программа перехватывающая это прерывание, с сохранением порядка прерываний!!!

Ответ:
Надо понимать, что при установке нового обработчика любого прерывания
адрес старого обычно сохраняют и делают переход на старый обработчик в случае
неудовлетворению некому условию (причем есть несколько способов перехода на старый вектор)
Перед тем, как выгрузить предыдущий резидент, надо исключить отработчики всех векторов,
находящиеся в нем, из каждой цепочки отработки прерываний.
Теперь о том, как это реализовать...
Могу предложить следующий путь решения этой задачи.
1) Дизассемблируем обе программы, чтобы найти, во-первых, какие прерывания перехвачены,
во-вторых, где хранится адрес предыдущего обработчика.
2) Пишем программу, в которой:
а) пробегая по всем блокам управления памятью MCB, находим сегменты, в которых "сидят" оба резиденты.
б) считываем по ранее найденным по листингу предыдущего резидента адресам векторы прерываний до предыдущего резидента
и если эти прерывания используются в последнем резиденте, то вписываем значение вектора в нужное место (как адрес предыдущего обработчика),
если не используются, то просто устанавливаем на этот адрес обработчик.
в) освобождаем блоки памяти (окружение, саму программу), занятые предыдущим резидентом...
Возможные другие блоки выделенной памяти этим резидентом (это бывает очень редко, но проверить надо)
легко обнаружить, например, в последовательности MCB или в листинге.


   Вперёд
   Содержание