Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга. Гуржій. 1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
3.53 Mб
Скачать

Заняття 6. Керування пріоритетами переривань

Тема заняття

Способи зміни дисциплін обслуговування переривань.

Керування пріоритетами переривань.

Мета заняття

Усвідомити функціональні можливості ПКП по керуванню пріоритетами переривань.

Отримати уявлення про можливі розподілення пріоритетів при їх ротації.

Засвоїти поняття автоматичної ротації при рівних пріоритетах.

Вивчити спосіб ротації в автоматичному режимі ЕОІ.

Вивчити спосіб спеціальної ротації пріоритетів.

Навчитись формувати команди встановлення пріоритету.

Навчитись виконувати ротацію пріоритетів за спеціальною командою ЕОІ.

Керування пріоритетами переривань

Для керування пріоритетами переривань в І8259А є багато команд і режимів. Всі їх можна запрограмувати, тобто можна змінити динамічно. Ці режими та команди забезпечують для користувача практично необмежені можливості в галузі прикладних програм, керованих за перериваннями.

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

Усі можливі варіанти статусів наведені в табл. 2.3.

Вхід мікросхеми

Статус

рівня пріоритету

IRQ0

76 543210

IRQ1

07654321

IRQ2

10765432

IRQ3

21076543

IRQ4

32107654

IRQ5

43210765

IRQ6

54321076

IRQ7

65432107

Автоматична ротація, рівні пріоритети

