Ранее было отмечено, что регистр SWR отражает текущее состояние сопроцессора после выполнения последней команды. Далее перечислены поля, из которых струк- турно состоит регистр SWR (см. рис. 17.2). ■-- Шесть флагов исключительных ситуаций. S Бит SF (Stack Fault) — ошибка работы стека сопроцессора. Бит устанавливает- ся в единицу, если возникает одна из трех исключительных ситуаций (см. ра- нее) — РЕ, UE или IE. В частности, его установка информирует о попытке записи в заполненный стек или, напротив, попытке чтения из пустого стека. После того как вы проанализировали этот бит, его нужно снова установить в ноль вместе с битами РЕ, UE или IE (если они были установлены); Бит ES (Error Summary) сигнализирует о суммарной ошибке в работе сопроцес- сора. Бит устанавливается в единицу, если возникает любая из шести исключи- тельных ситуаций, о которых будет рассказано далее. * Четыре бита C0...C3 (Condition Code) представляют собой код условия. Назна- чение этих битов аналогично флагам в регистре EFLAGS основного процессора — они отражают результат выполнения последней команды сопроцессора. В при- ложении А для некоторых команд сопроцессора приведена интерпретация би- тов СО...СЗ. Ш Трехразрядное поле ТОР содержит указатель регистра текущей вершины стека. Почти половину регистра SWR занимают биты (флаги) регистрации исключи- тельных ситуаций. Исключительная ситуация — особый тип прерываний. Необ- ходимо заметить [8], что прерывания, поддерживаемые процессором Intel, по мес- ту их возникновения классифицируются на внешние и внутренние. Внутренние прерывания возникают в ходе работы текущей программы и делятся на синхрон- ные (по команде iпt) и асинхронные, называемые исключениями, или особыми слу- чаями. Таким образом, исключения — это разновидность прерываний, с помощью которых процессор информирует программу о некоторых особенностях ее реаль- ного исполнения. Сопроцессор также обладает способностью возбуждения подоб- ных прерываний при возникновении определенных ситуаций (не обязательно ошибочных). Все возможные исключения сведены к шести типам, каждому из ко- торых соответствует один бит в регистре SWR. Программисту совсем не обязатель- но писать обработчик для реакции на ситуацию, приведшую к некоторому исклю- чению. Сопроцессор умеет самостоятельно реагировать на многие из них. Это так называемая обработка исключений по умолчанию. Для того чтобы запретить со- процессору обработку определенного типа исключения по умолчанию, необходи- мо это исключение замаскировать. Такое действие выполняется путем установки в единицу нужного бита в управляющем регистре сопроцессора CWR (рис. 17.4). Приведем типы исключений, фиксируемые с помощью регистра SWR: * IЕ (Invalide operation Error) — недействительная операция; * DE (Denormalized operand Error) — денормализованный операнд; ϋ ZE (divide by Zero Error) — ошибка деления на нуль; * OE (Overflow Error) — ошибка переполнения (возникает в случае выхода по- рядка числа за максимально допустимый диапазон); ш UЕ (Underflow Error) — ошибка антипереполнения (возникает, когда результат слишком мал); ж РЕ (Precision Error) — ошибка точности (устанавливается, когда сопроцессору приходится округлять результат из-за того, что его точное представление не- возможно; так, сопроцессору, как и читателю, никогда не удастся точно разде- лить 10 на 3). При возникновении любого из этих шести типов исключений устанавливается в единицу соответствующий бит в регистре SWR вне зависимости от того, было ли замаскировано это исключение в регистре CWR или нет. Более подробно об исклю- чениях, в частности, об условиях их возникновения, рассказывается в разделе «Ис- ключения сопроцессора и их обработка».