При выполнении команд FPU могут возникать шесть типов особых ситуаций, называемых исключениями. При возникновении исключения соответствующий флаг в регистре SR устанавливается в 1 и, если маска этого исключения в регистре CR не установлена, вызывается обычное прерывание INT 10h (если бит NE в регистре центрального процессора CR0 установлен в 1) или IRQ13 (INT 75h), обработчик которого может прочитать регистр SR, чтобы определить тип исключения (и FIP, и FDP) и команду, которая его вызвала, а затем попытаться исправить ситуацию. Если бит маски наступившего исключения в регистре CR установлен в 1, выполняются следующие действия по умолчанию:
Таблица 12. Результаты операций, приводящих к исключениям
Операция | Результат |
Ошибка стека | Неопределенность |
Операция с неподдерживаемым числом | Неопределенность |
Операция с SNAN | QNAN |
Сравнение числа с NAN | C0 = C2 = C3 = 1 |
Сложение бесконечностей с одним знаком или вычитание — с разным | Неопределенность |
Умножение нуля на бесконечность | Неопределенность |
Деление бесконечности на бесконечность или 0/0 | Неопределенность |
Команды FPREM и FPREM1, если делитель — 0 или делимое — бесконечность | Неопределенность и C2 = 0 |
Тригонометрическая операция над бесконечностью | Неопределенность и C2 = 0 |
Корень или логарифм, если x < 0, log(x+1), если x < -1 | Неопределенность |
FBSTP, если регистр-источник пуст, содержит NAN, бесконечность или превышает 18 десятичных знаков | Десятичная неопределенность |
FXCH, если один из операндов пуст | Неопределенность |