Прерывания и особые ситуации: Условия генерации и особенности обработки исключений FPU |
Программирование - Архитектура и система команд микропроцессоров x86 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Недействительная операция (#I) Существует два класса операций, которые могут вызывать исключение недействительная операция: стековые и арифметические. В случае возникновения этого исключения устанавливается флаг SW.IE, а флаг SW.SF идентифицирует тип ошибки.
Денормализованный операнд (#D) Исключение "денормализованный операнд" индицируется флагом SW.DE (бит 1). Оно генерируется в следующих случаях:
Во всех сопроцессорах, если исключение #D не замаскировано (CW.DM = 0), то при встрече денормализованного операнда происходит вызов обработчика исключений (операнды при этом не изменяются). Если исключение замаскировано (CW.DM = 1), то процессоры Intel387, Intel486, … производят преобразование встреченных денормализованных операндов к нормализованному виду. Сопроцессоры Intel287, 8087 в этом случае оперируют с денормализованными операндами по следующим правилам:
Деление на нуль (#Z) Исключение "деление на нуль" индицируется флагом SW.ZE (бит 2). Оно возникает при делении ненулевого операнда на нуль. Это возможно в командах F(I)DIV(R)(P), а также в неявно использующих деление командах FYL2X и FXTRACT. Если исключение не замаскировано (CW.ZM = 0), то вызывается обработчик исключения, исходные операнды и поле SW.TOP остаются неизменными. Если же исключение замаскировано (CW.ZM = 1), то происходит следующее:
Переполнение (#O) Исключение "переполнение" индицируется флагом SW.OE (бит 3). Оно генерируется, если результат операции превышает максимально допустимое значение для положительных чисел или минимально допустимое для отрицательных. Это может происходить в командах FST(P), F(I)ADD(P), F(I)SUB(R)(P), F(I)MUL(P), FDIV(R)(P), FSCALE, FYL2X, FYL2XP1. Исключение #O генерируется только в тех случаях, когда некорректным результатом операции является число в формате вещественного. Для случаев, когда результатом операции является целое или двоично-десятичное значение генерируется исключение #IA.
Если исключение "переполнение" замаскировано (CW.OM = 1), то возвращается одно из значений по таблице 3.8.
Таблица 3.8. Значения, возвращаемые, когда исключение "переполнение" замаскировано
Если исключение "переполнение" не замаскировано (CW.OM = 0), реакция сопроцессора зависит от того, предполагает команда поместить результат в стек или в память. Если назначением является стек, истинный результат делится на 224576 и округляется (до заданной полем PC слова управления точности в командах, где задание точности возможно, и до расширенной точности в других командах). Бит SW.C1 устанавливается, если произошло округление вверх. Если назначением является память, то в ней ничего не сохраняется, исходные операнды и поле SW.TOP остаются неизменными. Обработчик исключения может изменить исходные операнды и перезапустить команду, а также принудительно записать нужный результат в память и продолжить выполнение. В процессорах Intel387, Intel486, … , если исключение "переполнение" замаскировано и установлен режим округления к нулю, результатом операции, вызвавшей переполнение, является наибольшее положительное или наименьшее отрицательное число. Сопроцессоры Intel287 и 8087 не генерируют исключение "переполнение", если маскируемый отклик не является бесконечностью. Если исключение "переполнение" не замаскировано, то в процессорах Intel387, Intel486, … , когда результат запоминается в стеке, мантисса результата округляется в соответствии с полем PC слова управления или в соответствии с кодом операции; при этом флаг исключения точности устанавливается по результатам операции. В сопроцессорах Intel287 и 8087 округление не производится и флаг исключения точности не изменяется.
Антипереполнение (#U) Исключение "антипереполнение" индицируется флагом SW.UE (бит 4). Оно может быть вызвано командами FST(P), FADD(P), FSUB(R)(P), FMUL(P), F(I)DIV(R)(P), FSCALE, FPREM(1), FPTAN, FSIN, FSINCOS, FPATAN, F2XM1, FYL2XP1, которые выдают следующие результаты (только для вещественных, некорректные целые и двоично-десятичные результаты будут вызывать исключение #IA):
Исключение "антипереполнение" генерируется:
Если исключение "антипереполнение" замаскировано (CW.UM = 1), то возвращается денормализованный или нулевой результат, также может генерироваться исключение #P. Если исключение "антипереполнение" не замаскировано (CW.UM = 0), то реакция сопроцессора зависит от того, предполагает команда поместить результат в стек или в память. Если назначением является стек, истинный результат умножается на 224576 и округляется до заданной полем PC слова управления точности в командах, где задание точности возможно и до расширенной точности в других командах. Бит SW.C1 устанавливается, если произошло округление вверх. Если назначением является память, то в ней ничего не сохраняется, исходные операнды и поле SW.TOP остаются неизменными. Обработчик исключения может изменить исходные операнды и перезапустить команду, а также принудительно записать нужный результат в память и продолжить выполнение. В сопроцессорах Intel287 и 8087 когда округление производится к нулю, и маска установлена (CW.UM = 1), флаг антипереполнения выставляется по маленькому результату независимо от его точности/неточности. Когда маска неустановлена, и назначение — стек, то мантисса не округляется (то есть результат отличается от результата в Intel387, Intel486, … значением наименее значимого бита мантиссы).
Неточный результат (#P) Исключение "неточный результат" индицируется флагом SW.PE (бит 5). Оно возникает, если результат операции не может быть точно представлен в формате назначения (например, 1/3 не может быть точно представлена в двоичном виде). Команды вычисления трансцендентных функций (FSIN, FCOS, FSINCOS, FPTAN, FPATAN, F2XM1, FYL2X, FYL2XP1) всегда генерируют это исключение. При обнаружении неточного результата, который не вызывает генерации исключений "переполнение" и "антипереполнение", независимо от того, замаскировано (CW.PM = 1) или не замаскировано (CW.PM = 0) исключение "неточный результат", сопроцессор устанавливает флаг SW.PE и возвращает округленный результат. Метод округления задается текущим значением поля CW.RC. Бит SW.C1 показывает в какую сторону произведено округление: SW.C1 = 1 — вверх, SW.C1 = 0 — вниз. При округлении вниз наименее значимые биты результата обрезаются, с тем чтобы получившееся значение соответствовало заданному для него формату. Когда исключение "неточный результат" происходит вместе с исключением "переполнение" или "антипереполнение", то возможны следующие три варианта:
|
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru