Как только модуль обработки операций с плавающей точкой был проинициализирован, и началось нормальное выполнение, модуль обработки операций с плавающей точкой может потребовать внимания, чтобы обработать числовые исключения. В этой главе рассматривается написание программных обработчиков числовых исключений.
Если модуль обработки операций с плавающей точкой встречает немоскированное исключение, то сразу перед выполнением следующей команды WAIT или неуправляющей команды с плавающей точкой вызывается программный обработчик исключений. Вызов происходит через вектор прерывания 16 или через внешнее прерывание, в зависимости от значения бита NE регистра управления CR0.
Если NE=1, то немаскированное исключение с плавающей точкой вызывает прерывание 16, непосредственно перед выполнением следующей неуправляющей команды с плавающей точкой или команды WAIT. Прерывание 16 есть сигнал операционной системе о необходимости вызова обработчика исключений. В главе 9 даны общие сведения об исключениях и прерываниях процессора i486.
Если NE=0 (и ввод IGGNE# не активен), немаскированное исключение "замораживает" процессор сразу перед выполнением следующей неуправляющей команды с плавающей точкой или команды WAIT. "Замороженный" процессор ожидает внешнее прерывание, которое должно быть поддержано внешней аппаратурой в ответ на вывод процессора FERR#. (Независимо от значения NE немаскированное исключение заставляет вывод FERR# быть активным.) В этом случае внешнее прерывание вызывает программу обработки исключения. Усли NE=0, но ввод IGGNE# активен, то процессор не обращает внимание на исключение и продолжает работу. Обработка ошибок через внешние прерывания поддерживается для DOS, совместимых с процессором. В Главе 25 даны некоторые предложения по совместимости.
При обработке ошибок вычислений процессор должен:
Не нарушить числовой контекст.
Сбросить ошибку и попытаться от нее избавиться.
Хотя способы решения этих проблем меняются от реализации к реализации, большинство обработчиков должны выполнять следующие основные действия:
Сохранить среду модуля обработки операций с плавающей точкой (слова управления, статуса, признака, операнды и ссылки на команды), какой она была время генерации исключения.
Очистить бит исключения в слове состояния.
Замаскировать прерывания.
Распознать исключение, проанализировав слова управления и статуса в сохраненной среде.
Принять системно-зависимые меры по корректировке ситуации.
Вернуться к прерванной программе и возобновить нормальное выполнение.