Вектор переривань та процедура обслуговування переривань

Контрольна робота з дисципл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 - обробник переривань по /C;

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/


A bridge to understanding


A country across the channel


A Farewell to Arms