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

Контрольна робота з дисципліни „Програмне забезпечення автоматизованих систем”

Виконав ст. гр. КНз-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 - обробник переривань по /C;

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,11111110b ; Відкл. динаміка від таймера

ton01: or           al,00000010b ; Включення динаміка

  out       port_b,al                     ; Запис в системний порт В

  mov     cx,di                           ; Лічильник циклу затримки

  loop     $          ; Затримка

; Вимкнення звука

  and      al,11111101b ; Вимкнення динаміка

  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      50000 ; Тривалість

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.

Пирогов В. Ю. «Ассемблер. Учебный курс».

В контрольній роботі також використовувались матеріали сайту http://www.BankReferatov.ru ,перекладені на українську мову.  

Подобные работы:

Актуально: