Системне програмування 2

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

ДОКДАД
З ДИСЦИПЛІНИ:
«Системне програмування»
НА ТЕМУ:
«ПЕРЕРИВАННЯ»

Зміст
Переривання і його природа
Контролер переривань
Обробка переривань в реальному режимі
Характеристики реального режиму роботи мікропроцесора
Загальна схема обробки переривань в реальному режимі
Написання власного переривання
Приклад розробки переривання в загальному випадку

Переривання і його природа
Переривання - ініційований певним чином процес, тимчасово перемикаючий мікропроцесор на виконання іншої програми з наступним відновленням виконання перерваної програми.
Механізм переривань дозволяє забезпечити найбільш ефективне управління не тільки зовнішніми пристроями, а й програмами. Натискаючи клавішу на клавіатурі, ви тим самим ініціюєте допомогою переривання негайний виклик програми, яка розпізнає натиснуту клавішу, заносить її код в буфер клавіатури, звідки він надалі зчитується деякою іншою програмою або операційною системою. На час такої обробки мікропроцесор припиняє виконання деякої програми і переключається на так звану процедуру обробки переривання. Після того як дана процедура виконає необхідні дії, перервана програма продовжить виконання з точки, де було призупинено її виконання. Деякі операційні системи використовують механізм переривань не тільки для обслуговування зовнішніх пристроїв, але і для представлення своїх «послуг». Так, операційна система MS-DOS взаємодіє з системними та прикладними програмами переважно через систему переривань.
Виходячи з вищенаведених міркувань, можна сказати, що переривання можуть бути зовнішніми і внутрішніми.
Зовнішні переривання викликаються зовнішніми по відношенню до мікропроцесора подіями. На наведеному нижче рис.1 схематично зображено підсистема переривань комп'ютера на базі мікропроцесора Intel.

Рис.1. Підсистема переривань комп'ютера

На рис.1 видно, що у мікропроцесора є дві фізичні контакту - INTR і NMI. На них і формуються зовнішні по відношенню до мікропроцесора сигнали, зростаючі фронти яких сповіщають мікропроцесор про те, що деякий зовнішній пристрій просить приділити йому увагу. Вхід INTR (Interrupt Request) призначений для фіксації запитів від периферійних різних пристроїв, наприклад таких, як системний годинник, клавіатура, жорсткий диск і т.д. Вхід NM1 (NonMaskeable Interrupt) - немаскіруемое переривання. Цей вхід використовують для того, щоб повідомити мікропроцесору про деяке подію, що вимагає невідкладної обробки, або катастрофічною помилку. Зовнішні переривання відносяться, природно, до не планованим перериваннях.
Внутрішні переривання виникають усередині мікропроцесора під час обчислювального процесу. До їх появи призводить одна з двох причин:
o Ненормальне внутрішній стан процесора, що виникло при обробці деякої команди програми. Такі події прийнято називати винятковими ситуаціями, або просто винятками. Цей вид переривань почасти також можна віднести до не планованим;
o Обробка машинної команди int xx. Цей тип переривань називається програмним. Це - плановані переривання, так як з їх допомогою програміст звертається в потрібний для нього час за обслуговуванням своїх запитів або до операційної системи, або до BIOS, або до власних програм обробки переривань.
Для глибокого розуміння процесів, що відбуваються в комп'ютері при здійсненні переривання, необхідно дізнатися про те, які ресурси комп'ютера при цьому задіюються, які їх характеристики і принципи функціонування.
У загальному випадку система переривань - це сукупність програмних і апаратних засобів, що реалізують механізму переривань.
До апаратних засобів системи переривань відносяться:
o Висновки мікропроцесора:
· INTR - висновок для вхідного сигналу зовнішнього переривання. На цей вхід надходить вихідний сигнал від мікросхеми контролера переривань 8259А;
· INTA - висновок мікропроцесора для вихідного сигналу підтвердження отримання сигналу переривання мікропроцесором. Цей вихідний сигнал надходить на однойменний вхід INTA мікросхеми контролера переривань 8259А;
· NMI - висновок мікропроцесора для вхідного сигналу немаскируемого переривання;
o Мікросхема програмованого контролера переривань 8259А. вона призначена для фіксування сигналів переривань від восьми різних зовнішніх пристроїв. У силу її важливої ​​ролі при роботі всієї обчислювальної системи ми її детально розглянемо нижче;
o Зовнішні пристрої: таймер, клавіатура, магнітні диски і.дз.
До програмних засобів системи переривань реального режиму відносяться:
o Таблиця векторів переривань. У цій таблиці в певному форматі, який залежить від режиму роботи мікропроцесора, містяться покажчики на процедури обробки відповідних переривань;
o Наступні прапори в регістрі прапорів flags \ eflags:
· IF (Interrupt Flag) - прапор переривання. Призначений для так званого маскування (заборони) апаратних переривань, тобто переривань по входу INTR. На обробку переривань інших типів прапор IF впливу не надає. Якщо IF = 1, мікропроцесор обробляє зовнішні переривання, якщо IF = 0, мікропроцесор ігнорує сигнали на вході INTR;
· TF (Trace Flag) - прапор трасування. Одиничне стан прапора TF переводить мікропроцесор у режим покомандной роботи. У режимі покомандной роботи після виконання кожної машинної команди в мікропроцесорі генерується внутрішнє переривання з номером 1, і далі йдуть дії відповідно до алгоритму обробки даного переривання;
o Машинні команди мікропроцесора: int, into, iret, cli, sti.

