Сопроцессор 8087 содержит два управляющих регистра.  Один  регистр нужен для записи управляющего слова, другой - для  считывания слова состояния.  Управляющий регистр позволяет  программисту задать режим работы микросхемы 8087, далее о  возможностях некоторых из них будет лишь упомянуто; рассмотрение  всех возможных вариаций управляющего слова выходит за пределы этой  книги. Структура управляющего регистра показана на Фиг. 7.7.  Управляющее слово позволяет выбрать один из двух различных  типов бесконечности.  По умолчанию способом замыкания числовой  системы является проективное замыкание, при котором сопроцессор  8087 трактует положительную, и отрицательную бесконечности как  единую бесконечность без знака.  Другой способ - аффинное  замыкание, в которое входят и положительная, и отрицательная  бесконечности.  Хотя может показаться, что проективное замыкание  теряет информацию, оно никогда не приводит к бессмысленным  результатам.  Аффинное замыкание в программе необходимо  использовать только тогда, когда необходима дополнительная  информация и когда программа написана для того, чтобы иметь дело с  (возможно) неверными результатами.

Сопроцессор 8087 позволяет выбрать один из четырех способов  округления чисел.  Округление возникает тогда, когда результат

       15                       7                     0

      ЪДДДДДДДДДДДВДДДВДДДДДДДВДДДДДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДВДДДДї

      і         іIC і RC     і  PC іIEMі іPM іUM іOM іZM іDM іIM  і

      АДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДДЩ

       ДДДДДВДДДДД  і  ДДДВДДД ДДВДД   і   і  і   і   і   і   і   і МАСКИ ИСКЛЮЧЕНИЯ (1=МАСКИРУЕТСЯ)

           і       і     і       і   і  і   і   і   і   і  і    АД  НЕВЕРНАЯ ОПЕРАЦИЯ

           і       і     і       і   і  і   і   і   і   і  АДДДДДД  НЕНОРМАЛИЗОВАННЫЙ ОПЕРАНД

           і       і     і       і   і  і   і   і   і   АДДДДДДДДДД  ДЕЛЕНИЕ НА НОЛЬ

           і       і     і       і   і  і   і   і   АДДДДДДДДДДДДДД  ПЕРЕПОЛНЕНИЕ

           і       і     і       і   і  і   і   АДДДДДДДДДДДДДДДДДД ИСЧЕЗАНИЕ ПОРЯДКА

           і       і     і       і   і  і   АДДДДДДДДДДДДДДДДДДДДДД  ТОЧНОСТЬ

           і       і     і       і   і  АДДДДДДДДДДДДДДДДДДДДДДДДДД(ЗАРЕЗЕРВИРОВАНО)

           і       і     і       і   АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДМАСКА РАЗБЛОКИРОВКИ ПРЕРЫВАНИЙ (1)

           і       і     і      АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДУПРАВЛЕНИЕ ТОЧНОСТЬЮ (2)

           і       і    АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДУПРАВЛЕНИЕ ОКРУГЛЕНИЕМ (3)

           і      АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДУПРАВЛЕНИЕ НЕОПРЕДЕЛЕННОСТЬЮ (4)

           АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД(ЗАРЕЗЕРВИРОВАНО)

 

                           (1) Маска разблокировки прерываний:

                              0 = Разблокировка

                              1 = Прерывания заблокированы (маскированы)

                           (2) Управление точностью:

                              00 = 24 бита

                              01 = (зарезервировано)

                              10 = 53 бита

                              11 = 64 бита

                           (3) Управление округлением:

                              00 = Округление до ближайшего или четного

                              01 = Округление в меньшую сторону

                              10 = Округление в большую сторону

                              11 = Обрезание к нулю

                           (4) Управление неопределенностью:

                              0 = Продуктивная

                              1 = Афинитивная

 Фиг. 7.7 Формат управляющего слова INTEL 8087

требует большей точности, чем позволяет представление чисел.  Метод  округления определяет, какое число выбирается в качестве  результата.  Методы округления включают: выбор следующего большего  числа в системе представления чисел, следующего меньшего числа,  округление в направлении нуля, и округление в направлении четного  числа. Сопроцессор 8087 также дает возможность программе не  использовать полностью 64-битовую точность временного  действительного формата ИИЭР.  Эта возможность не уменьшает время  выполнения команд и не должна выполняться только для того, чтобы  сделать команды процессора 8087 совместимыми с некоторыми  существовавшими ранее процедурами обработки.

Процессор 8087 может регистрировать множество ситуаций  появления ошибки, известных как особые ситуации; он также может  возбуждать прерывания, чтобы сообщить об этих ситуациях.  В  управляющем слове имеется группа бит, которая позволяет  программисту определить, какие особые ситуации будут приводить к  прерываниям, а какие будут обрабатываться другими способами.  Эти  биты известны как маски прерываний, так как они могут маскировать,  или предотвращать, возникновение прерываний.

Необходимости разрешать прерывание в каждой из этих ситуаций  нет. Сопроцессор 8087 имеет широкие возможности по обработке  особых ситуаций, встроенных в него самого.  Для любой возможной  ситуации в микросхеме 8087 имеется способ обработки ее по  умолчанию.  Например, деление на нуль вызывает прерывание по особой  ситуации, если она разрешена (немаскирована).  Однако если  программист не разрешил это прерывание, сопроцессор 8087 использует  значение бесконечности, как результат деления на нуль.  Это  значение распространится через все оставшиеся вычисления, давая  результат, непосредственно показывающий, что во время работы  возникла ошибка некоторого вида.

Иногда в какой-то из ваших программ, использующих плавающую  точку, может оказаться необходимым обрабатывать особую ситуацию  сразу же, как она возникает; и тогда у вас возникает желание  заменить обработчик прерываний вашей собственной подпрограммой,  обрабатывающей особые ситуации.  В IBM PC вывод прерывания по  особой ситуации от микросхемы 8087 подключен ко входу  немаскируемого прерывания NMI (Non Maskable Interrupt).  Это то же  самое прерывание, которое сигнализирует об ошибке четности.

В качестве примера особой ситуации рассмотрим упомянутое выше  переполнение стека.  Если программа помещает в стек девятый объект,  сопроцессор 8087 отвечает прерыванием по особой ситуации.  Если это  прерывание не разрешено, сопроцессор 8087 отмечает операцию как  недействительную и дает результат со специальным значением,  известным как NAN (Not A Number, не число).  Если вы собираетесь  выполнять сложные вычисления, требующие более восьми позиций стека,  то можете выгодно использовать прерывание по этой особой ситуации.  Когда возникает переполнение стека, обработчик этого прерывания  может удалить нижние элементы стека, используя команды записи.  Затем программа освобождает эти позиции стека для дальнейшего  использования.  Существует также и соответствующее прерывание по  исчерпыванию стека, которое возникает при использовании пустой  позиции стека; подпрограмма обработки прерывания может обрабатывать  и эту ситуацию:  она может восстановить прежнее состояние стека из  области сохранения.

Далее мы увидим, что микросхема 8087 содержит информацию о  своем состоянии, что делает возможным обработать особые ситуации в  обработчике прерываний.  Микросхема 8087 имеет исчерпывающую  информацию о команде, которая вызвала особую ситуацию.