Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SP2_2.rtf
Скачиваний:
7
Добавлен:
12.08.2019
Размер:
467.98 Кб
Скачать

2. 3. Завдання до лабораторної роботи №3

СТВОРЕННЯ ВЛАСНИХ ПЕРЕРИВАНЬ”

Управління перериваннями

Переривання – це готові процедури, які викликаються комп’ютером для виконання певної задачi.

Існують апаратні та програмні переривання. Апаратні переривання iнiціюються апаратурою та можуть бути викликані сигналом мікросхеми таймера, сигналом від принтера, натисненням клавіши на клавiатурі та багатьма іншими причинами. Апаратні переривання не координуються з роботою програмного забезпечення. Коли викликається переривання, процесор зупиняє свою роботу, здійснює переривання, а потім повертається на попереднє місце. Для того, щоб мати можливість повернутись точно у потрібне місце програми, адреса цього мiсця (CS:IP) запам‘ятовується на стеку разом з регістром прапорцiв. Потім у CS:IP завантажується адреса пpограми обробки переривання та їй (програмі) передається управлiння.

Програми обробки переривань іноді називають драйверами переривань. Вони завжди закінчуються інструкцією IRET (повернення з переривання), яка завершує процес, розпочатий перериванням, повертаючи старі значення CS:IP та регістру прапорців, тим самим даючи програмі можливість продовжити виконання з того ж стану.

З іншого боку, програмні переривання насправді нічого не переривають. Це звичайні процедури, які викликаються вашими програмами для виконання рутинної роботи, такої, як обробка натиснення клавіши на клавіатурі або виведення на екран. Але ці підпрограми містяться не всередині вашої програми, а в операційній системі, і механізм переривань дає вам можливість звернутися до них. Програмні переривання можуть викликатись одне з одного. Наприклад, усі переривання обробки вводу з клавіатури використовують переривання обробки вводу з клавіатури для отримання символу з буфера клавіатури. Відзначимо, що апаратне переривання може отримати управління при виконанні програмного переривання. При цьому не виникає конфліктів, оскільки кожна підпрограма обробки переривання зберігає значення усіх регістрів, які нею використовуються, а потім відновлює їх при виході, тим самим не залишаючи слідів того, що вона займала процесор.

Адреси програм переривань називають векторами. Кожний вектор має довжину 4 байти. В першому слові зберігається значення IP, а в другому – CS. Молодші 1024 байти пам‘яті містять вектори переривань, таким чином, є місце для 256 векторів. Разом узяті, вони називаються таблицею векторів. Вектор для переривання 0 починається з комірки 0000:0000, для переривання 1 – з комірки 0000:0004, 2 – з 0000:0008 і так далі. Якщо ви глянете на 4 байти, починаючи з адреси 0000:0020, де міститься вектор переривання 8H (переривання часу доби), то ви знайдете там A5FE00F0. Маючи на увазі, що молодший байт слова розташований спочатку і що порядок – IP: CS, дане 4 – байтове значення переводиться у F000:FEA5. Це стартова адреса програми ПЗП, яка здійснює переривання 8H.

Написання власного переривання

Існує декілька причин для написання власного переривання. По-перше, більшість з готових переривань, які забезпечуються операційною системою, є нічим іншим, як звичайними процедурами, доступними для всіх програм, і ви можете побажати додати своє до цієї бібліотеки.

По – друге, причиною написання переривання може бути використання будь – якого окремого апаратного переривання. Це переривання автоматично викликається при виникненні певних умов. У деяких випадках BIOS ініціалізує вектор цього переривання таким чином, що він указує на процедуру, яка взагалі нічого не робить (вона містить один оператор IRET). Ви можете написати свою процедуру та змінити вектор переривань, щоб він указував на неї. Тоді при виникненні апаратного переривання буде виконуватись ваша процедура. Нарешті, ви можете захотіти написати переривання, яке повністю замінить одну з процедур операційної системи і яке пристосоване до ваших програмних потреб.

Функція 25H переривання 21H встановлює вектор переривання на вказану адресу. Адреси мають розмір у два слова. Старше слово містить значення сегменту (CS), молодше містить зміщення (IP). Щоб встановити вектор, який вказує на одну з ваших процедур, треба помістити сегмент процедури у DS, а зміщення – у DX. Потім треба помістити номер переривання у AL та викликати функцію. Будь – яка процедура переривання повинна завершуватись не звичайною інструкцією RET, а IRET. IRET виштовхує зі стеку три слова, включаючи регістр прапорців, у той час як RET поміщає у стек тільки два. У разі спроби тестування такої процедури як звичайної процедури, яка закінчується IRET, то буде вичерпано стек. Зазначимо, що функція 25H автоматично забороняє апаратні переривання в процесі зміни вектора, тому не існує небезпеки, що посеред дороги станеться апаратне переривання, яке використовує даний вектор.

Коли програма завершується, мають бути відновлені оригінальні вектори переривань. У противному випадку наступна програма може викликати дане переривання і передати управління на те місце у пам’яті, в якому вашої процедури вже нема. Функція 35H переривання 21H повертає поточне значення вектора переривання і поміщує значення сегменту до ES, а зміщення – до BX. Перед установкою свого переривання отримайте поточне значення вектора, використовуючи цю функцію, порівняйте ці значення і потім відновіть їх за допомогою функції 25H перед завершенням своєї програми.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]