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