Ассемблер (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," ╚════════════════════════════════╝$"


Страница: