Вектор переривання та процедура обслуговування переривання  h2>
 Контрольна робота з
дисципліни "Програмне забезпечення автоматизованих систем"  p>
 Виконав ст. гр. КНЗ-21
Босак Андрій Олексійович  p>
 Луцький інститут розвитку
людини Відкритого міжнародного університету розвитку людини "Україна".  p>
 Луцьк 2005.  p>
 Звернення
до функцій DOS і BIOS здійснюється за допомогою програмних
переривання (команда ІNT).  p>
 Система
переривання машин типу IBM PC у принципі не відрізняється від будь-якої
іншої системи векторізованіх переривання. Самий початок оперативної
пам'яті від адреси 0000h до 03FFh відводиться під вектори
переривання - чотірьохбайтові області, в яких зберігаються адреси програм
обробки переривання (ПОП). У два старші байти кожного вектора записується
сегментна адреса ПОП, в два молодші - відносна адреса точки входу в
ПОП в сегменті. Вектори, як і відповідні їм переривання, мають
номери, які називаються типами, причому вектор з номером 0 (вектор
типу 0) розташовується починаючи з адреси 0, вектор типу 1-з
адреси 4, вектор типу 2 - з адреси 8 і т.д. Вектор з номером N
займає, таким чином, байти пам'яті від N * 4 до N * 4 +2. Всього у
виділеній під вектори області пам'яті поміщається 256 векторів.  p>
 Одержавши
сигнал на виконання процедури переривання з певним номером, процесор
зберігає в стеку виконуваної програми слово прапорів, а також
сегментно і відносну адресу програмного сегменту (вміст CS і IP) і
завантажує CS і IP з відповідного вектора переривання, здійснюючи тим самим
перехід на ПОП (рис 1).  p>
  p>
  p>
 Програма обробки
переривання зазвичай закінчується командою повернення з переривання IRET,
що виконує зворотні дії - завантаження IP, CS і регістра прапорів із
стека, що приводить до повернення в основну програму в точку, де вона
була перервана.  p>
 Запити на
виконання процедури переривання можуть мати різну природу.
Перш за все розрізняють апаратні переривання від периферійних
пристроїв або інших компонентів системи і програмні переривання, що
викликаються командою INT, яка використовується, зокрема, для програмного
звернення до функцій DOS і BIOS. Сигнали, що збуджують апаратні
переривання, можуть ініціюватися ланцюгами самого процесора,
наприклад, при спробі виконання операції ділення на нуль (такі переривання
називаються внутрішніми, або відмовами), а можуть приходити з
периферійного устаткування (зовнішні переривання). Незалежно від
джерела, процедура переривання, описана вище, завжди
виконується однаково, як для апаратних, так і для програмних
переривання.  p>
 Велика
частина векторів переривання зарезервована для виконання визначених дій;
частина з них автоматично заповнюється адресами системних програм при
завантаженні системи. Вектори з наступними номерами можуть представляти
особливий інтерес для користувача:  p>
 00h --
ділення на 0;  p>
 0lh --
покрокового виконання (при TF = 1);  p>
 02h --
немасковане переривання (виведення NMI процесора)  p>
 03h --
команда INT без числового параметра;  p>
 04h - INTO
- Переривання по переповнення (ініціюється апаратно, але лише
за наявності в програмі команди INTO);  p>
 08h --
переривання від таймера (апаратне);  p>
 09h --
переривання від клавіатури (апаратне);  p>
 0Ah --
зарезервовано для підключення нестандартного пристрою
(апаратне);  p>
 0Bh --
другий послідовний порт COM2 (апаратне);  p>
 0Сh - перший
послідовний порт СОМ1 (апаратне);  p>
 0Dh --
жорсткий диск (апаратне); 0Eh - гнучкий диск (апаратне);  p>
 0Fh --
паралельний порт (принтер LPT1) (апаратне);  p>
 10h --
відеодрайвер BIOS;  p>
 13h --
