-----------------------------------------------------------------|Код Команда Число Описание ||операции тактовых || циклов ||CC INT 3 26 Прерывание 3 - || ловушка для отладчика ||CC INT 3 44 Прерывание 3 -Защищенный режим,|| та же привилегированность ||CC INT 3 71 Прерывание 3 -Защищенный режим,|| большая привилегированность ||CC INT 3 82 Прерывание 3 - из режима V86, к|| уровню прив-сти PL 0 ||CC INT 3 37+TS Прерывание 3 -Защищенный режим,|| через шлюз задачи ||CD ib INT imm8 30 Прерывание, заданное непосред- || ственным байтом ||CD ib INT imm8 44 Прерывание - Защищенный режим,|| та же привилегированность ||CD ib INT imm8 71 Прерывание - Защищенный режим,|| большая привилегированность ||CD ib INT imm8 86 Прерывание - из режима V86, к|| уровню прив-сти PL 0 ||CD ib INT imm8 37+TS Прерывание - Защищенный режим,|| через шлюз задачи ||CE INTO Успешно:28 Прерывание 4 - Если флаг пере- || Сбой : 3 полнения равен 1 ||CE INTO 46 Прерывание 4 -Защищенный режим,|| та же привилегированность ||CE INTO 73 Прерывание 4 -Защищенный режим,|| большая привилегированность ||CE INTO 84 Прерывание 4 - из режима V86, к|| уровню прив-сти PL 0 ||CE INTO 39+TS Прерывание 4 -Защищенный режим,|| через шлюз задачи |----------------------------------------------------------------- Примечание: приближенные значения ts задаются следующей таблицей: ----------------------------------------------------------------- | Новая задача Старая задача |------------------------------------------- | к TSS i486 | к TSS 80286 | к TSS VM----------------------------------------------------------------- VM/i486/TSS 80286 | 199 | 180 | 177----------------------------------------------------------------- Работа команды Примечание: Следующее операционное описание применимо не толькок вышеупомянутым командам, но и к внешним прерываниям иисключениям. IF PE = 0THEN GOTO РЕЖИМ-РЕАЛЬНЫХ-АДРЕСОВ;pELSE GOTO ЗАЩИЩЕННЫЙ РЕЖИМ;FI; РЕЖИМ-РЕАЛЬНЫХ_АДРЕСОВ: Push(FLAGS); IF <- 0; (* Очистить флаг прерывания *) TF <- 0; (* Очистить флаг ловушки *) Push(CS); Push(IP); (* Коды ошибки в стек не помещались *) CS <- IDT[Номер прерывания * 4].селектор; IP <- IDT[Номер прерывания * 4].смещение; ЗАЩИЩЕННЫЙ-РЕЖИМ: Вектор прерывания должен быть в пределах границы таблицы IDT, иначе #GP(номер вектора * 8 + 2 + EXT); Байт дескриптора AR должен указывать на шлюз прерывания, шлюз ловушки или шлюз задачи, иначе #GP(номер вектора * 8 + 2 + EXT); IF программное прерывание (* т.е. вызванное INT n, INT 3 или INTO *) THEN IF DPL дескриптора шлюза < CPL THEN #GP(номер вектора * 8 + 2 + EXT); FI; FI; Шлюз должен присутствовать, иначе #NP(номер вектора * 8 + 2 + EXT); IF шлюз ловушки OR шлюз прерывания THEN GOTO ШЛЮЗ-ПРЕРЫВАНИЯ-ИЛИ-ШЛЮЗ-ПРЕРЫВАНИЯ; ELSE GOTO ШЛЮЗ-ЗАДАЧИ; FI; ШЛЮЗ-ЛОВУШКИ-ИЛИ-ШЛЮЗ-ПРЕРЫВАНИЯ: Рассмотрим селектор CS и дескриптор, заданный в дескрипторе шлюза; Селектор должен быть не-пустым, иначе #GP(EXT); Селектор должен быть в границах его дескрипторной таблицы ELSE #GP(селектор+EXT); Байт дескриптора AR должен указывать кодовый сегмент ELSE #GP(селектор+EXT); Сегмент должен присутствовать, иначе #NP(селектор+EXT); IF не-конформный кодовый сегмент AND DPL < CPL THEN GOTO ПРЕРЫВАНИЕ-НА-ВНУТРЕННЕЕ-КОЛЬЦО-ПРИВИЛЕГИРОВАННОСТИ; ELSE IF конформный кодовый сегмент AND DPL = CPL THEN GOTO ПРЕРЫВАНИЕ-НА-ТОТ-ЖЕ-УРОВЕНЬ-ПРИВИЛЕГИРОВАННОСТИ; ELSE #GP(селектор CS + EXT); FI; FI; ПРЕРЫВАНИЕ-НА-ВНУТРЕННЕЕ-КОЛЬЦО-ПРИВИЛЕГИРОВАННОСТИ: Проверка селектора и дескриптора нового стека в текущем TSS; Селектор должен быть не-пустым, иначе #TS(EXT); Индекс селектора должен быть в границах дескрипторной таблицы ELSE #TS(селектор SS + EXT); RPL селектора должен быть равен DPL кодового сегмента ELSE #TS(селектор SS + EXT); RPL сегмента стека должен быть равен DPL кодового сегмента ELSE #TS(селектор SS + EXT); Дескриптор должен указывать на доступный для записи сегмент данных ELSE #TS(селектор SS + EXT); Сегмент должен присутствовать ELSE #SS(селектор SS + EXT); IF 32-битовый шлюз THEN новый стек должен иметь место для 20 байтов иначе #SS(0) ELSE новый стек должен иметь место для 10 байтов иначе #SS(0) FI; Указатель команд должен быть в границах сегмента CS иначе #GP(0); Загрузка нового значения SS и eSP из TSS; IF 32-байтовый шлюз THEN CS:EIP <- селектор:смещение из шлюза; ELSE CS:IP <- селектор:смещение из шлюза; FI; Загрузка дескриптора CS в невидимую часть регистра CS; Загрузка дескриптора SS в невидимую часть регистра SS; IF 32-битовый шлюз THEN Push (дальний указатель на старый стек) (* 3 слова дополняются заполнителями до 4 *); Push (EFLAGS); Push (дальний указатель на адрес возврата) (* 3 слова дополняются заполнителями до 4 *); ELSE Push (дальний указатель на старый стек) (* 2 слова *) Push (FLAGS); Push (дальний указатель на адрес возврата) (* 2 слова *) FI; Установка CPL в значение DPL нового кодового сегмента; Установка RPL CS в значение CPL; IF шлюз прерывания THEN IF <- 0 (* флаг прерывания 0 (запрещение) *); FI; TF <- 0; NT <- 0; ПРЕРЫВАНИЕ-ИЗ-РЕЖИМА-V86: ВремEFlags <- EFLAGS; VM <- 0; TF <- 0; IF обслуживается через шлюз прерывания THEN IF <- 0; ВремSS <- SS; ВремESP <- ESP; SS <- TSS.SS0; (* изменение на стековый сегмент уровня 0 *) ESP <- TSS.ESP0; (* изменение на стековый сегмент уровня 0 *) Push(GS); (* Дополняется до двух слов *) Push(FS); (* Дополняется до двух слов *) Push(DS); (* Дополняется до двух слов *) Push(ES); (* Дополняется до двух слов *) GS <- 0; FS <- 0; DS <- 0; ES <- 0; Push(ВремSS); (* Дополняется до двух слов *) Push(ВремESP); Push(ВремEflags); Push(CS); (* Дополняется до двух слов *) Push(EIP); CS:EIP <- селектор:смещение из шлюза прерывания;(* Начинается выполнение новой подпрограммы в защищенном режиме *) ПРЕРЫВАНИЕ-НА-ТОТ-ЖЕ-УРОВЕНЬ-ПРИВИЛЕГИРОВАННОСТИ: IF 32-битовый шлюз THEN Границы текущего стека должны позволить поместить туда 10 байтов, иначе #SS(0); ELSE Границы текущего стека должны позволить поместить туда 6 байтов, иначе #SS(0); FI; IF прерывание было вызвано исключением с кодом ошибки THEN Границы стека должны позволить поместить туда еще 2 байта; ELSE #SS(0); FI; Указатель команд должен находиться в границах CS, иначе #GP(0); IF 32-битовый шлюз THEN Push(EFLAGS); Push(дальний указатель на адрес возврата); (* 3 слова, дополненные до 4 слов *) CS:IP <- селектор:смещение из шлюза; ELSE (* 16-битовый шлюз *) Push(FLAGS); Push(дальний указатель на адрес возврата); (* 2 слова *) CS:IP <- селектор:смещение из шлюза; FI; Загрузка дескриптора CS в невидимую часть регистра CS; Установка поля RPL CS равным CPL; Push(код ошибки); (* если он имеется *) IF шлюз прерывания THEN IF <- 0; FI; TF <- 0; NT <- 0; ШЛЮЗ-ЗАДАЧИ: Рассмотрим селектор CS, заданный в дескрипторе шлюза задачи; В бите Локальный/Глобальный должно быть задано значение Глобальный, иначе #TS(селектор TSS); Индекс должен быть в границах GDT, иначе #TS(селектор TSS); Байт AR должен задавать доступный TSS (нижние биты 00001), иначе #TS(селектор TSS); TSS должен присутствовать, иначе #NP(селектор TSS); ПЕРЕКЛЮЧЕНИЕ-ЗАДАЧ со вложенностью в TSS; IF прерывание было вызвано сбоем с кодом ошибки THEN Границы стека должны позволить поместить туда еще 2 байта, иначе ##SS(0); Помещение в стек код ошибки; FI; Указатель команд должен быть в пределах CS, иначе #GP(0); ОписаниеКоманда INT n программно генерирует вызов оработчика прерывания.Непосредственный операнд, от 0 до 255, задает номер индекса в таблицедескрипторов прерываний (IDT) для вызываемой подпрограммы прерывания. Взащищенном режиме IDT состоит из массива восьми-байтовых дескрипторов;дескриптор для активизированного прерывания должен обозначать шлюзпрерывания, ловушки или задачи. В режиме реальных адресов IDT представляетсобой массив из указателей длиной в четыре байта. В защищенном режиме ирежиме реальных адресов базовый линейный адрес IDT определен содержимымIDTR.Условная команда INTO идентична команде прерывания INT n, за исключениемтого, что номер прерывания неявно устанавливается равным 4, и прерываниепроисходит только при установленном флаге переполнения процессора i486.Первые 32 прерывания резервированы Intel для системных целей. Некоторые изэтих прерываний используются для внутренних исключений.Команда INT n в целом ведет себя как дальний вызов, за исключением того,что флаговый регистр помещается в стек до адреса возврата. Процедурыпрерывания выполняют возврат посредством команды IRET, которая извлекаетиз стека флаги и адрес возврата.В режиме реальных адресов команда INT n помещает в стек флаги, регистр CSи IP для возврата в указанной последовательности и затем выполняет переходк дальнему указателю, индексируемому номером прерывания. Изменяемые флагиОтсутствует Исключения защищенного режима#GP, #NP, #SS и #TS, как указано выше в разделе "Работа команды". Исключения режима реальных адресовОтсутствуют; если регистр SP или ESP равен 1, 3 или 5 перед выполнениемкоманды INT или INTO, то процессор переходит в режим закрытия вследствиенедостаточного размера стека. Исключения виртуального режима 8086Сбой #GP(0), если IOPL меньше 3, только для команды INT n, что позволяетэмуляцию; Прерывание 3 (0CCH) генерирует исключение контрольной точки;команда INTO генерирует исключение переполнения при установленном флагеOF.