Команда INT инициирует в процессоре процедуру прерывания, в результате которой управление передается программе обработки прерывания с номером n, который указан в качестве операнда команды INT. В стек прерываемого процесса (текущей программы) заносится содержимое регистра флагов, сегментного регистра CS и указателя команд IP. Затем сбрасывается флажок IF, запрещая внешние прерывания и исключая появление других сигналов прерывания во время процедуры перехода. Наконец из таблицы векторов прерываний в регистры IP и CS передается содержимое двух слов, расположенных по адресам 0: n 4и 0: n 4+2. Процессор, выполняя свой базовый цикл работы, формирует адрес первой команды программы обработки данного прерывания, исполняет ее и все последующие команды программы. В конце программы находится команда IRET, которая восстанавливает из стека содержимое IP и CS основной программы и ее выполнение продолжается с команды стоящей следующей за командой INT.
Прерывания могут быть инициированы внешним устройством системы или специальной командой прерывания из программы. У микропроцессора 8086 есть три различные команды прерывания - две команды вызова и одна команда возврата:
Команда INT (interrupt - прерывать) имеет формат
INT тип_прерывания
где тип_ прерывания - номер, идентифицирующий один из 256 различных векторов, находящихся в памяти. Таким образом, каждому из 256 прерываний соответствует один вектор (4 байта памяти, где хранятся IP и CS программы обработки прерывания). При исполнении команды INT микропроцессор производит следующие действия:
1. Помещает в стек регистр флагов.
2. Обнуляет флаг трассировки TF и флаг включения-выключения прерываний IF для исключения пошагового режима исполнения команд и блокировки других маскируемых прерываний.
|
3. Помещает в стек значение регистра CS.
4. Вычисляет адрес вектора прерывания, умножая тип_прерывания на 4.
5. Загружает второе слово вектора прерывания в регистр CS.
6. Помещает в стек значение указателя команд IP.
7. Загружает в указатель команд IP первое слово вектора прерывания.
8. Устанавливает флаги IP и TF.
Итак, после исполнения команды INT в стеке окажутся значения регистра флагов и регистров CS и IP, флаги TF и IF будут равны 0, а пара регистров CS:IP будет указывать на начальный адрес программы обработки прерывания.
256 векторов прерывания размещаются в области памяти с младшими адресами. Так как каждый из них имеет длину 4 байта, то все они занимают первые 1К байтов, т.е. область памяти с абсолютными адресами от 0до 3FFH. Например, команда
INT 21Н
заставит микропроцессор 8086 вычислить адрес вектора 54Н (4 21Н). Следовательно, он получит 16-битовые значения регистров IP и CS, отвечающие программе обработки прерывания, из ячеек 54Н и 56Н соответственно.
Из 256 типов прерываний фирма Intel зарезервировала первые 5 (от 0 до 4) для внутренних прерываний. В IBM PC многие другие типы прерываний зарезервированы для нужд основной системы ввода-вывода (BIOS), а также для операционной системы DOS.
INTO - команда прерывания по переполнению
Команда INTO (interrupt if overflow - прервать при переполнении) представляет собой команду условного прерывания. Она инициирует прерывание лишь тогда, когда флаг переполнения OF равен 1. В этом случае команда INTO передает управление программе обработки прерывания с помощью косвенного вызова через вектор прерывания 4. (Другими словами, команда INTO инициирует прерывание типа 4.)