Ассемблер (assembler). Разработка резидентых обработчиковРефераты >> Программирование и компьютеры >> Ассемблер (assembler). Разработка резидентых обработчиков
mov ax,252Fh ; Восстановим вектор 2Fh
lds dx,[cs:old_2Fh]
int 21h
mov ax,2509h ; Восстановим вектор 09h
lds dx,[cs:old_09h]
int 21h
; Получим из PSP адрес собственного окружения и выгрузим его
mov es,[cs:2Ch] ; es <- сегментный адрес окружения программы
mov ah,49h ; Функция освобождения блока памяти
int 21h
; Выгрузим теперь программу из памяти вместе с PSP
push cs
pop es ; es снова указывает на начало PSP
mov ah,49h ; Функция освобождения блока памяти
int 21h
pop dx
pop es
pop ds
iret
Endp new_2Fh
Endp resident
;Секция инициализации
;- Выполняется проверка на наличие в памяти первого экземпляра резидента.
;- Если первый экземпляр не обнаружен, то независимо от вида запускающей программу команды
;(с опцией или без неё) происходит переход на метку ОК с установкой программы в памяти
;- При обнаружении первого экземпляра программы начинается сравнение опции команды с
;ожидаемой
;- Если результат сравнения оказался отрицательным (опция есть, но другая), программа завершается
;выводом сообщения о невозможности повторной установки
;- При идентичности опции ожидаемой резидент выгружается из памяти с выводом
соответствующего сообщения
Proc init
mov ax,0C800h ;Запрос на наличие в памяти первого
int 2Fh ;экземпляра программы
cmp al,0ffh ;Вернулся код 0ffh?
jne ok ;Нет, данная программа в памяти отсутствует. Выполним её
;установку, перейдя на метку оk
;Первый экземпляр обнаружен. Была ли у команды опция 'off'?
mov cl,[es:80h] ;Получим длину хвоста из PSP
cmp cl,0 ;Длина хвоста = 0?
je fin ;Да, программа запущена без него
xor ch,ch ;Пусть сх=cl=длина хвоста
mov di,81h ;Адрес хвоста es:di в PSP
mov al,' ' ;Уберём пробелы из начала хвоста
cld ;просмотр вперёд
repe scasb ;Сканируем хвост (al - dst), пока пробелы
dec di ;di- первый символ после пробела
mov cx,3 ;Ожидаемая длина опции
mov si,offset option ;Адрес ожидаемой опции (option) ds:si
repe cmpsb ;Сравниваем введённую опцию с ожидаемой
jne fin ;Опции не совпали. На выход
mov ax,0C801h ;Опции совпали, пошлём в резидентную
int 2Fh ;программу команду (al=01) на выгрузку. По окончанию
mov dx,offset msg3 ;выгрузки выведем сообщение об этом
jmp fin1
fin: mov dx,offset msg2 ;Попытка вторичной установки
fin1: mov ah,09h
int 21h
mov ax,04C00h ;Функция DOS 4Сh: выход из программы
int 21h ;Вызов DOS. Останов
;Первой экземпляр (резидент) отсутствует. Установим программу
ok: mov ax,351Ch ;Чтение и сохранение вектора 1Ch
int 21h
mov [word cs:old_1Ch],bx
mov [word cs:old_1Ch+2],es
mov ax,3509h ;Чтение и сохранение вектора 09h
int 21h
mov [word cs:old_09h],bx
mov [word cs:old_09h+2],es
mov ax,352Fh ;Чтение и сохранение вектора 2Fh
int 21h
mov [word cs:old_2Fh],bx
mov [word cs:old_2Fh+2],es
mov ax,251Ch ;Установка обработчика 1Ch
mov dx,offset new_1Ch
int 21h
mov ax,2509h ;Установка обработчика 09h
mov dx,offset new_09h
int 21h
mov ax,252Fh ;Установка обработчика 2Fh
mov dx,offset new_2Fh
int 21h
mov ah,09h
mov dx,offset msg1 ;Сообщение об успешной установке программы
int 21h
mov ax,3100h
mov dx,(init-resident+10Fh)/16
int 21h
Endp init
;----------------------------------------------
msg1 db 'Резидентный обработчик установлен$'
msg2 db 'Резидент уже установлен. Выгрузка через опцию off$'
msg3 db 'Резидент выгружен из памяти$'
option db 'off'
END resident
Файл TEST.asm
;Студент: Шевченко Н.С. преподаватель: Афанасьев В.А.
;Вариант 11
;Задание: Реализовать Резидент-замедлитель исполнения программ.
;Замедление реализуется поцедурой задержки, вставленной
; в обработчик прерывания пользователя по таймеру (int 1Ch).
;Инициализация резидента осуществляется через
;посредство комбинации клавиш <Scroll Lock+Цифровая клавиша>.
;Значение символа цифровой клавиши влияет на скорость замедления
;R.com - основнной модуль, содержащий резидент с пользовательскими
;обработчиками new_1Ch, new_09h и new_2Fh заменяющими соостветствующие
;обработчики 1Ch, 09h и 2Fh
;DEMO.exe - демонстрационная программа, показывающая на примере
;вывода системного времени работу резидента
Ideal
Model small
P486N
Stack 256
MACRO window N,attrib,y1,x1,y2,x2
mov ah,06h
mov al,N
mov bh,attrib
mov ch,y1
mov cl,x1
mov dh,y2
mov dl,x2
int 10h
ENDM window
MACRO locate y,x
mov ah,02h
mov bh,0
mov dh,y
mov dl,x
int 10h
ENDM locate
MACRO cprintf mes,len,attrib,x,y,n
mov ah,13h
mov al,1 ;Признак смещения курсора в конец строки
mov bh,n ;Номер видеостраницы
mov bl,attrib
mov cx,len
mov dh,y
mov dl,x
mov bp,offset mes ;Адрес строки ES:BP
int 10h
ENDM cprintf
MACRO out_str mes
mov ah,09h
lea dx,[mes]
int 21h
ENDM out_str
DATASEG
intro db 13,10," ╔═════════════════════════════════════╗"
db 13,10," ║ Курсовая работа по Ассемблеру ║"
db 13,10," ║ Студент: Шевченко Н.С. Преподаватель: Афанасьев В.А. ║"
db 13,10," ╚═════════════════════════════════════╝",13,10,'$'
mes_t11
db 13,10," ╔═════════════════════════════════╗"
db 13,10," ║ Текущее время: ║"
db 13,10," ║ Реальное время: ║"
db 13,10," ╚═════════════════════════════════╝$"
status db 13,10," ╔════════════════════════════════╗"
db 13,10," ║ Статус: ║"
db 13,10," ╚════════════════════════════════╝$"