драйвер BIOS диска;  p>
 16h --
драйвер BIOS клавіатури;  p>
 17h --
драйвер BIOS принтера;  p>
 1Bh --
обробник переривання по /;  p>
 1Ch - вхід в програму
BIOS обробки переривання від системного таймера (18,2 переривання в секунду);  p>
 1Dh --
адреси таблиці відеопараметрів, BIOS;  p>
 lEh --
адреса таблиці параметрів дискети, BIOS;  p>
 1Fh - адреси
другої половини таблиці шрифтів графічних режимів 4 ... 6,
BIOS;  p>
 21n --
диспетчер функцій DOS;  p>
 22h --
обробник завершення процесу, DOS;  p>
 23h --
обробник переривання по/C;  p>
 24h --
обробник переривання по критичній помилці;  p>
 25h --
абсолютне читання диска;  p>
 26h --
абсолютний запис на диск;  p>
 2Fh --
мультиплексний переривання DOS;  p>
 43h --
адреса таблиці шрифтів графічних режимів, BIOS;  p>
 60h ... 66h
- Переривання користувача;  p>
 67h --
драйвер додаткової пам'яті LIM EMS;  p>
 68h ... 6Fh
- Вільні вектори;  p>
 70h ... 7Fh - апаратні переривання
веденого контроллера машин типу AT;  p>
 78h ... 7Fh
- Вільні вектори;  p>
 Flh ... FFh
- Не використовуються.  P>
 Як видно з
таблиці, вектори переривання можна умовно розбити на наступні групи:  p>
 вектори
апаратних переривання (08h. .. 0Fh і 70h ... 77h);  p>
 драйвери
BIOS (10h, 13h, 16h і т.д.);  p>
 програми
DOS (21h, 22h, 23h і т.д.);  p>
 адреси
системних таблиць DOS або BIOS (1Dh, lEh, 43h і т.д.).
 p>
 Системні
програми, адреси яких зберігаються у векторах переривання, в
більшості своїй є всього лише диспетчерами, що відкривають доступ до великих
груп програм, що реалізують системні
функції. Так, відеодрайвер BIOS (векторl0h) включає програми зміни відеорежіму, управління курсором, задання колірної палітри, завантаження шрифтів і
багато інших. Особливо характерний в цьому відношенні вектор 21h, через який
здійснюється виклик практично всіх функцій DOS: введення з клавіатури і виведення
на екран, обслуговування файлів, каталогів
і дисків, управління пам'яттю і процесами, служби часу і т.д.  p>
 Звернення
з прикладної програми до системних функцій здійснюється одноманітно.
У регістр АН засілається номер функції (не слід плутати з типом переривання!),
в інші регістри - вихідні дані, необхідні для виконання конкретної
системної програми. Після цього виконується команда INT з числовим аргументом,
що вказуює тип (номер) переривання, наприклад, INT 21h.  p>
 Більшість
функцій DOS і багато функцій BIOS повертають в флазі
перенесення CF код завершення. Якщо функція виконала успішно CF = 0, у
разі ж будь-якої помилки CF = 1. У останньому випадку в одному
з регістрів (найчастіше в АХ) повертається ще і код помилки.
Таким чином, типова процедура звернення до системних засобів виглядає таким
чином:  p>
 mov АН, fun; fun - номер функції  p>
; Заповнення тих чи інших регістрів (AL, BX, ES,  p>
 ВР і ін.)  p>
; параметрами, необхідними для виконання  p>
 даної функції  p>
 ...  p>
 int 21h
; Перехід у MS-DOS  p>
 jc error  p>
; Продовження програми  p>
 ... p>
 error: cmp AX, 1; Аналіз коду завершення  p>
 je err1  p>
 cmp AX2  p>
 je err  p>
 ...  p>
 Аналогічно
викликаються і функції BIOS.  p>
 Задача на звуковий сигнал  h2>
 У найпростішому випадку в IBM PC для