Контролер переривань
Центральне місце у схемі обробки апаратних переривань займає програмований контролер переривань (ПКП), виконаний у вигляді спеціальної мікросхеми i8259A. Ця мікросхема може обробляти запити від восьми джерел зовнішніх переривань. Цього явно замало, тому в стандартній конфігурації обчислювальної системи зазвичай використовують дві послідовно з'єднані мікросхеми i8259A. У результаті такого з'єднання кількість можливих джерел зовнішніх переривань зростає до 15.
Перерахуємо функції, що їх мікросхемою контролера переривань:
o Фіксування запитів на обробку переривання від восьми джерел, формування єдиного запиту на переривання і подача його на вхід INTR мікропроцесора;
o Формування номера вектора переривання і видача його на шину даних;
o Організація пріоритетною обробки переривань;
o Заборона (маскування) переривань з певними номерами.
На рис.2 показано схематичне уявлення внутрішньої структури та фізичних висновків мікросхеми i8259A.

Рис.2. Структурна схема і схематичне уявлення висновків i8259A.

Розглянемо призначення основних структурних компонентів контролера переривань:
o Регістр запитів на переривання IRR (Interrupt Request Register) - восьмирозрядний регістр, що фіксує надходження сигналу на один з входів i8259A - irq0 ... irq7. фіксація виражається в установці відповідного біта в одиничний стан;
o Регістр маскування переривань IMR (Interrupt Mask Register) - восьмирозрядний регістр, за допомогою якого можна заборонити обробку запитів на переривання, що надходять на відповідні входи (рівні) irq0 ... irq7. Для заборони (маскування) певних рівнів переривань необхідно встановити відповідні біти регістра IMR. Ця операція здійснюється шляхом програмування порту 21h.
o Регістр обслуговуються переривань ISR (Interrupt Service Register) - восьмирозрядний регістр, одиничне стан розрядів якого показує, переривання яких рівнів обробляються в даний момент в мікропроцесорі;
o Арбітр пріоритетів PR (Priority Resolver) - функцією даного блоку є дозвіл конфлікту при одночасному надходженні запитів на входи irq0 ... irq7;
o Блок управління - основною функцією даного блоку є організація інформаційного обміну контролера переривань і мікропроцесора через шину даних. На цей блок замикаються як висновки d0 ... d7, так і деякі інші.
Розглянемо можливі проходження і обробку сигналу переривання від деякого зовнішнього пристрою. При цьому скористаємося структурною схемою контролера переривань і позначення не ній (рис.2).
Припустимо, на вхід irq0 надходить сигнал переривання, що призводить до встановлення нульового біта регістра IRR. Цей регістр пов'язаний з регістром маски IMR, стан бітів якого визначає, які рівні переривань заборонені (одиничні біти) або дозволені до обробки (нульові біти). Управління даними регістром здійснюється через порт 21h. Таким чином, якщо біт 0 в IMR дорівнює нулю, то переривання рівня 0 дозволено. Далі сигнал надходить до арбітра пріоритетів. Як ми вже відзначили, функція цього блоку - вирішення конфліктів при одночасному надходженні запитів на кілька рівнів. Зазвичай найвищий пріоритет у рівня irq_0, і далі зменшується з зростанням номера рівня. Якщо конфлікту немає, то сигнал надходить на схему управління контролером переривань, яка формує сигнал на виведенні int. Цей висновок пов'язаний зі входом мікропроцесора INTR. Таким чином, сигнал на вході i8259A досяг мікропроцесора. Відзначимо важливі моменти на цьому етапі:
1. Аналізується прапор IF. Одиничне стан цього прапора говорить про те, що апаратні переривання дозволені, нульове - заборонені.
2. Якщо переривання заборонені, то запит на переривання «повисає» до моменту установки IF в одиницю.
3. Якщо переривання дозволені, мікропроцесор виконує наступні дії:
o Скидає прапор IF в нуль;
o Формує сигнал підтвердження переривання на виведенні мікропроцесора INTR. Цей висновок мікропроцесора замкнутий на однойменний висновок мікросхеми i8259A.
Таким чином, сигнал про переривання пройшов через мікропроцесор і повернувся назад в контролер переривань i8259A через висновок INTA. Даний висновок всередині контролера переривань замкнутий на його схему управління, яка виконує відразу декілька дій при вступі цього сигналу:
1. Скидає біт в регістрі IRR, що відповідає рівню переривання irq_0.
2. Встановлює в 1 біт 0 регістру ISR, тим самим фіксуючи факт обробки переривання рівня 0 в мікропроцесорі.
3. Формує за допомогою блоку керування номер вектора переривання, значення якого формується в буфері даних і далі надходить на висновки i8259A d0 ... d7. Висновки d0 ... d7 замкнуті на шину даних, по якій номер вектора надходить в мікропроцесор. У мікропроцесорі цей номер використовується для виклику відповідної процедури обробки переривання.
На даному етапі обробки переривання, після того як номер переривання по шині даних вступив в мікропроцесор, останньому стало відомо все про джерело переривання. Якщо в цей час прийде інший сигнал про переривання того ж рівня, то він буде запам'ятати установкою біта в IRR, і обслуговування цього переривання буде відкладено. Якщо приходить переривання іншого рівня, то його подальша обробка залежить від пріоритету, який воно має по відношенню до вже оброблюваним перериваннях. Якщо пріоритет вище, то поточна процедура обробки переривання зупиняється, і викликається процедура обробки більш пріоритетного переривання.
Дуже, важливий момент пов'язаний з процесом завершення обробки переривання. Проблема тут в наступному. Після прийняття мікропроцесором запиту на обслуговування переривання в контролері встановлюється біт в регістрі ISR, номер цього біта відповідає рівню переривання. Установка біта з даним номером блокує всі переривання рівня, починаючи з поточного, і менш пріоритетні у блоці-арбітра пріоритетів. Якщо процедура переривання закінчить свою роботу, то вона сама повинна це біт скинути, інакше всі переривання цього рівня і менш пріоритетні будуть ігноруватися. Для здійснення такого скидання необхідно надіслати код 20h в порт 20h. Є й інша можливість - встановити такий режим роботи мікросхеми i8259A, коли скидання цього біта буде здійснюватися автоматично. Тонкий момент полягає в тому, що відбуватися такий автоматичне скидання буде з приходом сигналу INTA (тобто повідомлення про те, що запит на обробку переривання прийнятий до обробки мікропроцесором). Недолік автоматичного скидання в тому, що існує ймовірність приходу переривання того ж рівня, який вже обробляється в даний в даний момент мікропроцесором. У цьому випадку процедура обробки переривання повинна мати властивість рентабельності, тобто допускати повторне звернення до себе до завершення обробки попереднього звернення. Для того щоб процедура була рентабельною, вона повинна мати специфічну структуру, зокрема, для кожного сеансу звернення до неї створюється своя область для зберігання змінних і значень регістрів, а виконується частина процедури знаходиться в оперативній пам'яті тільки в одному екземплярі. Іноді може знадобитися подібний автоматичне скидання, але надійніше і простіше, звичайно, контролювати цей процес і самостійно скидати біт в ISR. Це можна зробити або в кінці роботи процедури, або в тому місці процедури, починаючи з якого можна дозволити рекурсивний виклик даної процедури, будучи впевненим, в тому, що вона не зруйнує ніяких даних і роботу програми в цілому.
Інший не менш цікавий момент полягає в тому, що мікропроцесор при прийнятті до обробки запиту на переривання скинув прапор IF в нуль, тим самим заборонивши всі наступні апаратні переривання. Цією обставиною програміст може користуватися на свій розсуд. Всі запити на переривання з пріоритетом, рівним поточному або меншим, будуть заборонені в будь-якому випадку, - це обумовлено логікою роботи контролера i8259A. Тому програміст повинен вирішити, наскільки його задумам можуть перешкодити запити на більш пріоритетні переривання. Якщо це некритично, то краще відразу, на початку процедури обробки переривання встановити прапор IF в одиницю. У більшості випадків ЕТК операцію потрібно робити якомога раніше. Для установки прапора IF в одиницю в системі команд мікропроцесора є спецальная команда, яка не має операндів:
sti - дозволити апаратні переривання.
Найбільш наочний приклад, що показує важливість своєчасної установки IF, пов'язаний з відліком часу. Розглянемо, як ведеться облік часу в комп'ютері. Як після включення комп'ютер визначає час поточний час доби або як він запам'ятовує інформацію про свою конфігурації після вимкнення? Вся справа в тому, що комп'ютер має невелику незалежну пам'ять, яка живиться від акумулятора і не залежить від підключення до електромережі. Конструктивно ця пам'ять виконана на спеціальний тип напівпровідникових елементів з так званої CMOS-структурою (Complementar Metal Oxide Semiconductor - компліментарна МОН - структура). Особливість таких елементів - у їх зниженою в порівнянні зі звичайними мікросхемами споживаної потужності (при цьому вони є і більш повільними, що в даному випадку не негативно). Акумулятор крім CMOS-пам'яті живить ще й мікросхему системних годин, у функції якої входить відлік поточних дати і часу доби. Таким чином, поточні значення дати і часу постійно зберігаються в CMOS-пам'яті і підтримуються в актуальному стані навіть після виключення комп'ютера. Крім того, в CMOS-пам'яті зберігається деяка інша інформація, зокрема, про конфігурацію комп'ютера. Під час завантаження комп'ютера дата і час зчитуються в область даних BIOS. Подальший відлік часу, після завантаження системи, ведеться за допомогою системного таймера - інший мікросхеми на системній платі, до функцій якої входить регулярно, приблизно 18.2 рази в секунду, генерувати сигнал, який у якості переривання подається на рівень irq0 контролера переривань i8259A. Під час роботи комп'ютера відповідна програма BIOS обробляє переривання даного рівня і веде відлік часу. Якщо втрачати такти з цього входу, то фактичний час на годиннику буде відставати, і тому в більшості випадків у обробниках переривань є сенс, як можна раніше видавати команду sti.

