Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорные системы (книга Комаров) / Программирование на Ассемблере (ч 2).doc
Скачиваний:
155
Добавлен:
08.03.2015
Размер:
380.93 Кб
Скачать

Команды прерываний

Для организации подпрограмм существует еще одна подгруппа команд, реализующая несколько иные действия по сравнению с командами CALL и RET. Команды этой подгруппы выполняют действия, практически идентичные действиям по обслуживанию аппаратных прерываний, что обусловило их название команды прерываний.

Основной командой этой подгруппы является команда INT, которая записывается в формате:

INT тип_прерывания,

где операнд "тип_прерывания" представляет собой некоторый номер из диапазона 0255, идентифицирующий конкретное прерывание.

В отличие от команды CALL команда INT осуществляет только дальний косвенный вызов процедуры по номеру прерывания. При этом косвенный адрес вызова считывается из специальной таблицы, называемой таблицей векторов прерываний (см. подраздел 3.13).

Таблица векторов прерываний включает в себя 256 элементов, каждый из которых представляет собой двойное слово. Элемент таблицы выбирается по номеру прерывания и содержит логический адрес начала подпрограммы в формате segment:offset. Этот адрес называется вектором прерывания.

При выполнении команды INT реализуются следующие действия:

1) записывается в стек содержимое регистра флагов F;

2) обнуляются флаги трассировки TF и разрешения прерываний IF;

3) записывается в стек адрес возврата CS:IP;

4) вычисляется адрес вектора прерывания путем умножения типа прерывания на 4;

5) загружается вектор прерывания в регистры CS,IP.

Таким образом, после выполнения команды INT в стеке окажутся значения регистров F, CS, IP, флаги TF и IF будут равны нулю, а регистры CS:IP будут указывать на начало подпрограммы, что и соответствует ее вызову.

При выполнении команды INT флаг трассировки TF автоматически сбрасывается с целью исключения пошагового режима выполнения вызванной подпрограммы, а флаг разрешения прерывания IF  с целью запрещения несанкционированных вложенных прерываний.

Для вызова прерываний с типами 3 и 4 могут использоваться альтернативные команды INT и INTO, которые записываются без операндов.

Однобайтная команда INT вызывает прерывание типа 3, которое определено как прерывание по контрольной точке. Контрольной точкой может быть любое место в программе, где нормальное ее выполнение прерывается и производятся некоторые специальные действия. Контрольные точки обычно вводятся при отладке с целью отображения состояния системы в критических местах программы. Эта команда также используется для наложения "заплат" на программу в процессе отладки, что позволяет исправлять ее без повторной трансляции.

Однобайтная команда INTO вызывает прерывание типа 4, которое определено как прерывание по переполнению. В отличие от всех остальных эта команда является командой условного прерывания, которое инициируется при OF=1. Если OF=0, то выполняется очередная команда программы. Команда INTO используется для контроля за переполнением и передачи управления в случае его возникновения соответствующей подпрограмме, которая анализирует сложившуюся ситуацию и принимает все необходимые решения. Команда INTO размещается за командами, при выполнении которых возможно возникновение переполнения (например, ADD, SUB, SAL, и т.п.).

Для возврата в основную программу из процедур, вызванных сигналами запроса или командами прерываний, служит команда IRET. Она отличается от команды RET лишь тем, что кроме адреса возврата CS:IP восстанавливает из стека еще и содержимое регистра флагов F. Это обеспечивает продолжение выполнения основной программы с точки прерывания с восстановлением состояния системы прерывания (флага IF) и пошагового режима (флага TF).