генерації звуку використовується мікросхема інтегрального таймера 8253 або
8254. Ця мікросхема має три незалежні канали, кожний з яких може програмувати
для роботи в режимі поділювача частоти або генератора одиночних імпульсів.
Кожен канал містить 16-розрядний лічильник, в який записується значення
дільніка частоти або коефіцієнта перерахунку (залежно від режиму роботи). Кожен
канал має вхід частоти (clk) і вхід дозволу (gate). На вхід частоти всіх
каналів подається імпульсний сигнал частотою 1,19 Мгц. Канал 0 мікросхеми
таймера використовується для вироблення сигналу переривання по таймеру
(частотою 18,2 Гц). Канал 1 працює в режиму генерації одиночних імпульсів через
кожні 15 мкс. Цей сигнал використовується для регенерації динамічної пам'яті
ЕОМ.  p>
 Канал 2 мікросхеми початково програмується
для роботи в режимі дільніка частоти. Вихід каналу використовується для
генерації звуку через вбудований динамік. Для управління звуком
використовуються біти 0 і 1 системного порту В (мікросхема 8255). Біт 0
використовується для дозволу проходження сигналу на вихід каналу 2 таймера.
Сигнал з виходу каналу 2 подається на схему "І", на другий вхід який
подається сигнал біта 1 системного порту В. Цей сигнал може вирішувати або
забороняти проходження сигналу з виходу каналу 2 таймера, а при закритому
каналі 2 (бітом 0 порту В) сигнал біта 1 порту В може використовуватися для
безпосередньої генерації звуку в динаміку.  p>
 Адреса системного порту В - 61h, адреси
каналів таймера - 40h, 41h, 42h, 43h - для каналів 0, 1, 2 і регістра, що
управляє, відповідно. Нижче розглянуті приклади генерації звуку за допомогою
сигналу біта 1 системного порту В, а також за допомогою таймера. Розглянутий
випадок генерації звуку з використанням переривання.  p>
 Приклади генерації звуку  h2>
 Завдання 1. Написати програму, що видає
різні звуки при натисненні на клавіші '1 'і '2'. Для генерації звуку слід
використовувати сигнал біта 1 системного порту В. Вихід з програми повинен
здійснюватися за натиснення клавіші 'q'.  p>
 Assume CS: Code, DS: Code  p>
 Code SEGMENT  p>
 org
100h  p>
 frequency1 equ 300
; Затримка
переключення 1  p>
 frequency2 equ 500
; Затримка
переключення 2  p>
 number_cycles1 equ 1000
; Кількість циклів (трів.)  p>
 number_cycles2 equ 600
; Кількість циклів (трів.)  p>
 port_b
equ 61h; Адреса системного порту В  p>
 .286  p>
 Start proc near  p>
 mov
ax, cs  p>
 mov
ds, ax;
DS = CS  p>
 beg1: call kbin; Опитування клавіатури  p>
 cmp
al, '1 '; = '1'?  p>
 jnz
beg2; Ні  p>
 call ton1; Звук висоти 1  p>
 jmp beg1
; Перехід на початок циклу  p>
 beg2: cmp al, '2 '; = '2'?  p>
 jnz
beg3; Ні  p>
 call
ton2; Звук висоти 2  p>
 jmp
beg1;
Перехід на початок циклу  p>
 beg3: cmp al, 'q'; = 'q'?  p>
 jnz
beg1; Ні  p>
 int
20h; Вихід з програми  p>
 start endp  p>
 ton2 proc near;
Процедура генерації звука 2  p>
 mov dx, number_cycles2
; Тривалість 2  p>
 mov
di, frequency2; Затримка 2  p>
 jmp
ton0;
Перехід на
універсальну процедуру генерації звуку  p>
proc near; Процедура генерації звука 1  p>
 mov dx, number_cycles1; Тривалість 1  p>
 mov
di, frequency1; Затримка 1  p>
; Універсальна процедура генерації звуку  p>
; DX - кількість циклів, DI - затримка  p>
 ton0 proc near  p>
 cli