Обробка переривань в реальному режимі
Характеристики реального режиму роботи мікропроцесора
o Простір оперативної пам'яті ділиться на сегменти по 64 Кбайт. Сегменти в пам'яті можуть перекриватися;
o Сторінковий перетворення адреси заборонено, тобто фізична адреса дорівнює лінійному і формується як сума двох складових:
· 16-розрядного ефективного адреси, який, у свою чергу, є сумою трьох складових: бази, зміщення та індексу;
· 20-розрядного результату зсуву вмісту конкретного сегментного регістра на 4 розряду вліво;
o Максимальне значення фізичної адреси равно0ff fffh, то есть1 Мбайт, але, фактично, в реальному режимі мікропроцесора адресується на 64 Кбайт більше, що випливає з наступного обчислення:
Ffff0 - максимальне значення сегментної частини адреси, зрушене на 4 розряди вліво;
+
0fffh - максимальне значення зсуву;
10ffef - максимальний фізичний адреса в реальному режимі.
Цей приклад говорить про те, що в моделі мікропроцесорів, починаючи з i286, за певних обставин можлива адресація оперативної пам'яті за межами першого мегабайта. Це обставина навіть використовувалося останніми версіями MS-DOS для розміщення службових програм в цьому додатковому сегменті пам'яті. Формування значень адреси одразу за першим мегабайтом можливо і в мікропроцесорі i8088/86. в ньому при появі фізичної адреси більшого 0ffffh, наприклад 1 000 054h, мікропроцесор відкидає 21-й одиничний біт. Відбувається так зване «загортання» адреси, тому сформований фізичну адресу на шині адреси буде дорівнює 00054h. Для того щоб забезпечити повну емуляцію даної особливості мікропроцесора i8088/86, в моделях мікропроцесорів, починаючи з i80286, була передбачена можливість блокування адресної лінії A20 (управління тим самим 21-м бітом адреси). Для забезпечення доступу до адрес оперативної пам'яті, що лежить за межами першого мегабайта, необхідно спеціальним чином відкривати цю адресну лінію;
o У реальному режимі схема розподілу оперативної пам'яті - фіксована. Перерахуємо розташування деяких з системних областей, які будуть потрібні нам надалі:
· У діапазоні адрес 00000h - 003ffh (перший мегабайт оперативної пам'яті) знаходиться таблиця векторів переривань (ТВП). Адреса програми переривання зв. вектором. Вона містить 256 векторів переривань розміром 4 байти (покажчиків на програми обробки переривань). У першому слові зберігається значення ip, а в другому - cs. Молодші 1024 байт пам'яті містять вектора переривань, таким чином, є місце для 256 векторів;
· У діапазоні адрес 00400h - 006ffh відразу за таблицею векторів переривань розташовується область пам'яті, що містить жорстко структуровані дані, що забезпечують роботу BIOS і MS-DOS;
· З адреси 0b8000h розташовується область відеопам'яті, в якій формується зображення, яке ми бачимо на екрані.
Загальна схема обробки переривань в реальному режимі
Обробка переривань (як зовнішніх, так і внутрішніх) в реальному режимі мікропроцесора проводиться в три етапи:
1. Припинення виконання поточної програми.
2. Перехід до виконання і виконання програми обробки переривань.
3. Повернення управління перерваної програмі.
Перший етап повинен забезпечити тимчасове припинення виконання поточної програми таким чином, щоб потім перервана програма продовжила свою роботу так, як ніби ніякого переривання не було. Будь-яка програма, завантажена для виконання операційною системою, займає своє, окреме від інших програм, місце в оперативній пам'яті. Розділяються між програмами ресурсами є регістри мікропроцесорів, в тому числі регістр прапорів, тому їх вміст потрібно зберігати. Обов'язковим для збереження є регістри cs, ip і flags \ eflags, тому вони при виникненні переривання зберігаються мікропроцесором автоматично. Пара cs: ip містить адресу команди, з якою необхідно почати виконання після повернення з програми обслуговування переривання, а flags \ eflags - стан прапорів після виконання останньої команди перерваної програми в момент передачі управління програмі обробки переривання. Збереження вмісту інших регістрів має забезпечуватися програмістом на початку програми обробки переривання до їх використання. Найбільш зручним методом зберігання регістрів є стек. У кінці першого етапу мікропроцесор після включення в стек регістрів flags, cs, i скидає біт прапора переривань IF в регістрі flags (але при цьому в стек записується попередній вміст регістра flags з ще встановленим IF). Тим самим запобігають можливість виникнення вкладених переривань по входу INTR і псування регістрів вихідної програми внаслідок неконтрольованих дій з боку програми обробки вкладеного переривання. Після того як необхідні дії по збереженню контексту завершені, обробник апаратного переривання може дозволити вкладені переривання командою sti.
Набір дій з реалізації другого етапу полягає у визначенні джерела переривання і виклику відповідної програми обробки. У реальному режимі мікропроцесора допускається від 0 до 255 джерел переривань. Кількість джерел переривань обмежена розміром таблиці векторів переривань. Ця таблиця виступає зв'язуючою ланкою між джерелом переривання і процедурою обробки. Дана таблиця розташовується в пам'яті, починаючи з адреси 0. кожен елемент таблиці векторів переривань займає 4 байти і має наступну структуру:
o 1-е слово елемента таблиці - значення зміщення початку процедури обробки переривання (n) від початку кодового сегмента;
o 2-е слово елемента таблиці - значення базової адреси сегмента, в якому знаходиться процедура обробки переривання.
Визначити адресу, за якою знаходиться вектор переривання з номером n, можна наступним чином:
cмещение_элемента_таблицы_векторов_прерываний = n * 4
Тепер зрозуміло, що на другому етапі обробки переривання мікропроцесор виконує наступні дії:
1. За номером джерела переривання шляхом множення на 4 визначає зсув в таблиці векторів переривань.
2. Поміщає перші два байти по обчисленому адресою в регістр ip.
3. Поміщає другі два байти по обчисленому адресою в регістр cs.
4. Передає управління за адресою, що визначається парою cs: ip.
Далі виконується сама програма обробки переривання. Вона, у свою чергу, також може бути перервана, наприклад, надходженням запиту від більш пріоритетного джерела. У цьому випадку етапи 1 і 2 будуть повторені для знову надходження запиту.
Набір дій з реалізації етапу 3 полягає у відновленні контексту перерваної програми. Так само, як і на етапі 1, на даному останньому етапі є дії, що виконуються мікропроцесором автоматично, і дії, що зачіпають програмістом. Основне завдання на етапі 3 - привести стек у стан, в якому він був відразу після передачі управління даною процедурою. Для цього програміст вказує необхідні дії з відновлення регістрів та очищення стека. Ця ділянка коду необхідно захистити від можливості спотворення вмісту регістрів (в результаті появи апаратного переривання) за допомогою команди cli. Останні команди у процедурі обробки переривання - sti і iret, при обробці яких мікропроцесор виконує наступні дії:
1) sti - дозволити апаратні переривання по входу INTR;
2) iret - витягти послідовно три слова з стека і помістити їх, відповідно, в регістри ip, cs, flags.
У результаті етапу 3 управління повертається черговий команді перерваної програми, яка повинна була виконається, якщо б переривання не було.
Апаратні переривання можуть бути ініційовані програмно командою мікропроцесора int n, де n - номер апаратного переривання у відповідність з таблицею векторів переривань. При цьому мікропроцесор також скидає прапор IF, але не виробляє сигнал INTA.

