- •Лучший курс лекций по лучшему языку программирования – языку ассемблера Блок управления памятью (mcb)
- •Программирование на Ассемблере для ibm pc
- •Программная модель 8086
- •Программная модель мп
- •Сегментная память
- •Вывод на экран
- •Вывод строки символов
- •Вывод на экран шестнадцатеричного числа
- •Процедуры
- •Ввод символов
- •Вывод на экран двоичного числа
- •Работа с дисковыми файлами
- •Префикс сегмента программы (psp)
- •Структура префикса программного сегмента.
- •Прерывания.
- •Табличные вызовы подпрограмм.
- •Макрокоманды.
- •Макроопределения.
- •Использование параметров в макроопределениях.
- •Директива local
- •Использование библиотек макроопределений.
- •Конкатенация. (&)
- •Директивы повторения.
- •Условные директивы.
- •Перечисление условных директив.
- •Пример использования ifnb.
- •Пример использования макроопределений.
- •Резидентные программы tsr (terminate and stay resident)
- •Защита резидентной программы от повторной загрузки.
- •Выгрузка резидентной программы.
- •Переключение стека в резидентной программе.
- •Обработчик прерываний от таймера
- •Контроллер прерываний и его программирование
- •Взаимодействие прикладных и системных обработчиков прерываний
- •Резидентный обработчик прерываний от клавиатуры с подключением до системного
- •Резидентный обработчик прерывания от клавиатуры с подключением после системного обработчика
- •Резидентный обработчик прерываний от клавиатуры с подключением как до, так и после системного.
- •Вывод на экран текста средствами bios
- •Режимы дисплея
- •Работа с видеобуфером.
- •Логическая организация текстового видеобуфера.
- •Программирование портов. Звук.
- •Программирование звукового канала таймера.
- •Интерфейс с Си
- •Программы с несколькими сегментами команд.
- •Программы с несколькими сегментами данных.
- •Директива assume. Инициализация сегментных регистров и замена сегментов.
- •Структуры и записи.
Выгрузка резидентной программы.
В 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.