Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга. Гуржій. 1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
3.53 Mб
Скачать

Install proc near

;==[ Перевірка наявності параметрів у командному рядку ]=

mov si, 80h ; зміщення в PSP байта

;кількості символів у ; командному рядку

стр В ds:[si], 0 ;перевірка цього байта на "О"

jnz ScanCommandString ;якщо є параметри, то

;перехід за позначкою ;Якщо параметр не вказано ;або вказано неправильно, ;то BadParam:

BadParam:

mov dx, & Help ;вказати адресу рядка

jmp ; повідомлення

ExitWithMessage ;перехід на помилкове ; завершення

ScanCommandString:

;===[ Аналіз параметрів командного рядка ]====

inc si

inc si ;покажчик зміщення в PSP

;встановити на 82 байти

mov al, '/' ;в al занести код символу '/'

mov ah, `r` ;в ah занести код символу Y

cmp ds:[si],ax ;якщо символ 'г'

jz Reload ;то перейти на

;вивантаження програми

;з пам'яті

mov ah, `i` ;в ah занести код

;символу 'і'

cmp ds:[si], ax ;якщо символ 'і'

jz CheckDoublelnstall ;то перейти на перевірку

;подвійного завантаження

jmp short BadParam

;=========[ Вивантаження з пам'яті ]===========

Reload:

;...чи є програма в пам'яті?

mov ax, 0

mov ds, ax ;встановити базу адреси

mov bx, 09h*4 ;таблиці векторів

;переривання та зміщення

cmp W [bx], & INT09 ;порівняти зміщення

;нашого оброблювача з

;тим, що записано в ; таблиці

jz CloseResident ;якщо резидент у пам'яті,

;перехід на вивантаження,

;...програми в пам'яті

;немає (немає чого

; вивантажувати)

mov dx, & MesNotlnstall ;вказати адресу рядка з

; повідомленням

jmp ExitWithMessage ;перехід на помилкове

; завершення

CloseResident:

;...відновлення СТАРОГО вектора

сlі ;на момент відновлення

;векторів переривання

; забороняється

mov ax, [Ьх+2] ;знаходимо адресу

;сегмента, в якому наш

;резидент

mov es, ax mov ax, W es:OLD09 ; читаємо зі змінної

;старий вектор та записуємо

mov [bx], ax mov ax, W es:OLD09+2 mov [bx+2], ax ;в таблицю на своє "рідне"; місце

sti дозвіл переривань

;...звільнення пам'яті, що

;зайнята резидентним кодом

mov ah, 49h використовуємо функцію

;49h int 21h

int 21h

;...друк повідомлення про

; вивантаження програми

mov dx, & MesReload ;адреси рядка з

; повідомленням

jmp ExitWithMessage ;перехід на помилкове

; завершення

CheckDoublelnstall:

;=====[ Перевірка на повторне завантаження ]=======

mov ax, 0

mov ds, ax

mov bx, 09h*4

mov ax, & INT09

cmp [bx], ax ;якщо програми в пам'яті

;немає, то

jnz SetVectorlnterrupt ;перейти на встановлення,

;нового вектора

;програма в пам'яті вже є

mov dx, & MesDoublelnst ;адреса рядка з

;повідомленням

mp ExitWithMessage ;перехід на помилкове

; завершення

SetVectorlnterrupt: ;========[ Встановлення 09-го вектора ]==========

;==============[ Adress 09h ]================

cli

push ds

mov ax, 0

mov ds, ax

mov si, 09h * 4

;—[Зберігаємо старий вектор у змінній OLD09]—

mov ax, [si]

mov W cs:OLD09, ax

mov ax, [si+2]

mov W cs:OLD09+2, ax

;—[Записуємо новий вектор ]—

mov ax, & INT09

mov [si], ax

mov [si+2], cs

pop ds

sti

;[ Друк про нормальне завантаження до пам'яті]

push cs

pop ds

mov ah, 9

mov dx, & Meslnstall

int 21h

;[ завершитись і залишитись резидентно ]

mov dx, & EndlSR

shr dx, 4

add dx, 3

mov ah, 31h Sti

int 21h

ExitWithMessage:

;[ Помилкове завершення ] push cs pop ds mov ah, 09h int 21h int 20h

ENDP

CSEG ENDS END Start

2. За текстом програми нарисуйте схему алгоритму.

3. На вінчестері створіть каталог РКР.

4. За допомогою редактора середовища програмування Borland C++ V3.01 створіть символьний файл тексту вивченої Вами програми та запишіть його до каталогу РКР.

5. Виконайте настройку програми та запустіть її на виконання (у командному рядку наберіть tasm rezident. asm; після трансляції — tlink rezident. obj /t).

6. Зробіть висновки про Ваш експеримент з дослід­ження резидентних програм.

Вправа 2

1. Спробуйте розробити пропозиції по доробці програми та її використанні для заборони несанкціонованого доступу до різних апаратних ресурсів ПЕОМ (блокування клавіа-

тури, НГМД, відеотерміналу, сітьової карти, співпроцесора, портів вводу/виводу).

2. Виконайте пункти 3-6 Вправи 1.

Питання для самоконтролю знань

1. Які існують способи організації програм оброблю­вачів переривання?

2. Назвіть відмінні особливості заміщуючих оброблю­вачів переривання.

3. Назвіть відмінні особливості оброблювачів перери­вання, що перехоплюють вектори переривання.

4. Які основні фази можна виділити в будь-якому оброблювачі апаратних переривань?

5. Розкажіть про призначення та характеристику фази ініціалізації оброблювача апаратного переривання.

6. Розберіть приклад фрагмента програми фази ініці­алізації оброблювача апаратного переривання та прокомен­туйте всі його оператори.

7. Розкажіть про призначення та характеристику фази активізації оброблювача апаратного переривання.

8. Розберіть приклад фрагмента програми фази акти­візації оброблювача апаратного переривання та проко­ментуйте всі його оператори.

9. Розкажіть про призначення та характеристику фази виходу з оброблювача апаратного переривання.

10. Розберіть приклад фрагмента програми фази вихо­ду з оброблювача апаратного переривання та прокоментуй­те всі його оператори.

Резюме

За способом організації програми оброблювачі перери­вання поділяються на два альтернативні типи: заміщуючі та перехоплюючі вектори переривання.

Заміщуючі оброблювачі мають на увазі заміну існую­чого вектора без його збереження та відновлення після виконання заміщуючої програми.

Більшість оброблювачів переривання побудовано за принципом перехоплювання переривання з наступним його поверненням, при цьому оброблювач зберігає значення перехопленого оригінального вектора та після завершення своєї роботи відновлює перервану програму.

Існують певні прийоми організації програм оброблю­вачів переривань. Практично в будь-якому оброблювачі можна виділити такі основні розділи: ініціалізація оброб­лювача, активізація оброблювача, обробка переривання та вихід із оброблювача.

Задачею фази ініціалізації є забезпечення коректного завантаження оброблювача з точки зору DOS та програм, що знаходяться в пам'яті одночасно з оброблювачем, прив'язку оброблювача до певних векторів переривань та інсталяцію його в якості резидента.

Активізація обробки переривання передбачає передачу керування програмі оброблювача переривання. При вході в програму обслуговування переривання ті регістри, які використовуються разом основною програмою та оброблю­вачем, повинні бути збережені.

Після виконання обробки переривання повернення до основної програми здійснюється за допомогою команди IRET. Ця команда «виштовхне» зі стеку попередні до переривання значення покажчика команди, сегмента коду та регістра прапорців. У результаті виконання основна програма відновиться з того місця, де вона була перервана.

Більш детально з прикладами освітлене питання роз­робки резидентних програм в /14, с. 31-119/.

Ваш наступний крок

У цьому занятті Ви ознайомились з основними принципами розробки структури програм, заміщуючих та перехоплюючих вектори переривання, що гарантують коректне збереження та відновлення обчислювального середовища до та після перехоплювання апаратного пере­ривання. Але практика програмування показує, що не існує єдиного розв'язання при написанні конкретного оброблювача переривання. Тому розглянемо та розберемо кілька прикладів використання апаратних переривань, що допоможе Вам розробляти навіть найскладніші оброблювачі переривання, в чому Ви впевнитесь у нашому наступному занятті.