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