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

        jne bue                  

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

;Для начала загрузим регистры ES:BX адресом нашей программы в памяти

;для чего возьмем вектор любого из контролируемых ею прерываний

;например 28h

              mov ax,3528h         

              int    21h

;Теперь сохраним регистр ds, так как сейчас начнем его портить

        push ds                 

; загрузим регистры DS:DX адресом старого вектора прерывания 1С взятого

;из памяти нашей программы, которая сейчас стоит резидентом.

lds dx,dword ptr es:old_1C

;и возвратим его на «родное место» в таблицу векторов прерываний

        mov ax,251Ch             

        int 21h                  

;То же сделаем с прерыванием 28h

lds dx,dword ptr es:old_28

mov ax,2528h             

        int 21h                  

;И прерыванием 2F

lds dx,dword ptr es:old_2F

mov ax,252Fh              

        int 21h                  

;Восстановим регистр DS

        pop ds                   

;Используя стандартную функцию 49h прерывания 21h, освободим память, зани- ;маемую нашей резидентной программой. Функция освобождает память, сегмент

;которой стоит в ES. А там как раз адрес начала нашей резидентной программы.

        mov ah,49h               

        int 21h                  

;Теперь надо освободить память, занятую блоком окружения программы. Надеюсь

;Вы помните, что при запуске программы операционная система создает два бло;ка управления памятью (MCB) – один для самой программы, а второй для тексто;вых строк, взятых их файла autoexec.bat с ключем set. Этот блок называется

;«блоком окружения» и его сегментный адрес операционная система заносит в

;PSP программы в слово по смещению 02Ch от начала PSP. Возьмем оттуда этот

;адрес и поместим его в ES

mov es,word ptr es:[002ch]

;После чего дадим команду освободить этот блок

        mov ah,49h

        int 21h                  

;Теперь можно завершить программу и возвратиться в операционную систему

bue:       mov ax,4c00h

              int  21h

Компоновка текста программы

Для компилирования программы в компиляторе TASM надо облечь ее в стандарный листинг, структурный вид которого изображен ниже:

тексты процедур

NEW_2F

NEW_1C

NEW_28

 
code_seg       segment

 TSRprog       proc     far

              assume cs:code_seg

              org   100h

begin:

              jmp  start

текст загрузочного

модуля

 
start:

TSRprog        endp

code_seg       ends

end        begin

Компилирование производим стандартными командами:

TASM  namefile.asm

TLINK /t namefile.obj


Задание на лабораторную работу

Изучите теоретический материал по составлению TSR программ в среде MS DOS.

1.  Изучите пример составления TSR программы, разобранный в методической разработке.

2.  Наберите и отладьте работу программы из примера. Контроль за установлением программы в памяти и ее удалением оттуда проводите утилитой MEM.

3.  Доработайте программу так, чтобы:

№ варианта

Доработать текст программы, приведенной в примере, так чтобы:

1, 7, 13

Выдавалось три сообщения:

- до окончания работы осталось 30 сек.

- до окончания работы осталось 20 сек.

- до окончания работы осталось 10 сек, после чего компьютер перезагружался

2, 8, 14

При нажатии клавиш  Alt+Z на экран выдавалось сообщение: Я еще работаю!

3, 9, 15

Сообщение выдавалось циклично и всегда в разном месте экрана.

4, 10, 16

TSR программа записывала в файл имена запускаемых пользователем программ

5, 11, 17

заменить работу процедуры New_1C использованием функции 83h прерывания 15h. Порядок работы функции изучить самостоятельно по справочнику TECH HELP.

6, 12, 18

При трехкратном нажатии клавиши ScrollLock на экран выдавалось сообщение: Готов к приему данных!