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

Резидентные программы tsr (terminate and stay resident)

Любая TSR программа содержит один или несколько взаимодействующих друг с другом обработчиков прерываний, которые обеспечивают запуск программы и выполняют служебные функции.

При создании обработчиков необходимо помнить, что ds, es, ss после прерывания содержат прежние значения, поэтому внутри обработчика нужно использовать адресацию относительно cs, применяя где требуется прежние значения сегмента, либо должны установить сегментные регистры, предварительно сохранив их старые значения.

Чаще всего резидентные программы не полностью заменяют имеющиеся обработчики прерываний, а лишь дополняют его. Передать управление исходному обработчику можно:

jmp dword ptr [old_int_vect]

либо имитировать прерывание по старому вектору:

pushf

call dword ptr [old_int_vect]

Здесь old_int_vect - двойное слово, в котором сохранен исходный вектор прерывания.

Обычно TSR программу пишут в формате COM.

org 100h

entry: jmp boot

;

;Обработчик прерывания (резидентная часть)

;

boot:

;изменение вектора прерывания

mov dx, offset boot

int 27h

end entry

int 27h - функция DOS - завершить программу и оставить в памяти

cs - сегментный адрес PSP

dx - смещение первого байта освобождаемой памяти

Изменить вектор - («перехватить» прерывание) - сменить содержимое вектора так, чтобы он указывал на наш собственный обработчик прерывания. Перед этим следует сохранить старый вектор либо для исполнения стандартного обработчика, либо для восстановления предыдущего значения.

Вектор можно изменить с помощью команды mov, однако рекомендуется использовать 25h функцию 21h прерывания.

Установка вектора прерывания:

ah=25h

al=номер прерывания

ds:dx - указатель на новый обработчик прерывания

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

Если в резидентной программе нет защиты от повторной загрузки, то при повторном её запуске станет резидентной её вторая копия. И т.д. этот процесс может продолжаться до тех пор, пока не будет исчерпана оперативная память. Если резидентная программа в процессе своей работы передает управление старому обработчику прерывания, то при инициализации n-ой копии будет вызываться n-1 и первая копия. Если в программе имеются счетчики или команды типа inc, dec, add, работающие с памятью то несколько команд одной и той же резидентной программы будут работать неверно. Поэтому обязательным элементом любой резидентной программы является процедура защиты её от повторной загрузки.

Наиболее распространенным методом защиты резидентной программы от её повторной установки является использование мультиплексного прерывания 2fh, специально предназначенного для взаимодействия с резидентными программами.

Прерывание 2fh - мультиплексное прерывание

Вызов:

ah = номер мультиплексного процесса (идентифицирует обработчик прерывания)

00h-7fh Резерв DOS

80h-b7h доступны

b8h-8fh резерв для сетей

c0h-ffh доступны для прикладных программ

В частности номера 00 и 01 закреплены за резидентной программой DOS print.com

02h-рез. порция assign

10h-рез порция share

al-номер функции

al=00h - дать статус установки процесса

Возвращает

al - статус установки

00h - не установлен - можно устанавливать

01h - не установлен - нельзя устанавливать

ffh - установлен

Для того, чтобы резидентная программа могла отозваться на int 2fh, в ней должен иметься обработчик этого прерывания. Через этот обработчик может быть осуществлена не только проверка на повторную инициализацию, но и вообще связь с резидентной программой - смена режима её работы или получения от нее каких-то параметров. Задания действий осуществляются с помощью функции, заданной в al.

Таким образом обработчик должен прежде всего проверить номер процесса в ah и при обнаружении своего номера проанализировать al и выполнить затребованные действия, после чего с помощью iret передать управление вызвавшей программе. Однако, если обработчик обнаружил в ah - номер чужого процесса, он должен командой jmp передать управление по цепочке тому обработчику, адрес которого был ранее в векторе 2fh. В результате вызов int 2fh из любой программы будет проходить по цепочке через все загруженные программы, пока не достигнет «своей» программы или не вернет управление в вызвавшую программу через обработчик DOS, который, очевидно, всегда будет самым последним в цепочке.

Часто через дополнительные регистры передается символьная информация, например имя программы. Например если программа dump.com проверяет можно ли остаться резидентным в памяти, то получив в al код ffh и в регистрах cx и dx символьные коды ‘du’ и ‘mp’, то она уверена, что её копия уже есть в памяти. Если же в al - ffh, а в cx и dx - другие коды, то уже есть процесс с нашим номером, в этом случае можно сменить функцию или воспользоваться альтернативным мультиплексным прерыванием int 2dh.

int 2dh

ah - мультиплексный номер

al - функция

00h - проверка инсталляции

Возврат

al=0 -не установлен

al=ffh установлен

cx-версия

dx:di - строка сигнатуры

al=02h - выгрузка

Пример:

int_2fh_vector DD ?

int_2fh proc far

cmp ax,0b700h ; или 0c700

jne Pass_2fh

mov al,0ffh

iret

Pass_2fh:

jmp dword ptr cs:[int_2fh_vector]

int_2fh endp

;======================================

begin:

mov ax,0b700h ; установить статус процесса мультиплексного прерывания

int 2fh

cmp al,0

jz not_installed

lea dx,msg

call print

int 20h

msg db ‘Программа уже инициализирована’, 13, 10, ‘$’

not_installed

Программа не должна использовать мультиплексный номер. Программа должна сканировать мультиплексные номера с 00h по ffh, запомнить первый свободный, т.е номер процесса, который не инсталлирован. Программа должна сравнивать 16 байт сигнатуры для всех мультиплексных номеров, которые используются с целью определения - is already installed. (установлена ли программа на этом номере). Если не установлена, то берется первый свободный номер.

Формат сигнатуры:

offset size descriptor

00h 8 bytes имя произв

08h 8bytes имя прогр.

10h 64bytes asciz опсание продукта

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