new2 (КП - мониторинг файлов)
Описание файла
Файл "new2" внутри архива находится в следующих папках: КП - мониторинг файлов, anka. Текстовый-файл из архива "КП - мониторинг файлов", который расположен в категории "". Всё это находится в предмете "системное программирование" из 5 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "системное программирование" в общих файлах.
Просмотр текстового-файла онлайн
textsegment'code'
assumeCS:text, DS:text
org100h
main proc far ;Главная процедура
jmpinit
;--------------------------------------- -------------------------
;//////////Резидентный модуль////////////////////////////////// //
;--------------------------------------- --------------------------
;Поля для резидентной части программы
old_2Dhdd0
old_21hdd0
MesCRLFdb10,13,0
MesNew db 10, 13, 'Attentionnnnn! File was opened: ',0
mesNewlnequ$-MesNew
MesCl db 'Attention! The file was closed: ',0
MesCllnequ$-MesCl
;Резидентная секция программы
;--------------------------------------- ------------------
; Процедура обработчика мультиплексорного прерывания
;--------------------------------------- -------------------
new_2Dhprocfar;Обработчик мультиплексного прерывания
pushf
pushDS
pushES
pushCS;DS:=CS
popDS
cmpAH,0C8h;Наша фукция прерывания 2Dh?
jneout_2Dh
cmpAL,00h;Подфунция проверки на повторную установку
jeinsert
cmpAL,01h;Подфункция выгрузки
jeuninstall
jmpshort out_2Dh;Неизвестна подфункция.На выход.
insert:
movAL,0FFh;Программа уже установлена
popES
popDS
popf
iret
out_2Dh:
popES
popDS
popf
jmpold_2Dh
uninstall:;Выгрузим программу
;Восстановим вектор мультиплексного прерывания 2Fh
movAH,25h;Функция заполнения вектора
movAL,2Dh;Номер вектора
ldsDX,CS:old_2Dh
int21h
;Восстановим вектор прерывания DOS
movAH,25h;Функция заполнения вектора
movAL,21h;Номер вектора
ldsDX,CS:old_21h
int21h
;Получим из PSP адрес собственного окружения и восстановим его
movES,CS:2Ch;в ES адрес окружения из PSP
movAH,49h;Фукция освобождения памяти
int21h
;Выгрузим саму программу
pushCS
popES
movAH,49h;Фукция освобождения памяти
int21h
movAL,99h;Код успешной выгрузки
popES
popDS
popf
iret
new_2Dhendp
;--------------------------------------- ----------------------
; обработчик прерывания 21h
;--------------------------------------- ----------------------
new_21hprocfar;Обработчик прерывания DOS
;Адрес строки имени файла в DS:DX. Она завршена 0
pushf
pushDS
pushAX
pushES
pushDX
pushDS;ES:=старый DS
popES
pushCS;DS:=CS
popDS
sti;Разрешение более приоритетных прерываний
cmpAH, 3Dh;Открытие файла
jeNew_3Dh
cmpAH, 3eh;Закрытие файла
jeNew_3eh
Finally:
popDX
popES
popAX
popDS
popf
jmpdword ptr cs:old_21H
iret
New_3Dh:;Функция открытия файла
callCreateFile
jmpFinally
New_3eh:
Call DeleteFile ; Функция закрытия файла (описателя)
jmpFinally
New_6Ch:
movDX, SI;Имя файла в SI
callCreateFile
popDX
jmpFinally
new_21hendp
;--------------------------------------- ------------------
; Процедура сообщения об открытии файла
;--------------------------------------- -------------------
CreateFileproc;Процедура сообщения о создании файла
;Адрес строки имени файла в DS:DX. Она завршена 0
pushAX
pushDX
pushBX
pushES;DS:=старый DS
popDS
mov opclfile, DX
push CS
pop DS
cmp fhandle, 1;проверяем флаг открытого файла
je nex
mov fhandle, 1;устанавливаем флаг открытого файла
mov AH, 3Dh
mov AL, 2
mov DX, offset newfile
int 21h
mov handle, AX
nex:
mov AH, 42h; Функция установки указателя
mov AL, 02; От конца файла
mov BX, handle
mov CX, 0;Старшая половина указателя
mov DX, 0;Младшая половина указателя
int 21h
;Допишем новую строку
mov AH, 40h
mov BX, handle
mov CX, mesnewln
lea DX, mesnew
int 21h
mov AH, 40h
mov BX, handle
mov CX, 10;длина имени файла
push ES
pop DS
mov DX, opclfile
int 21h
;Закрытие файла
;mov AH, 3Eh
;mov BX, handle
;mov fhandle, 0
;int 21h
popBX
popDX
popAX
ret
CreateFileendp
;--------------------------------------- ------------------
; Процедура сообщения о закрытии файла
;--------------------------------------- ------------------
DeleteFileproc
;Адрес строки имени файла в DS:DX. Она завершена 0
pushAX
pushDX
pushBX
pushES;DS:=старый DS
popDS
mov opclfile, DX
push CS
pop DS
mov AH, 42h; Функция установки указателя
mov AL, 02; От конца файла
mov BX, handle
mov CX, 0;Старшая половина указателя
mov DX, 0;Младшая половина указателя
int 21h
;Допишем новую строку
mov AH, 40h
mov BX, handle
mov CX, mesClln
lea DX, mesCl
int 21h
mov AH, 40h
mov BX, handle
mov CX, 10;длина имени файла
push ES
pop DS
mov DX, opclfile
int 21h
cmp fhandle, 0
je nex1
;Закрытие файла
mov AH, 3Eh
mov BX, handle
mov fhandle, 0
int 21h
nex1:
popBX
popDX
popAX
ret
DeleteFileendp
;--------------------------------------- -----------------------
; Печать строки через функции BIOS
;--------------------------------------- -----------------------
PrintStrproc;Процедура печати строки через BIOS
;Вход: смещение строки в BX
pushAX
pushDI
pushBX
movAH,0Eh;Функция вывода символа
cycl:
cmp[BX],byte ptr 0;Сравним с 0
jeexit
movAL,[BX];Символ
movDI, BX;Сохраняем адрес строки в DI
movCX,1
int10h
movBX, DI;Восстанавливаем адрес строки из DI
incBX
jmpcycl
exit:
popBX
popDI
popAX
ret
PrintStrendp
;--------------------------------------- -----------------------
; Перевод строки
;--------------------------------------- -----------------------
CRLFproc;Процедура перевода строки
pushBX
leaBX, MesCRLF
callPrintStr
popBX
ret
CRLFendp
mainendp
ressize=$-main;Размер в байтах резидентной части
;--------------------------------------- ------------------------
; процедура инициализации
;--------------------------------------- ------------------------
initproc
callCmdLine;вызов процедуры обработки параметров
;Проверим установлена ли данная программа
movAH,0C8h;Наша функция прерывания 2Fh
movAL,00;Подфункция проверки установки
int2Dh
cmpAl,0FFh
jneNotInstalled;Программа не установлена.
jmpInstalled;Программа установлена.
;При наличии флага ее можно выгрузить
NotInstalled:
cmpUnloadFlag, 1;Если вызвана с параметрами - неверно
jneLoaded
Loaded:
;Действия по установке программы в памяти
callSaveOldVectors
callSetNewVectors
leaBX, MesLoaded
callPrintStr
;Оставим программу резидентной
movDX,(ressize+10Fh)/16;Размер в параграфах
movAX, 3100h;функция завершить и оставить в памяти
int21h
installed:
cmpUnloadFlag,1;Запрос на выгузку установлен?
jeunload;Да, не выгрузку
mov ax,4c01h ;Завешим программу обычным образом
int 21h;код завершения = 1
unload:
callCheckOther
;Прервем резидентную копию программы
movAH,0C8h;Наша функция прерывания 2Fh
movAL,01h;Подфункция прерывания
int2Dh
leaBX,MesUnloaded
callPrintStr
;Первая копия программы выгружена. Завершим и эту.
mov ax,4c00h;Завешим программу обычным образом
int 21h;код завершения = 0
initendp
;--------------------------------------- ---------------------
;
;--------------------------------------- ---------------------
CheckOtherproc
;Сохраним вектор мультиплексного прерывания 2Dh
movAH,35h;Функция получения вектора
movAL,2Dh;Номер вектора
int21h
movword ptr temp_2Dh,BX ;Сохраним старое IP