Сопроцессор 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 имеет исчерпывающую
информацию о команде, которая вызвала особую ситуацию.