Міністерство освіти і науки України
Кiровоградський Державний Технiчний Унiверситет
Факультет автоматики енергетики та програмування
Кафедра програмного забезпечення
Курсовая работа
з дисципліни
“ASM-86 ”
на тему:
"Контроль програм, які запускаються на даному комп'ютері"
Зміст
1. Вступ
2. Постановка задачі
3. Обґрунтування вибору методів розв’язку задачі
4. Алгоритм програми
5. Реалізація програми
6. Системні вимоги
7. Інструкція для користувача
8. Висновки
Використана література
Додаток
Лістинг програми
Тепер комп’ютери відіграють у житті людини все більшу та більш роль. Раніше, коли ще не було комп’ютерів, чи вони були мало розповсюдженні, все робилося вручну. Коли комп’ютери одержали широке розповсюдження, комп’ютер став допомагати людині, бо він може багато операцій робити набагато швидше, ніж людина.
Але в наш час комп’ютер використовується і як ігровий автомат, на якому можна грати в різні ігри. Тому програма, яка б дозволяла контролювати ті програми, які запускаються на комп’ютері, була б дуже корисною.
Розробити програму “Контроль програм, які запускались на даному комп’ютері" на мові програмування ASM-86.
Програма розміщується резидентно в пам'ятi, тож не заважатиме pоботi iнших пpогpам, з якими може працювати користувач.
Отже, необхідно написати програму, яка здійснює контроль програм, що запускалися на комп’ютері. При виборі алгоритму програми у мене не виникло варіантів. Тут все дуже просто. В int 21h є функція 4BH, яка запускає другі програми. Перепризначаємо цю функцію, та в процесі роботи цієї функції виділяємо ім’я, час та дату запуску програми, та записуємо цю інформацію до файлу. Також перевіряємо ім’я на присутність у стоповому файлі, і виходимо з функції, якщо ім’я присутнє в списку.
Алгоритм головної програми:
Перевірка на присутність програми в пам'яті.
Присутня, перехід на перевірку параметрів.
Не присутня, встановлення нового обробника переривання 21h, залишення резидента в пам’яті.
Перевірка параметрів на символи /r, /?, /s, /d.
Якщо є символи /r, то вигрузка резидента з пам’яті (звільнення пам’яті, відновлення старого обробника переривання 21h).
Якщо є символи /?, то вивід допомоги.
Якщо є символи /s, то інвертування прапорцю зупинки (чи буде перевіряться ім’я на присутність в стоповому файлі).
Якщо є символи /d, то вилучаємо файл, в якому записується інформація про програми, які запускаються на комп’ютері.
Закінчити програму.
Алгоритм обробника переривання 21h:
Перевірка на функцію перевірки на присутність.
Перевірка на функцію 4Bh.
Якщо потрібно, перевірка на те, чи потрібно запускати дану програму.
Аналізується та записується інформація про дану програму в файл.
Виклик старого обробника переривання 21h.
Вихід з обробника.
Програма написана на мові ASM-86 з використанням команд процесора 86/286. Вона складається з головної програми, яка перевіряє параметри, які задані в командному рядку, та функції-обробника переривання 21h, який й контролює програми, які запускалися.
Перевага написаної мною програми-резидента в тому, що вона залишається постійно в пам’яті, завдяки чому користувач не помічає контролю.
Програма компілюється Turbo Assembler, зв’язується за допомогою TLINK.
IBM сумісний комп’ютер із мікропроцесором Intel 80086 або старшим.
Операційна система - ДОС
Пам’ять - 640 К і вище
Для запуску резидентної програми, яка здійснює контроль програм, які запускалися на комп’ютері, потрібно в командному рядку набрати kontrol.com та натиснути Enter. Також в командному рядку можна задавати параметри:
“/R" - вигрузити програму з пам’яті.
“/? ” - виводе допомогу.
“/D" - вилучення файлу зберігання програм, що запускалися.
“/S" - Інвертування стопового прапору.
Програма запам’ятовує імена, дату та час запуску всіх програм, які запускалися на комп’ютері, в файлі, який знаходиться в кореневому каталозі диску С з ім’ям history. asm. Також програма дозволяє задавати імена тих файлів, які не потрібно давати запускати. Ці імена задаються в файлі stop. asm в кореневому каталозі диску С.
Отже, на мові ASM-86 створено програму, яка виконує контроль програм, що запускалися на комп’ютері.
1) “Програмування на мові Асемблера ЕС ЕВМ" З.С. Брич,В.I. Воющ Москва 1989 р. ст. 166
2) “Програмування на сучасних мовах програмування. ” Москва 1990 р. ст. 206
3) “Основи мови” Асемблер” В.I. Криволап. Москва 1997р. ст.309
4) “Ассемблер для початкiвцiв” М.П. Шукiн. Київ 1980р. ст.155
5) “Турбо Асемблер” Л.В. Захаров. Харків 1995 р ст.178
6) “Макро Асемблер” К.С. Кропiйко, О.Д. Богатирова. Київ - “Наука” 1991 р.
7) Електронний довідник BOOK.
jumps;
locals;
Leng EQU 0080h; Смещение байтов с длиной строки параметр.
Parametr EQU 0081h; Смещение параметров
model tiny; Модель памяти TINY - крошечная.
code; Начало сегмента кода.
org 100h; Установка точки входа.
start:; Метка с которой начинается программа
jmp init; Переход на установки.
old dw 0,0; Указатели на старые вектора прерываний.
string db 100 dup (0); Имя запускаемой программы
string1 db 100 dup (0); Имя запускаемой программы
comp db 0; флаг сравнения
err1 db 0; флаг ошибки
str1 db 0; буфер файла
stop1 db 0; проверять ли сравнение
lf db 13,10; сиволы перехода на новую строчку
nam db 'c: \history. asm',0; Имя файла, в котором будем сохранять
nam1 db 'c: \stop. asm',0; Имя файла, с запрещенными программами
len dw 0; длина строки с именем программы
OutFile dw 0; Номер канала файла
OutFile1 dw 0; Номер канала файла
tim db 25 dup (' '); Время и дата
new21 proc
; - ---------------------------------------------------------------------------¬
; ¦New21 - Процедура обработки 21h прерывания ¦
; L----------------------------------------------------------------------------
cmp ax,9090h; проверяем, если AX<>9090h
jnz q1; то переходим на продолжение обработки
mov ax,12h; иначе возвращаем AX=12h
iret; Выходим из прерывания
q1:
cmp ah,4bh; проверяем, если AH=4bh
je @@1; то переходим на продолжение обработки
jmp exit; иначе переходим на выход
@@1:
push ax bx cx dx ds si DI ES; сохраняем все используемые регистры в стеке
push dx; - ¬заносим в регистр SI сегмент, в котором
pop si; - содержится имя запускаемой программы
mov bx,0; обнуляем регистр BX
m1:
mov al,ds: [si+bx] ; =¬
mov cs: string [bx],al; ¦ копируем имя программы в переменную
inc bx; ¦ string
cmp al,0; =-
jnz m1
mov cs: len,bx; сохраняем длину строки
cmp cs: stop1,0; проверяем флаг проверки
jne noprov; надо проверять
call prov; если надо, то на проверку
noprov:; иначе не проверять
lea dx,cs: nam; адрес выходного файла
push cs
pop ds
call createFile; процедура создания файла
mov ah,40h; функция записи в файл
mov bx,cs: outfile; номер файла
mov cx,cs: len; длина буфера
lea dx,cs: string; адрес буфера
pushf
call dword ptr cs: old; вызываем функцию записи в файл
mov ah,02h; функция чтения текущего времени
int 1ah; прерывание работы с часами реального времени
mov ah,ch; - ¬
mov al,ch; ¦
and ah,11110000b; ¦выделяем цифры часов
and al,1111b; ¦
shr ah,4; ¦
add ah,48; ¦
add al,48; - -
mov tim [2],ah; - ¬сохраняем часы
mov tim [3],al; - -
mov tim [4],': '; ставим двоеточие
mov ah,cl; - ¬
mov al,cl; ¦
and ah,11110000b; ¦выделяем цифры минут
and al,1111b; ¦
shr ah,4; ¦
add ah,48; ¦
add al,48; - -
mov tim [5],ah; - ¬сохраняем минуты
mov tim [6],al; - -
mov tim [7],': '; ставим двоеточие
mov ah,dh; - ¬
mov al,dh; ¦
and ah,11110000b; ¦выделяем цифры секунд
and al,1111b; ¦
shr ah,4; ¦
add ah,48; ¦
add al,48; - -
mov tim [8],ah; - ¬сохраняем секунды
mov tim [9],al; - -
mov ah,04h; функция чтения текущей даты
int 1ah; прерывание работы с часами реального времени
mov ah,dl; - ¬
mov al,dl; ¦
and ah,11110000b; ¦выделяем цифры дня
and al,1111b; ¦
shr ah,4; ¦
add ah,48; ¦
add al,48; - -
mov tim [12],ah; - ¬сохраняем день
mov tim [13],al; - -
mov tim [14],': ';
mov ah,dh; - ¬
mov al,dh; ¦
and ah,11110000b; ¦выделяем цифры месяца
and al,1111b; ¦
shr ah,4; ¦
add ah,48; ¦
add al,48; - -
mov tim [15],ah; - ¬сохраняем месяц
mov tim [16],al; - -
mov tim [17],': '; ставим двоеточие
mov ah,ch; - ¬
mov al,ch; ¦
and ah,11110000b; ¦выделяем цифры века
and al,1111b; ¦
shr ah,4; ¦
add ah,48; ¦
add al,48; - -
mov tim [18],ah; - ¬сохраняем век
mov tim [19],al; - -
mov ah,cl; - ¬
mov al,cl; ¦
and ah,11110000b; ¦выделяем цифры года
and al,1111b; ¦
shr ah,4; ¦
add ah,48; ¦
add al,48; - -
mov tim [20],ah; - ¬сохраняем год
mov tim [21],al; - -
mov ah,40h; Функция вывода в файл
mov bx,cs: outfile; номер файла
mov cx,25; количество выводимых символов=25 (время и дата)
lea dx,cs: tim; адрес выводимой строки
pushf; сохраняем регистр флагов в стеке
call dword ptr cs: old; вызываем старый обработчик прерывания
mov ah,40h; =¬
mov bx,cs: outfile; ¦
mov cx,2; ¦ переход в файле на следующую строку
lea dx,cs: lf; ¦
pushf; ¦
call dword ptr cs: old; =-
mov ah,3eh; Функция закрытия файла
mov bx,cs: outfile; номер файла
pushf; сохраняем регистр флагов в стеке
call dword ptr cs: old; вызываем старый обработчик прерывания
lea di,cs: string; =¬
push cs; ¦
pop es; ¦ обнуляем строку
mov cx,100; ¦
mov al,0; ¦
rep stosb; =-
pop ES DI si ds dx cx bx ax; восстанавливаем регистры из стека
cmp cs: stop1,0; надо ли проверять
jne exit; если ненадо то на старый обработчик
cmp cs: comp,1; иначе проверяем на совпадение
je exxit; если совпадает то на eexit
exit:
jmp dword ptr cs: old; переходим на старый обработчик
exxit:
iret; выход из обработчика
new21 endp; конец обработчика прерывания
CreateFile Proc
; - ---------------------------------------------------------------------------¬
; ¦CreateFile - процедура создания выходного файла, перед этим проверяется есть¦
; ¦ли он уже на диске. Если есть, то он открывается и позиционируется на конец¦
; ¦Вход DS: DX=имя файла ¦
; ¦Выход cf=0 операция прошла успешно ¦ ¦
; L----------------------------------------------------------------------------
mov al,1; Разрешаем только запись
mov ah,3dh; Функция DOS открытия файла