2.4.3. Исключения FPU

При выполнении команд FPU могут возникать шесть типов особых ситуаций, называемых исключениями. При возникновении исключения соответствующий флаг в регистре SR устанавливается в 1 и, если маска этого исключения в регис­тре CR не установлена, вызывается обычное прерывание INT 10h (если бит NE в регистре центрального процессора CRO установлен в 1) или IRQ13 (INT 75h), обработчик которого может прочитать регистр SR, чтобы определить тип исклю­чения (и FIP, и FDP) и команду, которая его породила, а затем попытаться: испра­вить ситуацию. Если бит маски наступившего исключения в регистре CR уста­новлен в 1, по умолчанию выполняются следующие действия:

а неточный результат, результат округляется в соответствии с битами RC (на самом деле это исключение происходит очень часто; например: дробь 1/6 не может быть представлена десятичным вещественным числом любой точно­сти и округляется). При этом флаг С1 показывает, в какую сторону про­изошло округление: 0 - вниз, 1 - вверх;

□ антипереполнение: результат слишком мал, чтобы быть представленным обычным числом, - он преобразуется в денормализованное число;

□ переполнение: результат преобразуется в бесконечность соответствующего знака;

а деление на ноль: результат преобразуется в бесконечность соответствующе­го знака (учитывается и знак нуля); а денормализованный операнд: вычисление продолжается, как обычно; а недействительная операция: результат определяется из табл. 12.

Таблица 12. Результаты операций, приводящих к исключениям

Операция

Результат

Ошибка стека

Неопределенность

Операция с неподдерживаемым числом

Неопределенность

Операция с SNAN

0ЫДЫ

Сравнение числа с NAN

СО = С2 = СЗ = 1

Сложение бесконечностей с одним знаком или вычитание - с разным

Неопределенность

Умножение нуля на бесконечность

Неопределенность

Деление бесконечности на бесконечность или О/О

Неопределенность

Команды FPREM и FPREM1, если делитель - 0

или делимое - бесконечность

Неопределенность и С2 = 0

Тригонометрическая операция над бесконечностью

Неопределенность и С2 = 0

Корень или логарифм, если х < 0, log(x+1), если х < -1

Неопределенность

FBSTP, если регистр-источник пуст, содержит NAN, бесконечность или превышает 18 десятичных знаков

Десятичная неопределенность

FXCH, если один из операндов пуст

Неопределенность