Переполнение и антипереполнение
Ситуации переполнения и антипереполнения возникают в случаях, когда порядок
результата слишком велик или слишком мал для формата приемника. При воз-
никновении этих исключений в регистре SWR устанавливаются флаги ОЕ (Overflow)
(Underflow). Эти исключения маскируются битами ОМ и UM регистра
ления CWR. Исключения могут возникнуть при работе арифметических команд и ко-
манд, преобразующих формат операндов, таких как FST.
Маскированная реакция для ситуации переполнения состоит в формировании
граничных (максимальных или минимальных) значений,
в сопро-
цессоре, или специального численного значения в виде знаковой бесконечности.
Немаскированная реакция на возникновение этих исключений зависит от того,
где должен формироваться результат. Если приемник — память, то мантисса ре-
зультата округляется, а порядок приводится к середине своего диапазона. Если
приемник — ячейка памяти, то значение в ней не запоминается, при этом не изме-
няется и содержимое регистра стека.
Неточный результат
Исключение неточного результата возникает в случае, когда результат работы ко-
манды нельзя точно представить в формате приемника и его приходится округ-
лять. Например, вычисление любой периодической дроби вроде 1/3 будет приво-
дить к возникновению такого типа исключения. В какую сторону произошло
можно судить по значению бита С1:
если С1 = 0, то результат был усечен;
если С1 = 1, то результат был округлен в большую сторону.
При возникновении этих исключений в регистре
устанавливаются флаг РЕ
(Precision). Исключение маскируется битом РМ регистра управления CWR.
Немаскируемая обработка исключений
Как производить немаскируемую обработку исключений? Для этого необходимо
установить в ноль те флаги в регистре CWR, которые соответствуют интересующим
нас типам исключений. Далее нужно написать обработчик исключения, реализу-
ющий последовательность действий по корректировке ситуации, приведшей к ис-
ключению. Неясным остается вопрос о том, как передать управление обработчику
исключения? Для ответа на него нужно разобраться с
взаимодействия
процессора и сопроцессора при возникновении исключения.
В главе 2 мы упоминали о существовании группы системных регистров про-
цессора. В контексте нашего рассмотрения интерес представляет один из них —
регистр CRO. Он имеет несколько битов, имеющих отношение к сопроцессору
(табл. 17.3).
Таблица
Биты CRO, имеющие отношение к сопроцессору
Положение
бита в CRO
1
Название
бита
МР (Math
Present)
Назначение
Сопроцессор присутствует. Бит должен быть
установлен в 1
Исключения сопроцессора и их обработка 503
Положение
бита в CRO
2
3
4
5
Название
бита
ЕМ
Math)
TS
ET
Type)
NE (Numeric
Назначение
Эмуляция сопроцессора. Когда ЕМ 1, выполнение
любой команды сопроцессора вызывает исключение 7.
В программах для микропроцессосоров
это позволяло иметь альтернативные фрагменты кода
для выполнения одинаковых вычислений
с использованием команд сопроцессора (ЕМ 0)
и без них (ЕМ =
то есть тогда, когда в конкретной
конфигурации компьютера сопроцессор отсутствует
Задача переключена. Бит предназначен для
согласования контекстов основного процессора
и сопроцессора. Бит TS устанавливается в единицу
при каждом переключении задачи. Состояние этого
бита проверяется процессором, если очередной
выбранной командой является команда сопроцессора.
Если бит TS установлен в единицу, то процессор
возбуждает исключение 7, обработчик которого
выполняет необходимые действия, возможно,
по сохранению или восстановлению контекста
вычислений с плавающей точкой. С битом TS
работает команда CLTS, которая устанавливает
значение этого бита в 0
Тип расширения. Единичное значение этого бита
означает поддержку инструкций сопроцессора
Численная ошибка. Бит определяет способ обработки
исключений сопроцессора: через сигнал внешнего
прерывания или путем генерации исключения
(см. далее)
Начиная с модели i486 процессор и сопроцессор размещаются в одном корпу-
се. Это упростило организацию взаимодействия между ними. Рассмотрим процес-
сы, протекающие в
при возникновении одного из шести перечислен-
ных ранее
сопроцессора. При возникновении ситуации исключения
сопроцессор устанавливает бит суммарной ошибки ES в регистре состояния SWR
и формирует на однс м из своих выходов сигнал ошибки. Этот сигнал ошибки од-
новременно
самим
который генерирует исключе-
ние 10h, и в то же самое время, независимо от процессора, заводится на вход
программируемого контроллера прерываний, обработчик которого вызывается
через вектор прерывания 75h [8]. Таким образом, появление сигнала ошибки на
выходе сопроцессора приводит к генерации в основном процессоре двух исключе-
ний с номерами
я 75h.
Исключение
синхронным, так как вызов его обработчика санк-
ционируется
при выполнении команд
Данные команды
в процессорах i486 и Pentium встроены практически во все команды сопроцессора
за исключением некоторых команд управления, поэтому работа любой команды
сопроцессора начинается с выяснения того, было ли зафиксировано какое-нибудь
504 Глава 17. Архитектура и программирование сопроцессора
из незамаскированных исключений. Здесь важно то, что контекст вычислитель-
ной ситуации после выполнения
вызвавшей исключение, оказывается
полностью сформированным (так как исключение синхронное, то есть ожидаемое)
и с ним можно корректно работать.
Если сигнал поступает на вход программируемого контроллера прерываний
IRQ13, то обработка исключения 75h может начаться в процессоре раньше, чем
в сопроцессоре закончит выполняться команда, вызвавшая исключение, то есть
в этом случае обработка прерывания является асинхронной к вычислительному
процессу.
Необходимо отметить влияние бита
на процессы, протекающие в компьюте-
ре при возникновении исключения. Его состояние определяет стиль обработки
исключения процессором. Если бит NE = 1, то процессор возбуждает исключение
16 (обработка в стиле
и выше), если NE = 0, то при возникновении исключения
процессор останавливается и ждет прерывания от программируемого контролле-
ра прерываний (обработка в стиле
По умолчанию бит
устанавливается в 0.
Если посмотреть на распределение прерываний в реальном и защищенном ре-
жимах, то необходимо обратить внимание на номер 7 вектора прерываний — обра-
щение к несуществующему сопроцессору. Прерывание появилось в процессоре
для которого сопроцессор не являлся обязательным устройством. Для того чтобы
программа, выполняющая математические вычисления, была независимой от ап-
паратной конфигурации конкретного компьютера, писалось два варианта фраг-
ментов кода, на которых эти вычисления выполнялись, — один с использованием
команд сопроцессора и второй с использованием целочисленных команд. При рас-
познавании в потоке команд инструкций сопроцессора процессоры
и
про-
веряли бит эмуляции сопроцессора ЕМ (см. табл. 17.3). Если он был равен 1, то
процессор возбуждал исключение 7. Это означало, что сопроцессора в конфигура-
ции компьютера нет и его функции должны эмулироваться командами целочис-
ленного устройства. Забота об установке бита ЕМ ложилась на системное программ-
ное обеспечение.
Для процессоров i486 и Pentium состояние вычислительной среды определяет-
ся состоянием регистров после выполнения команды FINIT и содержимым регист-
ра CRO (биты МР и NE).
Что должен делать обработчик исключений сопроцессора? Его действия зави-
сят от того, какое незамаскированное исключение им обрабатывается. Следует
отметить основные действия по обработке любого исключения.
1. Сохранение среды сопроцессора командой
Это необходимо для после-
дующего выяснения причин исключения, а в среде сопроцессора как раз и за-
фиксировано состояние регистров управления сопроцессором при возникно-
вении исключения.
2. Сброс установленных битов исключений в регистре SWR для предотвращения
циклического возникновения исключений.
3. Выяснение типа исключения. Если незамаскированными являются исключе-
ния нескольких типов, то обработчик путем анализа соответствующих битов
в регистре SWR должен определить их. Заметим, что содержимое
берется из
сохраненной при входе в процедуру по команде FSTENV среды сопроцессора.
отладчика 505
4. Выполнение
по корректировке ситуации.
5. Возвращение в
программу (командой IRET).
Однако выяснить причину исключения мало,
это и несложно. Важно, испра-
вив ситуацию, вернуть управление прерванной программе. В защищенном режи-
ме работы процессора прерывания (исключения) делятся на несколько групп: сбои,
ловушки, исключения. Это деление осуществляется в зависимости от того, какая
информация
тся о месте возникновения прерывания (исключения) и воз-
можности
прерванной программы. Для сопроцессора ситуация ана-
логична. Здесь инфор мация о месте возникновения исключения зависит от типа
исключения. Так, для исключений недействительной операции, деления на ноль
и
операнда запоминается адрес команды, вызвавшей исклю-
чение. То есть
для этих типов исключений распознается, и исключение
возбуждается до исполнения команды сопроцессора (по классификации для за-
щищенного режима -• это сбой). При этом операнды в стеке
памяти не моди-
фицируются. Для
типов исключений ошибочная ситуация распознает-
ся после выполнения действий «виноватой» команды. Это означает, что в стеке
в качестве адреса
возникновения исключения запоминается адрес
щей (после виновниц
команды программы. При этом операнды в памяти и в ре-
гистровом стеке, возможно, будут изменены. Ваши действия должны учитывать
эти особенности возникновения различных типов исключений.
i
!
Do'stlaringiz bilan baham: |