
- •Передмова
- •Intel 430lx
- •Intel 430nx
- •Intel 430fx
- •Intel 430hx
- •Intel 430vx
- •Intel 430tx
- •Intel 450gx/kx
- •Intel 440fx
- •Intel 440lx agPset
- •Intel 440ex
- •Intel 440bx agPset
- •Заняття 1. Поняття про систему переривання пеом
- •Принципи організації системи переривання програм
- •Слово стану процесора (програми)
- •Характеристики системи переривання
- •Організація переходу до перериваючої програми та пріоритетне обслуговування запитів переривання
- •Процедура переривання з опитуванням джерел (прапорців) переривання
- •Програмно-керований пріоритет перериваючих програм
- •Методи використання механізму переривань
- •Класи переривань пеом
- •Призначення контролера апаратних переривань пеом
- •Опис основних елементів і8259а
- •Стани програмованого контролера переривань
- •Заняття 5. Керування режимами роботи пкп
- •Void main (void){
- •Int mask;
- •Заняття 6. Керування пріоритетами переривань
- •Install proc near
- •Заняття 8. Особливості практичного використання апаратних та програмних переривань
- •Volatile long ticks;
- •Void main(void) {
- •Void _interrupt _far timer(void) {
- •Int8 proc near cli
- •Int09 proc near
- •Розділ 3. Підсистема таймера та годинника реального часу
- •Заняття 3. Системні засоби програмного доступу до ресурсів таймера
- •Void tm_delay(int ticks) {
- •Void main (void){
- •Void main(void){
- •Заняття 4. Приклади використання функціональних можливостей таймера в прикладних задачах
- •Void main(void){ int Frac; char k;
- •Void tm_sound(int freq, int time) {
- •Void tm_delay(int ticks) {
- •Void tm_sound(int freq, int time){
- •Void main(){
- •Void main() { int I,j; clrscr();
- •Заняття 5. Архітектура та принципи функціонування годинника реального часу
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/.
Ваш наступний крок
У цьому занятті Ви ознайомились з основними принципами розробки структури програм, заміщуючих та перехоплюючих вектори переривання, що гарантують коректне збереження та відновлення обчислювального середовища до та після перехоплювання апаратного переривання. Але практика програмування показує, що не існує єдиного розв'язання при написанні конкретного оброблювача переривання. Тому розглянемо та розберемо кілька прикладів використання апаратних переривань, що допоможе Вам розробляти навіть найскладніші оброблювачі переривання, в чому Ви впевнитесь у нашому наступному занятті.