Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Перевизначення переривань




Досить частою є ситуація, коли в програмі необхідно визначити власні алгоритми реакції на переривання операційної системи, скасувавши при цьому стандартні реакції. Мова Turbo Pascal підтримує такі можливості введенням процедур спеціального виду. Заголовок таких процедур повинний мати стандартний набір параметрів, що виглядають так:

procedure IntHandler (Flags,

CS, IP, AX, BX, CX, DX,

SI, DI, DS, ES, BP: word);

Допускається завдання тільки деяких з цих параметрів, але при цьому їхній порядок повинний обов'язково зберігатися:

procedure IntHandler{DI,ES,BP: word);

procedure IntHandler(SI,DI,DS,ES,BP: word);

Додавання інших параметрів у заголовок не допускається, хоча ніяких діагностичних повідомлень у цьому випадку не видається.

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

procedure IntHandler (Flags, CS, IP, AX, BX, CX,

DX, SI, DI, DS, ES, BP: word); interrupt;

begin

end;

Регістри центрального процесора передаються в процедуру в якості (псевдо) параметрів, так що в процедурі їх можна використовувати і змінювати. Якщо використовуються не всі регістри, то список параметрів, як було сказано, можна скоротити.

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

PUSH AX

PUSH BX

PUSH DX

PUSH SI

PUSH DF

PUSH DS

PUSH ES

PUSH BP

MOV BP,SP

SUB SP,LocalSize

MOVAX, SEG DATA

MOV DS,AX

При виході з процедур обробки переривань стан регістрів автоматично відновлюється і виконується спеціальна команда повернення з переривання:

MOV SP,BP

POP BP

POP ES

POP DS

POP DI

POP SI

POP DX

POP CX

POP BX

POP AX

IRET

Процедура обробки переривання може модифікувати свої параметри. Коли ця процедура поверне керування, зміна описаних параметрів приведе до зміни умісту відповідних регістрів. Це може виявитися корисним, коли процедура використовується в якості користувальницького сервісного засобу, аналогічного викличу функції DOS по перериванню $21.

У процедурах, призначених для обробки переривань, одержуваних від апаратних схем, варто утримуватися від використання яких-небудь операцій введення-виведення або розподілу пам'яті, оскільки вони не є реентерабельними. Через їх не реентерабельність в процедурах обробки переривань не можна також використовувати ніяких функцій DOS.

Власне перевизначення деякого переривання виробляється звертанням до стандартної процедури SetIntVec модуля Dos. Перший параметр цієї процедури визначає номер переривання, другий параметр повинний містити адресу нової процедури, що буде автоматично запускатися при виникненні зазначеного переривання. При цьому адреса старої реакції на переривання буде загублена. Щоб зберегти попередню реакцію (наприклад, для її відновлення через якийсь час), можна скористатися стандартною процедурою GetIntVec, що присвоює другому параметру-змінній адресу поточної реакції на переривання з номером, обумовленим першим параметром.

У наступному прикладі перевизначається переривання з номером $l, що виникає при натисканні комбінації клавіш Ctrl-Break. Адреса процедури старої (стандартної) реакції на це переривання запам'ятовується в змінній IntlBSave і перед завершенням програми відновлюється.

uses

Dos; const

BreakFlag: boolean = false, var

IntlBSave: pointer;

{$F+}

procedure BreakHandler; interrupt;

{ Процедура, що буде викликатися }

{ при натисканні комбінації Ctrl-Break }

begin

BreakFlag := true;

end;

{$F-}

begin

{ Одержуємо адресу стандартної реакції }

GetIntVec($l,IntlBSave);

{ Замість нього встановлюємо адресу своєї процедури }

SetIntVec($l,@BreakHandler);

WriteLn('Press Ctrl-Break to exit');

{ Запускаємо цикл, що завершиться }

{ коли BreakFlag стане рівним true, тобто }

{ при виникненні переривання lВ }

repeat

until BreakFlag,

{ Відновлюємо первісну адресу реакції }

SetIntVec($lB,IntlBSave);

end.

Більш докладні відомості про переривання і техніку перевизначення переривань можна дістати в технічній документації по операційній системі MS-DOS і у фірмових посібниках із системи Turbo Pascal.

 




Поделиться с друзьями:


Дата добавления: 2014-12-16; Просмотров: 328; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.