Вектор переривання та процедура обслуговування переривання 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>
Програма обробки
переривання зазвичай закінчується командою повернення з переривання 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
; Мол.байт частоти