pop cx
pop es
pop bp
pop bx
pop ax
M1: popf
; В заключение процедуры передадим управление старому обработчику
jmp cs:[old_28]
;А это область данных нашей процедуры New_28. Здесь хранится текстовая стро;ка выводимая на экран ПЭВМ
curtime db " 10 секундистекли!”
old_28 dd 0
New_28 endp
Модуль загрузчика программы в память
Теперь можно написать код модуля , который будет выполнять анализ нахождения нашей программы в памяти, загрузку и выгрузку нашей программы.
Начинается модуль с метки (мы ее сами придумали):
start:
; Во-первых, сразу запросим прерывание 2F – нет ли нашей программы в памяти?
;Для этого занесем в AX запланированный нами код функции (см. выше процедуру
;New_2F – мы там решили занять для своих нужд функцию 80 и подфункцию 00
mov ax,08000h
;Обратимся к функции 2F
int 2Fh
;Проверим поступивший из прерывания «отзыв». Наша программа должна ото;зваться кодом 0ABCD (см.выше процедуру New_2F)
cmp ax,0ABCDh
;Если это так, то мы пытаемся второй раз установить программу – это не нужно,
;а может быть мы хоти выгрузить ее из памяти? Надо проверить ключ в строке
;параметров запуска программы, поэтому перейдем к метке ANALIZ
je analiz
;В противном случае начинаем установку программы резидентом в памяти
;Для этого сначала сохраним адреса старых векторов прерываний, которые мы
;планируем заместить своими процедурами. Начнем с вектора 28h. Используя
;стандартную функцию 35h прерывания 21h получим этот вектор в ES:BX
mov ax,3528h
int 21h
;и сохраним его в специально подготовленной ячейке old_28 (см.выше)
mov word ptr old_28,bx
mov word ptr old_28+2,es
;С помощью стандартной функции 25h прерывания 21h на место старого векто;ра установим адрес нашей процедуры
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 old1C, bx
mov word ptr old1C+2, es
mov ax,251Ch
lea dx, New_1C
int 21h
;Разместим в регистре dx адрес начала НЕ РИЗЕДЕНТНОЙ части нашей програм;мы
lea dx,start
;и, с помощью стандартного прерывания 27h завершим нашу программу, оставив
;ее в памяти резидентной
int 27h
;Сюда мы попадаем, если наша программа обнаружена уже установленной в
;памяти
analiz:
;Будем анализировать содержимое строки параметров нашей программы.
;Известно, что после запуска программы, содержимое командной строки операц;онная система размещает по смещению 80h в PSP программы (см. TECH HELP,
;PSP). Точнее по самому смещению 80h находится байт, в котором размещается
;число, равное количеству символов в строке параметров. Получим его из PSP,
;для чего смещение интересующего нас байта занесем в SI
mov si,80h
;потом загрузим этот байт в AL
lodsb
;и проверим, длина строки параметров не меньше трех символов? (Если Вы еще
;не забыли, мы решили выгружать программу, если подадим в командной строке
;параметр /u, а это, вместе с пробелом – как раз три символа)
cmp al,3
;если меньше, то выйти из программы, потому, что командная строка коротка
jl bue
;иначе перейдем на адрес следующего байта командной строки
inc si
;и возьмем из нее в AX два байта (слово)
lodsw
;проверим, это наш ключ /u ? (при этом помним, что в AX байты перевернуты –
;сначала заносится старший, потом младший
cmp ax,'u/'
;если не равно, то это не наш ключ и программу завершаем
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.