Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ASM_lectures.doc
Скачиваний:
27
Добавлен:
28.04.2019
Размер:
992.77 Кб
Скачать

Выгрузка резидентной программы.

В DOS отсутствуют средства выгрузки резидентных программ. Единственный способ - перезагрузка компьютера. Правда есть утилиты, которые позволяют удалять резидентные программы. Однако большинство резидентных программ имеют встроенные средства выгрузки. Рассмотрим пример. Пусть последовательно загружаются в память три резидентные программы A,B,C. Перед изменением адреса прерывания программа сохраняет адрес обработчика, а затем вызывают его в процессе своей работы.

Программа А перехватывает прерывание 09h и 21h

Программа В перехватывает прерывание 16h и 21h

Программа С перехватывает прерывание 09h

После этого программа A удаляется из памяти.

До удаления:

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

int_09h_vect: адрес обработчика прерывания 09h программы С

int_16h_vect: адрес обработчика прерывания 16h программы B

int_21h_vect: адрес обработчика прерывания 21h программы B

Программа A:

int_09h_vect: адрес обработчика прерывания 09h bios

int_21h_vect: адрес обработчика прерывания 21h dos

Программа B:

int_16h_vect: адрес обработчика прерывания 16h bios

int_21h_vect: адрес обработчика прерывания 21h программа А

Программа C:

int_09h_vect: адрес обработчика прерывания 09h программа А

После удаления:

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

int_09h_vect: адрес обработчика прерывания 09h bios

int_16h_vect: адрес обработчика прерывания 16h программы B

int_21h_vect: адрес обработчика прерывания 21h dos

Программа B:

int_16h_vect: адрес обработчика прерывания 16h bios

int_21h_vect: адрес обработчика прерывания 21h программа А (висячая ссылка)

Программа C:

int_09h_vect: адрес обработчика прерывания 09h программа А (висячая ссылка)

Т.о. после удаления программы A, программа С переходит в разряд «мусора» - она продолжает занимать место в памяти, но вызываться никогда не будет - при возникновении прерывания 09h - управление передается сразу в bios. Программа B будет получать управление прерывания 16h, но скорее всего правильно работать не сможет, т.к. программа потеряла контроль за прерыванием 21h. Если программа B попытается обратиться по адресу исходного обработчика. То скорее всего это приведет к зависанию DOS. Следовательно, прежде, чем удалять резидентную программу необходимо убедиться в том, что она находится на вершине списка обработчиков прерываний, т.е. загружена последней и ни одно из прерываний , используемых программой не было впоследствии перехвачено другой программой. Следующая процедура позволяет выполнить все проверки и удалить если можно программу A из памяти.

Получить вектор:

ah=35h

al=прерывание

es:bx -указатель на обработчик

Освободить память:

ah=49h

es=сегментный адрес освобождаемого блока памяти

возврат:

cf=0 ошибок нет

cf=1

ax=7

ax=9

remove proc

mov cx,cs

mov ax,3509h ;проверить вектор 09h

int 21h

mov dx,es

cmp cx,dx

jne not_remove

cmp bx,offset int_09h

jne not_remove

mov ah,3521h ;проверить вектор 21h

int 21h

mov dx,es

cmp cx,dx

jne not_remove

cmp bx,offset inr_21h

je uninstall

not_remove: ret

uninstall: push ds ;восстановить 09h

mov dx,word ptr int_09h_vect

mov ds,word ptr int_09h_vect+2

mov ax,2509h

int 21h

pop ds

;

push ds

mov dx,word ptr int_21h_vect

mov ds,word ptr int_21h_vect+2

mov ax,2521h

int 21h

pop ds

? cli

push cs

pop es

mov ah,49h

int 21h

ret

remove endp

Для обращения к remove можно использовать ??? прерывание или функцию мультиплексного прерывания. При этом программа, запущенная ??? вместо того, чтобы остаться резидентной, должна обращаться к 2fh с заданной функцией и осуществить процесс remove.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]