;
Заборона переривання  p>
 in al, port_b
; Чітанння стану системн. порту В  p>
 and al, 11111110b
 ; Відкл. динаміка від таймера  p>
 ton01:
or al, 00000010b; Включення динаміка  p>
 out port_b, al
; Запис в системний порт В  p>
 mov cx, di
; Лічильник циклу затримки  p>
 loop $
; Затримка  p>
;
Вимкнення звуку  p>
 and al, 11111101b
 ; Вимкнення динаміка  p>
 out port_b, al
; Запис в системний порт В  p>
 mov cx, di
; Лічильник циклу затримки  p>
 loop $
; Затримка  p>
 dec dx
; Декремент
лічильника кількість циклів  p>
 jnz ton01
; Перехід на початок нового періода  p>
 sti;
Дозвіл переривання  p>
 ret;
Вихід з процедури  p>
 ton0 endp;
Кінець універсальної процедури  p>
 ton1 endp;
Кінець процедури генерації звука 1  p>
 ton2
endp; Кінець процедури генерації звука 2  p>
 kbin
proc near; Введення з клавіатури з
очікуванням  p>
 mov ah, 0
; Функція 0  p>
 int 16h
; Клавіатурного переривання  p>
 ret;
Вихід з процедури  p>
 kbin endp;
Кінець процедури вводу з клавіатури  p>
 code
ends; Кінець сегмента (кодового)  p>
 END Start
; Вказівка на точку входу  p>
 Завдання 2. Написати програму, що видає
різні звуки при натисненні на клавіші '1 'і '2'. Для генерації звуку слід
використовувати вихід каналу 2 таймера. Вихід з програми повинен здійснюватися
по натиснення клавіші 'q'.  p>
 Assume CS: Code, DS: Code  p>
 Code SEGMENT  p>
 org
100h  p>
 frequency1 equ 1000; Коефіц. ділення 1  p>
 frequency2 equ 3000; Коефіц. ділення 2  p>
 duration equ 50000; Тривалість  p>
 port_b
equ 61h
; Адреса системного порту В  p>
 .286  p>
 Start
proc near;
Основна процедура  p>
 mov ax, cs  p>
 mov ds, ax; DS = CS  p>
 beg1:
call kbin; Опитування клавіатури  p>
 cmp al, '1 '; = '1'?  p>
 jnz
beg2; Ні  p>
 call ton1;
Звук висоти 1  p>
 jmp beg1
; Перехід на початок циклу  p>
 beg2: cmp al, '2 ';
= '2 '?  P>
 jnz
beg3; Ні  p>
 call
ton2; Звук висоти 2  p>
 jmp
beg1;
Перехід на початок циклу  p>
 beg3: cmp al, 'q';
= 'Q'?  P>
 jnz
beg1; Ні  p>
 int
20h; Вихід з
програми  p>
 start endp;
Кінець основної процедури  p>
 ton2 proc near;
Процедура генерації звука 2  p>
 mov dx, duration;
Тривалість  p>
 mov di, frequency2; Коефіцієнт ділення 2  p>
 jmp
ton0;
Перехід на універсальну процедуру  p>
 ton1
proc near;
Процедура генерації звука 1  p>
 mov dx, duration
; Тривалість  p>
 mov di, frequency1
; Коефіцієнт ділення 2  p>
;
Універсальна процедура
генерації звуку  p>
;
DX - тривалість, DI - коефіц. ділення  p>
 ton0
proc near  p>
 cli;
Заборона переривання  p>
;
Включення динаміка і таймера  p>
 in al, 61h
; Читання стану системного
порту В  p>
 or al, 3
; Дозвіл звучання (біти 0 і 1)  p>
 out 61h, al
; Запис в системний порт В  p>
;
Програмування поділювача частоти 2 канали  p>
 mov ax, di
; Поділювач частоти  p>
 out 42h, al
; Мол.байт частоти