русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

CALL/INTO - Вызов процедуры прерывания


Дата добавления: 2015-06-12; просмотров: 648; Нарушение авторских прав


-----------------------------------------------------------------|Код Команда Число Описание ||операции тактовых || циклов ||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.


<== предыдущая лекция | следующая лекция ==>
INS/INSB/INSW/INSD - Ввод из порта в строку | IRET/IRETD - Возврат из прерывания


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.085 сек.