Автоматична ротація пріоритетів використову­ється в тих випадках, коли перериваючі пристрої (наприклад, канали зв'язку) мають рівні пріоритети. Ідея полягає в тому, що коли який-небудь пристрій уже обслуговується, інші пристрої повинні отримати можливість обслуговування перед наступним обслуговуванням даного пристрою. Для цього обслуженому пристрою автоматично присвоюється нижчий пріоритет. Отже, в гіршому випадку, цьому пристрою дове­деться чекати, поки будуть обслужені всі інші пристрої.

Існує два методи реалізації автоматичної ротації: у спо­лученні зі звичайною ЕОІ (ротація за звичайною командою ЕОІ) та з АЕОІ (ротація в автоматичному режимі ЕОІ).

У базовій конфігурації PC AT автоматична ротація пріоритетів не використовується.

Коли використовується ротація за командою ЕОІ, молодший розряд в ISR скидається, як і при звичайній ЕОІ, а відповідному IRQ присвоюється нижчий пріоритет. Пріоритети інших IRQ зсуваються згідно з режимом повного вкладення (див. рис. 2.10).

На рис. 2.15 наведено, як ротація за звичайною командою ЕОІ впливає на пріоритети перериван

Припустимо, що пріоритети IRQ0-IRQ7 розподілені від вищого пріоритету до нижчого. Обслуговуються переривання по IRQ6 та IRQ4, але жодне ще не завершено. Оскільки IRQ4 має вищий пріоритет, відповідна програма оброблювача обов'язково виконується. Під час виконання програми по IRQ4 здійснюється ротація за звичайною командою ЕОІ. При цьому скидається розряд 4 в ISR. Після цього IRQ4 отримує нижчий пріоритет, а вищий присво­юється IRQ5. У базовій конфігурації PC AT автоматична ротація за звичайною командою ЕОІ не використовується

Ротація в автоматичному режимі ЕОІ

Цей випадок нагадує тільки що розглянену ротацію за звичайною командою ЕОІ. Основна його відмінність полягає в тому, що ротація пріоритетів виконується авто­матично після другого імпульсу INTA підтвердження запи­ту переривання. Для входу в цей режим та виходу з нього передбачені відповідні команди: встановлення та скидан­ня тригера ротації по ЕОІ. Після цього, як і в звичайному автоматичному режимі ЕОІ, ніякі команди не потрібні. Але слід пам'ятати про основні умови використання автоматич­ного режиму ЕОІ будь-якої форми. Вказівка, наведена для автоматичного режиму ЕОІ, залишається в силі і для ротації в цьому режимі.

У базовій конфігурації PC AT ротація в автоматичному режимі ЕОІ не використовується Спеціальна ротація пріоритетів

Спеціальна ротація надає користувачу широкі можливості обробки з використанням переривань. Вона доцільна в тих випадках, коли необхідно змінювати пріори­тети переривань від окремих пристроїв. На відміну від автоматичної ротації спеціальна ротація повністю керується користувачем, тобто користувач сам вибирає розподілення пріоритетів між рівнями переривань. Це можна зробити під час виконання основної програми або сервісних програм. У користувача є дві команди спеціальної ротації: «Встановити пріоритет» та «Ротація за спеціальною командою ЕОІ». У базовій конфігурації PC AT спеціальна ротація пріоритетів не використовується.

Команда встановлення пріоритету

Команда встановлення пріоритету дозволяє програмісту присвоїти певному рівню IRQ нижчий пріоритет (дно пріоритетного кільця). Всі інші рівні отримують пріоритети згідно з режимом повного вкладення з урахуванням присвоєного нижчого пріоритету.

На рис. 2.16 наведено стан ISR та відносні пріоритети рівнів переривання до та після виконання команди вста­новлення пріоритету.

Виконуються три програми обслуговування переривань. Оскільки IRQ2 має вищий пріоритет, обов'язково виконується відповідна програма оброблювача. Під час виконання цієї програми пріоритети змінюються так, що вищий пріоритет отримує IRQ5. Для цього в І8259А просто відсилається команда встановлення пріоритету. В даному випадку ця команда призначає IRQ4 нижчий пріоритет. Хоча IRQ7 має тепер вищий пріоритет порівняно з IRQ2, він не буде підтверджений до завершення програми по IRQ2 (шляхом ЕОІ). Це пояснюється тим, що пріоритети визначаються тільки після запиту переривання або послідовності підтвердження переривання. Якщо в ході виконання програми по IRQ2 з'явиться запит з більш високим пріоритетом, то пріоритети будуть визначені і вищий пріоритет буде підтверджений. По закінченні виконання програми оброблювача переривань, в якій використовується команда встановлення пріоритету, повинна бути видана належна команда ЕОІ.

Звичайна команда ЕОІ не повинна використовуватись у тій програмі оброблювача, де є команда встановлення пріоритету. Це пояснюється тим, що звичайна команда ЕОІ скидає розряд ISR, що відповідає вищому пріоритету, який при використанні команди встановлення пріоритету не завжди відповідає останній програмі оброблювача. З іншого боку, автоматичний режим ЕОІ можна використовувати за командою встановлення пріоритету. Справа в тому, що в цьо­му випадку звичайна команда ЕОІ виконується до того, як може бути видана команда встановлення пріоритету. В біль­шості випадків, коли в сервісній програмі використовується команда встановлення пріоритету, найкраще застосовувати спеціальну команду ЕОІ. При цьому скидання в ISR конкрет­ного розряду завершуваної програми виключає плутанину.

У базовій конфігурації PC AT команда встановлення пріоритету не використовується.

Ротація за спеціальною командою ЕОІ Ротація за спеціальною командою ЕОІ є поєднан­ням команди встановлення пріоритету та спеціальної команди ЕОІ. Як і при команді встановлення пріоритету,

вказаному рівню IRQ присвоюється нижчий пріоритет. Як і при спеціальній команді ЕОІ, в ISR буде скинуто вказаний рівень. Таким чином, у режимі ротації за спеціальною командою ЕОІ об'єднуються функції двох команд. Цей ре­жим доцільний, коли не треба змінювати пріоритети IRQ до закінчення виконання програми по перериванню.

У базовій конфігурації PC AT ротація за спеціальною командою ЕОІ не використовується.

Практикум Лабораторна робота 2

Тема роботи

Вивчення та дослідження методів програмного задавання режимів роботи контролерів переривань.

Мета роботи

Зрозуміти та засвоїти призначення та способи використання керуючих слів та робочих наказів.

Вивчити потенційні можливості апаратного за­безпечення системи переривань.

Навчитись формувати структури керуючих слів та робочих наказів для різних режимів функціонування контролерів переривань.

Засвоїти послідовність дій при ініціалізації ПКП.

Навчитись створювати програмні модулі ініціа­ лізації ПКП.

Навчитись використовувати функціональні мож­ливості обладнання ПКП у прикладному програмуванні.

Вимоги

Для виконання роботи потрібні знання та навички програмування мовами СІ та Ассемблера, ґрунтовні знання архітектури та принципів функціонування програмованого контролера переривань, знання форматів керуючих слів ICW та робочих наказів OCW, навички програмного досту­пу до регістрів ПКП.

На вінчестері комп'ютера має бути встановлене сере­довище програмування Borland C++ V3.01 в каталозі ВС.

Вправа 1

  1. Дослідіть програму inicial. с, яка є типовою програмою ініціалізації контролерів переривання.

  2. За текстом програми нарисуйте схему алгоритму.

  3. На вінчестері створіть каталог РКР.

  4. За допомогою редактора середовища програмування Borland C++ V3.01 створіть символьний файл тексту вивченої Вами програми та запишіть його в каталог РКР.

  5. Виконайте настройку програми та запустіть її на виконання.

  6. Зробіть висновки про Ваш досвід з дослідження програмного керування режимами ПКП.

Вправа 2

  1. Спробуйте розробити пропозиції по доробці програми та її застосуванні для зміни дисциплін обслуговування переривань та вказання способів їх завершення.

  1. Виконайте пункти 3-6 Вправи 1.

//Типова демонстраційна програма ініціалізації //контролерів переривань inicial. c

#include <stdio.h> #include <conio.h> #include <dos.h> void main(void) {

int icwlm=0xl5,icw2m=0x08,icw3m=0x04, icw4m=

=0x01,mascm=0x00;

int icwls=0xl5,icw2s=0x70,icw3s=0x02,icw4s=

=0x01,mascs=0x00;

int ocwl,ocw2,ocw3, del=2500;

clrscr();

ргіntf("\n\Ініціалізація ведучого контролера (MASTER)"

"\n " );

delay(del);

printf("\n\nЗаписуємо шістнадцятковий код керуючого слова ICW1=15H"

"\nза адресою 20Н."); delay(del);

printf("\n\n3aписуємо шістнадцятковии код керуючого слова ICW2=08H"

"\nза адресою 21Н.»); delay(del);

printf("\n\n3aписуємо шістнадцятковии код керуючого слова ICW3=04H "

"\nза адресою 21Н."); delay(del);

printf("\n\n3aписуємо шістнадцятковии код керуючого слова ICW4=01H"

"\nза адресою 21Н."); delay(del);

ргіntf("\n\nСкидаємо маску в регістрі маскування каналів");

delay(del);

outp(0x20,icwlm); outp(0x21 ,icw2m); outp(0x21 ,icw3m); outp(0x21 ,icw4m); outp(0x21,mascm);

ргіnі£("\nІніціалізація ведучого контролера завершена!!!."

"\n ");

delay(del);

clrscr(); ргіпі^"\n\nІшціалізація веденого контролера (SLAVE)"

"\n ");

printf("\n\n3аписуємо шістнадцятковии код керуючого слова ICW1=15H"

"\nза адресою АОН."); delay(del);

printf("\n\n3аписуємо шістнадцятковии код керуючого слова ICW2=70H"

"\nза адресою А1Н."); delay(del);

printf("\n\n3aписуємо шістнадцятковии код керуючого слова ICW3=02H"

"\пза адресою А1Н."); delay(del);

printf("\n\n3писуємо шістнадцятковии код керуючого слова ICW4=01H"

"\nза адресою А1Н."); delay(del);

printf("\n\nСкидаємо маску в регістрі маскування каналів");

outp(0xa0,icwls); outp(0xa 1 ,icw2s); outp(0xa 1 ,icw3s); outp(0xa 1 ,icw4s); outp(0xa 1 ,mascs);

delay(del);

ргintf("\n\Ініціалізація системи переривань завершена"

d elay(del);

clrscr();

printf("\nTeпep можете ввести робочі накази 0CW для (MASTER)"

"\n ");

delay(del); while (1){

printf("\n\nXoчeтe вводити 0CW1 - ? (Y/N)"); if (getch()=='n') break;

printf("\n\nВедіть шістнадцятковий код робочого наказу 0CW1 - ");

scanf(«%x», &ocwl); outp(0x21,ocwl);

while (1){

printf("\n\nXoчeтe вводити 0CW2 - ? (Y/N)")-if (getch()=='n') break;

printf("\n\nBведіть шістнадцятковий код робочого наказу 0CW2 - ");

scanf("%x", &ocw2); outp(0x20,ocw2);

while (1){

printf( "\n\nХочете вводити 0CW3 - ? (Y/N)"); if (getch()==V) break;

printf("\n\nBведіть шістнадцятковий код робочого наказу OCW3 - ");

scanf("%x", &ocw3); outp(0x20,ocw3);

printf("\n\nTeпep можете ввести робочі накази OCW для (SLAVE)"

"\n ");

while (1){

printf("\n\nXчетe вводити 0CW1 - ? (Y/N)"); if (getch()==V) break;

printf( \n\nВведіть шістнадцятковий код робочого наказу 0CW1 - ");

scanf("%x", &ocwl); outp(Oxal,ocwl);

while (1){

printf("\n\nXoчeтe вводити 0CW2 - ? (Y/N)"); if (getch()==V) break;

ргіпі^"\n\nВведіть шістнадцятковий код робочого наказу 0CW2 - ");

scanf("%x", &ocw2); outp(0xa0,ocw2);

while (1){

printf("\n\nXoчeтe вводити 0CW3 - ? (Y/N)); if (getch()==V) break;

printf("\n\nBведіть шістнадцятковий код робочого наказу 0CW3 - ");

scanf("%x", &ocw3); outp(0xa0,ocw3);

printf("\n\Bвід робочих наказів завершений"

"\n ");

Питання для самоконтролю знань

  1. Що означає поняття ротація пріоритетів?

  2. Що означає поняття задати статус рівнів пріоритету системі переривання?

  3. Наведіть приклади задавання статусу рівням пріоритету у вигляді таблиці.

  4. У яких випадках доцільно використовувати автоматичну ротацію пріоритетів?

  5. Які існують методи автоматичної ротації пріоритетів?

  6. Яка послідовність дій при ротації за звичайною командою ЕОІ? Наведіть приклад.

  7. Яка послідовність дій при ротації в автоматичному режимі ЕОІ? Наведіть приклад.

  8. У яких випадках доцільно використовувати спеціальну ротацію пріоритетів?

9. Які команди використовуються для реалізації спеціальної ротації пріоритетів?

10. Які можливості надає користувачу команда вста­новлення пріоритету?

11. Які можливості надає користувачу команда «Рота­ція за спеціальною командою ЕОІ»?

Резюме

Для керування пріоритетами переривань в І8259А є багато команд та режимів. Усі вони програмуються, тобто можуть бути зміненими динамічно. Контролер має кілька програмних способів задавання пріоритетного кільця, що застосовуються залежно від системних вимог.

Наприклад, автоматична ротація пріоритетів вико­ристовується у тих випадках, коли перериваючі пристрої (наприклад, канали зв'язку) мають рівні пріоритети. Існує два методи реалізації автоматичної ротації: у сполученні зі звичайною ЕОІ (ротація за звичайною командою ЕОІ) та з АЕОІ (ротація в автоматичному режимі ЕОІ). Крім цього, передбачена можливість реалізації спеціальної ротації, яка надає користувачу широкі можливості обробки даних з вико­ристанням переривань. Вона доцільна в тих випадках, коли необхідно змінювати пріоритети переривань від окремих пристроїв.

Для програмної зміни дисциплін обслуговування пріоритетів є спеціальна команда встановлення пріоритету, яка дозволяє програмісту присвоювати певному рівню IRQ нижчий пріоритет (дно пріоритетного кільця) і, таким чином, змінювати дисципліну обслуговування.

Розглянені в занятті режими та команди забезпечують для користувача практично необмежені можливості у вико­ристанні в прикладних програмах модулів, керованих за перериваннями.

Ваш наступний крок

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

Заняття 7. Принципи організації оброблювачів переривань

Тема заняття

Класифікація програм оброблювачів переривання.

Особливості структури оброблювачів переривання.

Мета заняття

Отримати уявлення про ознаки класифікації про­грам оброблювачів переривання.

Засвоїти послідовність дій, які виконує оброблювач переривань у фазах ініціалізації, активізації, виходу.

Зрозуміти та засвоїти відмінності між послідовні­стю дій по обробці переривань, що ініціюються сигналами INTR, NMI та командою INTn.

Навчитись розробляти резидентні та нерезидентні оброблювачі переривань.

Класифікація програм оброблювачів переривання

За способом організації програми оброблювачів перери­вання можна класифікувати як два альтернативні типи: що заміщують та перехоплюють вектори переривання.

До заміщуючих оброблювачів, наприклад, належить оброблювач INT 23 h (Control/Break), який передбачає заміну існуючого вектора без його збереження та поновлення.

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

Більшість макропрограм клавіатури належить до цього типу оброблювачів. Вони не заміщують вектор переривання INT 09h, а перехоплюють переривання та далі вже «вирішують», чи буде застосовуватись оригінальний оброблювач BIOS. У будь-якому випадку після виконання процедури обробки переривання керування буде передано тому оброблювачу, чий вектор був перехоплений. Біль­шість оброблювачів будуються саме за цим принципом.

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

Ініціалізація оброблювача переривання

Задачею цієї фази є забезпечення коректного заванта­ження оброблювача з точки зору DOS та програм, що знаходяться в пам'яті одночасно з оброблювачем, прив'язка оброблювача до певних векторів переривань та інсталяція його в якості резидента. Завантаження оброблювача здійсню­ється так само, як і більшість програм — за допомогою системної функції 4Bh, але в процесі інсталяції резидента можуть бути відкритими файли, які операційною системою закриються після виходу із процедури ініціалізації. Вихід із фази ініціалізації полягає у звільненні тієї частини пам'яті, яка не може бути звільнена операційною системою і перебуває у виклику або системної функції 31h, або перери­вання INT 27h.

Як і функція 31h, переривання INT 27h належить до підкласу системних програмних засобів, які забезпечують реалізацію дуже важливого режиму TSR (Terminate but Stay Resident) — «Закінчити, але залишитись резидентом».

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

Процедура звільнення пам'яті може бути виконана шляхом завантаження регістра ES значенням адреси сегмента, що міститься по зсуву 2Ch в PSP (префіксі програмного сегмента), та використанні функції 49h (звільнити розподілену пам'ять) системного переривання INT 21h.

Але, щоб оброблювач мав можливість знайти PSP, необхідно в початковий момент ініціалізації зберегти значення DS або ES, які в процесі виконання процедури ініціалізації можуть змінитись. Можна для пошуку та збе­реження адреси сегмента PSP активної програми вико­ристовувати системну функцію 62h, що залишає його в регістрі ВХ.

Фаза ініціалізації завершується виконанням функції виходу з резервуванням пам'яті для резидентної частини оброблювача переривання. Область пам'яті до позначки початку резидентної програми (LABEL START) резерву­ється так, щоб наступні програми не змогли перекрити оброблювач.

Приклад побудови основних модулів фази ініціалізації.

;***Code segment*** Code segment

;***Execution start with this piece***

Assume csrcode, ds:code, ss:code, es:code

;***Program segment prefix copy***

mov ah, 62h ; Зберегти адресу сегмента

int 21h ; копії оточення DOS

mov PSPCopy, word ptr

[bx=2ch]

jmp short START ; Перехід до фази ініціалі-

зації з позначкою START

;***Free memory allocated to the environment ***

push es push bx

mov ah, 49h ;Встановити адресу сег-

mov bx, word ptr ;мента копії оточення DOS

PSPCopy mov es, bx

int 21h ;Очистити пам'ять від копії

pop bx ;оточення DOS поточної

pop es ; програми

Assume es:code

;***Terminate protecting memory below START*** mov dx, offset START встановити верхню межу

mov ax, 3100h ;пам'яті та вийти в DOS

int 21h

Code ENDS;

У практиці програмування оброблювач переривання ISR (Interrupt Service Routine) прив'язують не тільки до специфічних векторів, але і до одного з найчастіше вживаних: (08h, 09h, 16h, 21h, 23h, 24h, 28h).

Прив'язка оброблювача до певного вектора перери­вання здійснюється за допомогою функції 35h (отримати вектор) та 25h (встановити вектор) переривання Int21h. Значення оригінального вектора зберігається й у фазі виходу з оброблювача та використовується для повернення керування перехопленому вектору переривання.

;***Initialization piece***

Assume cs:code, ds:code, ss:code, es:code

START LABEL NEAR

;***Get int 8 vector and save***

push es

mov al, 08h

mov ah, 35h

int 21h

mov offset VectOld, bx ;Отримати вектор 08h

mov offset VectOld+2,es ; Зберегти сегмент та

pop es ;зміщення вектора

Assume es:code

;***Set int 8 vector to int 08h***

mov al, 08h

mov ah, 25h

mov dx, word ptr NewOff ;3авантажити нові

mov ds, word ptr NewSeg ; значення сегмента та

; зміщення Int 08h int 21h ;3амінити вектор 08h

Активізація обробки переривання

Активізація обробки переривання передбачає передачу керування програмі оброблювача переривання. При активі­зації лінії INTR відбувається читання з шини X байта номе-

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

Послідовність дій по обробці запиту, ініційованого сигналом INTR

1. Отримати номер вектора із контролера переривань, виконавши два цикли INTA.

2. Зберегти регістр прапорців у стеку.

3. Зберегти CS у стеку.

4. Зберегти IP у стеку.

5. Скинути IF.

6. Прочитати вектор переривання (IP : CS) із таблиці векторів переривання та помістити у відповідні регістри процесора.

7. Почати виконання оброблювача зі входу CS : IP.

Послідовність дій по обробці запиту, ініційованого сигналом NMI

1. Зберегти регістр прапорців у стеку.

2. Зберегти CS у стеку.

3. Зберегти IP у стеку.

4. Скинути IF та заборонити NMI. Прочитати вектор переривання 02h; помістити селектор у CS та зміщення в IP.

5. Почати виконання команд із входу CS : IP.

Послідовність дій по обробці запиту, ініційованого командою INT n

1. Зберегти регістр прапорців у стеку.

2. Зберегти CS у стеку.

3. Зберегти IP у стеку.

4. Прочитати вектор переривання п; помістити селек­тор у CS та зміщення в IP.

5. Почати виконання команд із входу CS : IP.

Фаза обробки переривання

При вході в програму обслуговування переривання ті регістри, які використовуються разом основною програмою та оброблювачем, повинні бути збережені. Для цього найкраще кожний з регістрів, що використовується, зберегти в стековій області пам'яті командою PUSH. Після завершення роботи програми оброблювача вміст збереже­них регістрів відновлюється командою POP.

Вихід із обробки переривання

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

Для того, щоб оброблювач коректно повернув значення перехопленого вектора переривання, в його алгоритмі не­обхідно врахувати особливість повернення, пов'язану з тим, що поточний оброблювач повинен забезпечити можливість виконання збереженого оброблювача до передачі керування перерваній програмі. Виконання цієї умови необхідно в тих випадках, коли ставляться вимоги сумісності та перенесення оброблювача в середовищі DOS. При цьому мається на увазі, що у фазі ініціалізації відповідний вектор був збережений. Передача керування збереженому оброблювачеві здій­снюється за допомогою команд CALLF або JMPF таким чином, щоб збережений оброблювач при закінченні вико­нання власної процедури повернення (IRET) зміг повернути керування поточному оброблювачеві.

;***Du the original interrupt*** pushf ;3берегти прапорці, щоб

calif VectOld ;IRET збереженого оброблю-

;вача відновила їх значення

Для завершення обробки апаратного переривання необхідно перед тим, як «виштовхнути» регістри та повер­нути керування перерваній програмі, ISR повинна повідо­мити контролер про закінчення обробки відповідного запиту на переривання. Після закінчення ISR відповідний розряд регістра обслуговування запиту повинен бути скинений командою «Неспецифічний кінець переривання».

;***Return from ISR***

mov al, 20h ;Формування та передача підпрограми

out

AOh, al

;EOI для веденого контро-

лера

imp

$+2

; Часова затримка

out

20h, al

;Формування та передача

;ЕОІ для ведучого

; контролера

pop

es

;Відновлення вмісту

pop

ds

;регістрів

popa

iret

; Команда повернення з

Практикум Лабораторна робота З

Тема роботи

Дослідження методів розробки резидентних програм, що перехоплюють апаратні переривання.

Мета роботи

Засвоїти основні особливості логічної побудови ти­пової резидентної програми.

Навчитись розробляти програмні модулі, що аналі­зують стан клавіш клавіатури ПК.

Зрозуміти та засвоїти призначення функції 35h переривання 21h.

Отримати уявлення про призначення функції 09h переривання 21h.

Усвідомити основні особливості процедур збережен­ня та відновлення штатних векторів переривання.

Сконцентрувати увагу на основних аспектах засто­сування функції 31h переривання INT 21h для виділення пам'яті під резидентну частину оброблювача переривання.

Уявити дії, що реалізуються функцією 49h пере­ривання INT 21h при звільненні ділянки пам'яті після вивантаження резидента з пам'яті.

Навчитись створювати резидентні програми з пара­метрами завантаження, вивантаження та блокування повторного завантаження.

Вимоги

Для виконання роботи необхідні знання та навички програмування мовами СІ та Ассемблера, ґрунтовні знання архітектури та принципів функціонування програмованого контролера переривань, а також знання та навички програм­ного доступу до регістрів ПКП.

На вінчестері комп'ютера повинно бути встановлено се­редовище програмування Borland C++ V3.01 в каталозі ВС.

Вправа 1

1. Дослідіть програму rezident. asm, яка є резидентною і перехоплює переривання від клавіатури.

cmp al, 2 ;порівняння із заданим

;кодом 2 jz Beep ;якщо дорівнює, перехід на

;подачу звукового сигналу cmp al, 1 ; порівняння із заданим

;кодом 1 jz NoBeep ;якщо дорівнює, перехід

;на заборону звукового

; сигналу jmp Exit ; перехід на позначку Exit

NoBeep:

mov dx, 61h ;занесення в dx номера порту

in al, dx ;читання вмісту 61 порту

and al, 11111100b ; скидання бітів 0 та 1

out dx, al ;вивід в порт 61 для заборо­ ни видавання звуку

jmp Exit ; перехід на позначку Exit

Beep:

mov dx, 61h

in al, dx

and al, 11111100b

out dx, al

mov dx, 43h ; занесення в dx номера

; порту 43

mov al, 10110110b ;керуюче слово в al

out dx, al ;керуюче слово в порт 43h

dec dx ;відняти 43 - 1 = 42

;(порт лічильника каналу 2

;таймера) mov ax, 2ffh out dx, al ; занести до лічильника

;коефіцієнт перерахунку

;мл. байта mov al, ah out dx, al ;занести до лічильника

;коефіцієнт перерахунку

;ст. байта

mov dx, 61h

in al, dx

or al, 00000011b

out dx, al ;дозволити подачу

; звукового сигналу exit:

pop dx

pop ax popf

imp dword ptr cs:Old09

ENDP

======[ Опис змінних для резидентної частини ]======

Old09 dd ? ; змінна для збереження старого вектора

==[ Позначка кінця резидентної частини програми ]==== EndlSR db ?

******ПРОЦЕДУРА ІНСТАЛЯЦІЇ ПРОГРАМИ********;

;==[ Текст повідомлення програми інсталяції ]========

Help db 'recive_s.com /і - Встановлення в пам'яті',OAh.ODh

db 'recive_s.com /r — Вивантаження з пам'яті',0Ah,0Dh,$'

MesDoublelnst db 'Програма вже знаходиться в naM'HTi',0Ah,0Dh,'$'

MesReload db 'Программа вивантажена з naM'HTi',0Ah,0Dh,'$'

Meslnstall db 'Програма завантажена та

активізована ',0Ah,0Dh,'$'

MesNotlnstall db 'Програма не була інстальована',0Ah,0Dh,$g