old_28 dd 0
New_28 endp
start:
;Проверим нет ли нашей программы в памяти?
mov ax,08000h
int 2Fh
cmp ax,0ABCDh ;Проверим поступивший из прерывания «отзыв».
je analiz
;Начинаем установку программы резидентом в памяти
;Для этого сначала сохраним адреса старых векторов прерываний:
mov ax,3528h
int 21h
mov word ptr old_28,bx
mov word ptr old_28+2,es
;а вместо старого вектора установим адрес нашей процедуры
mov ax,2528h
lea dx,new_28
int 21h
;Теперь то же самое проделаем с вектором 2Fh:
mov ax,352Fh
int 21h
mov word ptr old_2F,bx
mov word ptr old_2F+2,es
mov ax,252Fh
lea dx, New_2F
int 21h
;и с вектором 1Сh:
mov ax,351Ch
int 21h
mov word ptr old_1C, bx
mov word ptr old_1C+2, es
mov ax,251Ch
lea dx, New_1C
int 21h
;Разместим в регистре dx адрес начала не резидентной части нашей программы
lea dx,start
int 27h ;завершим нашу программу, оставив ее в памяти резидентной
;если программа обнаружена уже установленной в памяти:
analiz:
;Будем анализировать содержимое строки параметров нашей программы.
mov si,80h ;проверяем количество символов в строке параметров
lodsb
cmp al,3
jl bue ;если командная строка коротка
inc si ;иначе перейдем на адрес следующего байта командной строки
lodsw
cmp ax,'u/' ;проверим ключ /u
jne bue
;модуль выгрузки программы из памяти
mov ax,3528h;загрузим регистры ES:BX адресом нашей программы в памяти
int 21h ;и возвратим старый вектор прерываний на
push ds ;«родное место» в таблицу векторов прерываний
lds dx,dword ptr es:old_1C
mov ax,251Ch
int 21h
lds dx,dword ptr es:old_28
mov ax,2528h ;То же сделаем с прерыванием 28h и 2Fh
int 21h
lds dx,dword ptr es:old_2F
mov ax,252Fh
int 21h
pop ds
mov ah,49h ;освободим память, занимаемую резидентом
int 21h
;освободим память, занятую блоком окружения программы:
mov es,word ptr es:[002ch]
mov ah,49h
int 21h
bue: mov ax,4c00h
int 21h
TSRprog endp
code_seg ends
end begin
Результат работы программы, контроль над ее установлением в памяти
На рис.1 представлен результат работы программы – строка “10 seconds passed”, которая появляется через 10 секунд после запуска программы и обновляется через каждые 10 секунд. Также приведены показания утилиты mem.exe по размещению программ в памяти после запуска данной программы (lab5os.com) и запуска программы tsr.com из третьей части задания.
Рис. 1. Результат работы, показания утилиты mem
На рис. 2 – показания утилиты mem после удаления обеих программ из памяти (запуск lab5os.com /u и tsr.com /del). Видно, что программы удалены из памяти.
Рис. 2. Корректное удаление программ из памяти
Алгоритм работы программы
Данная программа записывает в файл имена (пути) запускаемых пользователем программ. Согласно требованиям к TSR программам в программу входят: модуль установки программы в память; модуль предотвращения повторной установки программы в память; модуль записи в файл путей запускаемых пользователем программ; модуль выгрузки программы из памяти.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.