Написання власного переривання
Є кілька причин для написання власного переривання. По-перше, більшість з готових переривань, забезпечуваних операційній системі, ніщо інше, як звичайні процедури, доступні для всіх програм, тому можна додати щось своє. Наприклад, багато програм можуть використовувати процедуру, що виводить рядки на екран вертикально. Замість того, щоб включати її в кожну програму як процедури можна встановити її як переривання, написавши програму, яка залишиться резидентної в пам'яті після завершення. Тоді, наприклад, можна використовувати int 80h замість WRITE_VERTICALLY (виклик переривання кілька повільніше, ніж виклик процедури).
Другою причиною написання переривання може бути використання будь-якого окремого апаратного переривання. Це переривання автоматично викликається при виникненні певних умов. У деяких випадках BIOS ініціалізує вектор цього переривання так, що він вказує на процедуру, яка взагалі нічого не робить (вона містить лише iret). Можна написати свою процедуру і змінити вектор переривань, щоб він вказував на неї. Тоді при виникненні апаратного переривання буде виконуватися нами написана процедура. Одна з таких процедур це переривання часу доби, яке автоматично викликається 18,2 рази в секунду. Зазвичай це переривання тільки оновлює показання годин, але можна змінити його код як завгодно програмісту.
І, нарешті, виникає іноді бажання написати переривання, яке повністю замінить одну з процедур ОС, пристосоване до програмних потреб.
Розглянемо приклад розробки переривання в загальному випадку.
Функція 25h переривання 21h встановлює вектор переривання на вказану адресу cs: ip. Щоб встановити вектор, який вказує на одну з ваших процедур, потрібно помістити сегмент процедури в ds, а зсув у dx. Потім потрібно помістити номер переривання в al і викликати функцію. Будь-яка процедура переривання повинна завершуватися не звичайної інструкцією RET, а IRET (IRET виштовхує з стека три слова, включаючи регістр прапорів, у той час як RET поміщає на стек тільки два, якщо ви спробуєте тестувати таку процедуру як звичайну процедуру, але кінчається IRET, то Ви вичерпаєте стек.). Відзначимо, що функція 25H автоматично забороняє апаратні переривання в процесі зміни вектора, тому не існує небезпеки, що посеред дороги відбудеться апаратне переривання, що використовує даний вектор.
Коли програма завершується, повинні бути відновлені оригінальні вектора переривань. В іншому випадку наступна програма може викликати дане переривання і передати управління на те місце в пам'яті, в якому Вашої процедури вже немає. Функція 35 переривання 21H повертає поточне значення вектора переривання, поміщаючи значення сегмента в ES, а зсув у BX. Перед установкою свого переривання отримаєте поточне значення вектора, використовуючи цю функцію, збережіть ці значення, і потім відновіть їх за допомогою функції 25H (як вище) перед завершенням своєї програми.
Наприклад:
; --- В сегменті даних:
KEEP_CS DW 0; зберігає сегмент замінного переривання
KEEP_IP DW 0; зберігає усунення переривання
; --- На початку програми
MOV AH, 25H; функція отримання вектора
MOV AL, 1CH; номер вектора
INT 21H; тепер сегмент в ES, зсув в BX
MOV KEEP_IP, BX; запам'ятовуємо зсув
MOV KEEP_CS, ES; запам'ятовуємо сегмент
; --- В кінці програми
CLI
PUSH DS; DS буде зруйнований
MOV DX, KEEP_IP; підготовка до відновлення
MOV AX, KEEP_CS;
MOV DS, AX; підготовка до відновлення
MOV AH, 25H; функція установки вектора
MOV AL, 1CH; номер вектора
INT 21H; відновлюємо вектор
POP DS; відновлюємо DS
STI
Є пара пасток, яких слід уникати при написанні переривання. Якщо нова процедура переривання повинна мати доступ до даних, то необхідно подбати, щоб DS був правильно встановлений (зазвичай переривання може використовувати стек викликає програми). Інша неприємність може полягати в тому, що при завершенні програми по Ctrl-Break вектор переривання не буде відновлений, якщо тільки Ви не передбачте, щоб програма реакції на Ctrl-Break виконувала цю процедуру.

Список використовуваної літератури:
1) «Assembler. Підручник »В. Юров, вид. «Пітер», 2000
2) «Асемблер і програмування для IBM PC» Пітер Абель, вид. технологічний інститут «Британська Колумбія»
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Доповідь
54кб. | скачати


Схожі роботи:
Системне програмування
Системне програмування в операційних системах
Системне програмування і операційні системи
Системне програмування та операційні системи
Системне програмне забезпечення
Системне програмне забезпечення
Системне програмне забезпечення С
Основні поняття математичного програмування Побудова моделі задачі лінійного програмування
Системне програмне забезпечення ЕОМ
© Усі права захищені
написати до нас