Создание TSR программ в операционной, страница 4

Так же в целях проверки наличия вашей TSR программы в памяти можно использовать MCB блоки. В параграфе владельца блока MCB содержится имя программы, которой принадлежит этот MCB. Понятно, что перебирая MCB, можно установить наличие/отсутствие своей программы в памяти.

Пример разработки простейшей TSR программы.

Постановка задачи

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

Разработка сценария (алгоритма) работы программы.

Программу будем составлять в соответствие со всеми требованиями к TSR программам.  Согласно этим требованиям в программу должны входить:

-  модуль установки программы в память;

-  модуль предотвращения повторной установки программы в память;

-  модуль контроля за истечением заданного времени;

-  модуль активизации и вывода на экран сообщения;

-  модуль выгрузки программы из памяти.

Схема взаимодействия указанных модулей представлена на рисунке 1.

 


Рисунок 1

Все процедуры размещены в модуле установки программы в памяти, который будет делиться на две части: резидентная часть и установочная часть. Резидентная часть состоит из трех процедур:

1.  Модуль предотвращения повторной установки программы в памяти и, одновременно, модуль выгрузки программы из памяти. Модуль будет устанавливаться вместо стандартного обработчика прерывания 2Fh. Сама программа будет закреплена за функцией 80h, подфункция 00h (Вы, впрочем могли закрепить свою программу за любой функцией и подфункцией прерывания 2F, разрешенной программисту (см. выше стр. 5).     При наличии программы в памяти она будет отзываться на запрос прерывания 2Fh  кодом  0ABCDh, возвращаемом в регистре AX (Это я придумал такой код, Вы могли придумать что угодно другое, главное –  мы закрепляем этот код за нашей программой и всем друзьям, которым раздаем свою программу, сообщаем, что она “откликается” на этот код).      Выгружать программу из памяти будем тогда, когда в командной строке программы будет задан ключ  /u (этот ключ тоже я придумал).

2.  Модуль контроля за истечением заданного времени будет устанавливаться на стандартное прерывание 1Ch (пользовательское прерывание таймера). Это прерывание в операционной системе вызывается 18,2 раза в секунду, следовательно, чтобы отсчитать промежуток времени в 10 заданных нам секунд надо пропустить 182 прерывания, после чего программа должна установить в некоторой ячейке, которую назовем «Флаг истечения времени», единицу, что будет являться сигналом для следующего блока, что заданное время ожидания истекло.

3.  Модуль активизации и печати сообщения будет установлен взамен стандартного прерывания 28h. Это прерывание вызывается операционной системой в тот момент, когда она свободна и может выполнять запросы TSR программ. Модуль проверяет  ячейку «Флаг истечения времени» и если там появляется единица, печатает заданное сообщение на экране, сбрасывает в ноль ячейку «Флаг истечения времени», сбрасывает счетчик модуля контроля за истечением заданного времени, устанавливая его в исходное состояние, и все начинается сначала.

Программная реализация модулей.

Модуль предотвращения повторной установки программы в памяти и выгрузки программы из памяти.

Поскольку модуль будет устанавливаться на прерывание 2Fh, назовем его:

New_2F  Proc            ; обработка мультиплексного прерывания

cli                      ; на всякий случай запретим на время все прерывания в ОС

cmp ax,08000h  ; проверим, а нашу ли программу вызывают (см. выше         п1)?

jne   exit            ; если нет, то выйти из процедуры.

mov ax, 0ABCDh      ;иначе – отправить пароль «я здесь» (см. выше         п1).

sti                      ;разрешить опять все прерывания в ОС.

iret                    ; выйти из прерывания

exit: sti                      ; разрешить опять все прерывания в ОС.

jmp cs:[Old_2F] ; и перейти по адресу старого обработчика прерывания 2F.

Old_2F   DD 0            ; это место под адрес старого обработчика прерывания 2F.

New_2F  endp

Модуль контроля за истечением заданного времени