Assembler - язык неограниченных возможностей
0e1cc9b4

Исключения FPU


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

  • неточный результат: результат округляется в соответствии с битами RC (на самом деле это исключение происходит очень часто. Например: дробь 1/6 не может быть представлена точно десятичным вещественным числом любой точности и округляется). При этом флаг С1 показывает, в какую сторону произошло округление: 0 — вниз, 1 — вверх;
  • антипереполнение: результат слишком мал, чтобы быть представленным обычным числом, — он преобразуется в денормализованное число;
  • переполнение: результат преобразуется в бесконечность соответствующего знака;
  • деление на ноль: результат преобразуется в бесконечность соответствующего знака (учитывается и знак нуля);
  • денормализованный операнд: вычисление продолжается, как обычно;
  • недействительная операция: результат определяется из таблицы 12.
  • Таблица 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, если один из операндов пуст Неопределенность



    Содержание раздела