Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Відповіді на залік по Ігнату(lg).doc
Скачиваний:
3
Добавлен:
14.09.2019
Размер:
3.87 Mб
Скачать

1.3.3. Внутрішні та програмні переривання.

Внутрішні та програмні переривання характеризуються типом, який або визначається заздалегідь (0 – 4), або знаходиться у коді команди (5 – 31) і зокрема:

  1. тип 0 (помилка при діленні) генерується МП після виконання команд ділення DIV, IDIV, якщо формат частки перевищує формат отримувача (тобто регістрів, що використовуються), або у разі ділення на нуль;

  2. тип 4 (переривання при переповнені) формується МП за однобайтовою командою INT0, якщо в результаті виконання будь-якої команди програми флаг переповнення ОF = 1, тобто команда INT0 – це переривання при переповненні;

  3. тип 1 (пошагове переривання) формується автоматично при встановленні флага Т = 1, і яке діє відразу після виконання будь-якої поточної команди. При виконанні однокрокового переривання МП виконує низку операцій, а саме: запис до стеку всіх флагів F, вмісту регістрів CS та IP, після чого скидаються флаги І та Т. По закінченні виконання підпрограми і отримання команди IRET (повернення з підпрограми) зі стека витягуються і записуються у МП флаги F і вміст регістрів ІР та CS.

Rem. МП ВМ 86 не має команд встановлення і скидання прапорця Т, більш того, відсутні команди, які б дозволили організовувати пересилки між старшими байтами регістра F та загальними регістрами МП. Стан флага Т можна змінити, діючи на нього після включення регістра F до стеку. Для включення регістра F і витягнення його зі стеку передбачені відповідні команди PUSHF, POPF. Значення Т = 1 встановлюється об’єднанням за логічною операцією “АБО” вмісту регістра F з константою 0100, а Т= 0 – об’єднанням по І з константою FEFF. Якщо встановлене Т = 1, то перше покрокове переривання буде мати місце після команди, що є наступною за командою повернення з підпрограми обробки покрокових переривань.

  1. тип n (5 – 31) визначається користувачем при написанні програми і виконується по двох байтовій команді INTn, де n задається у другому байті команди. Команда INTn викликає необхідну програму, як і команда CALL, але при переході до підпрограми команда INТn виконує запам’ятовування не лише адреси повернення (ІР, CS) але й регістра F.

  2. тип 3 викликається однобайтовою командою INT3 і визначається як переривання контрольної точки (точки розриву).

Rem. Контрольною точкою може бути будь-яке місце у програмі, де її нормальне виконання переривається і під час відлагодження вживаються деякі спеціальні заходи як то: індикація вмісту регістрів, чарунок пам’яті, портів вводу/виводу, а також для вставлення додаткового фрагмента програми без повторної трансляції.

1.3.4. Процедура обслуговування переривань.

Усі типи внутрішніх переривань мають ряд спільних ознак:

  1. код переривання повідомляється МП командою або включається в команду переривань;

  2. на виході МП не формуються сигнали;

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

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

Зв’язок між кодом, що визначає тип переривання, і підпрограмою обслуговування переривання встановлюється за допомогою таблиці покажчиків векторів переривання (Табл. 2). Вектори переривання займають 1Кб адресного простору (00000 – 003FF), при чому кожен вектор займає 4 чарунки пам’яті. Дві молодші адреси у векторі використовуються для запису зміщення у сегменті, а два старших байта – для базової адреси сегмента.

Таблиця 2.2.

Адреса

Тип

Коментар

00000

Тип 0 (ОД)

Переривання за помилкою ділення

00004

Тип 1 (ПР)

Покроковий режим

00008

Тип 2 (NMI)

Переривання по NMI

0000С

Тип 3

Переривання по INT3

00010

Тип 4

Переповнення INT0

00014

Тип 5

Резерв

.............................

......................

................................................

0007С

Тип 31

Резерв

00080

Тип 32

Користувача

..............................

......................

..............................................

003FC

Тип 255

Користувача

003FF

Rem. Тобто кожен елемент таблиці містить 2 слова, які визначають початкову логічну адресу підпрограми. При переході на підпрограму зміщення завантажується до ІР, адреса сегмента – до регістру CS. Оскільки розмір кожного елемента таблиці складає чотири байта, МП вираховує адресу (зміщення) потрібного елементу шляхом множення типа переривання на 4.

Формування адреси передачі керування на відповідну підпрограму обслуговування переривання в BIU відбувається так само, як і при звернені до будь-якої чарунки пам’яті, а саме: вміст двох молодших адрес вектора переривання записується в регістр ІР, вміст старших байтів – записується в регістр CS. Після цього вміст CS зміщується на чотири розряди вліво і додається до вмісту ІР, а отримане таким чином 20-розрядне число визначає фізичну адресу початку підпрограми переривання.

Коли виконується перехід до підпрограми обслуговування переривань вміст регістра F (разом з CS та IP) запам’ятовуються у стеку, після чого флаги І, та Т скидаються, чим автоматично забороняються зовнішні переривання по входу INTR (що необхідно для захисту початкової ділянки підпрограми, в якому відбувається включення до стеку внутрішніх регістрів МП). Потім підпрограма може дозволити зовнішні переривання командою STI, крім того, вона може бути перервана запитом по входу NMI і внутрішніми перериваннями. Необхідно слідкувати, щоб у підпрограмі не виникало переривань того ж самого типу, яке вона обслуговує, оскільки це призведе до нескінченого виклику тієї ж самої процедури.

В кінці підпрограми обслуговування переривань відновлюється вміст регістрів МП, які були включені до стеку на початку підпрограми з метою збереження даних, які відносяться до перерваної програми. Цю ділянку підпрограми треба захищати за допомогою команди CLI від переривань по входу INTR. Підпрограми обробки переривань мають закінчуватися командою повернення з переривання IRET, якій передує команда дозволу переривань STI. Перед виконанням команди IRET стек має бути у тому ж самому стані, що він був відразу після виклику підпрогами, що дозволяє команді IRET витягнути зі стеку три верхніх слова в регістри IP, CS, F. Це забезпечує повернення до тієї команди програми, яка б виконувалася наразі відсутності переривання.