¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦Неверная
Занято ¦ ¦ ¦ ¦ ¦ ¦ ¦ операция
Указатель ¦ Коды ¦ ¦ ¦ ¦ ¦ ¦Ненормализо-
на вершину ¦ условий ¦ ¦ ¦ ¦ ¦ ¦ванный опе-
стека ¦ ¦ ¦ ¦ ¦ ¦ ранд
ЪДДДДДДДДДДДДДДДДДДДДДДД¬ ¦ ¦ ¦ ¦ ¦
¦ ЪДДДДДДДДДДД¬¦ ¦ ¦ ¦ ¦ Деление на ноль
¦000 ----> ¦ Регистр 0 ¦¦ ¦ ¦ ¦ Переполнение
¦001 ----> ¦ Регистр 1 ¦¦ ¦ ¦ Потеря значимости
¦010 ----> ¦ Регистр 2 ¦¦ ¦ Точность Маска
¦011 ----> ¦ Регистр 3 ¦¦ ¦Зарезервирован разрешения
¦100 ----> ¦ Регистр 4 ¦¦ ¦ прерывания
¦101 ----> ¦ Регистр 5 ¦¦
¦110 ----> ¦ Регистр 6 ¦¦ Требование прерывания
¦111 ----> ¦ Регистр 7 ¦¦
¦ АДДДДДДДДДДДЩ¦
АДДДДДДДДДДДДДДДДДДДДДДДЩ
Рис.10-9. Слово состояния NPX
Индикатор занятости сигнализирует о том, выполняет ли в на-
стоящее время NPX обработку команды. Этот индикатор не очень по-
лезен для нас, так как содержимое слова состояния не может быть
использовано до тех пор, пока NPX не объявит, что он завершил за-
пись слова состояния. Исходя из этого, Вы знаете, что NPX свобо-
ден, так как команда FWAIT выполнена.
Указатель вершины стека, в битах с 11 по 13, полезен для
программиста, который пишет сложные служебные программы NPX, вы-
полняющие последовательные операции и сохраняющие многочисленные
значения в стеке NPX. В этих случаях, для того, чтобы убедиться в
том, что для следующей операции имеется достаточно места, перед
обработкой программы проверьте глубину стека. Если в стеке недо-
статочно места для поддержки операции, некоторые или все регистры
должны быть сохранены в памяти для того, чтобы появилась возмож-
ность выполнить программу без нежелательных последствий.
Указатель стека инициализируется командой FINIT для того,
чтобы указывать на 000(0), а каждая успешно загруженная команда
уменьшает указатель стека циклически возвращая 111(7) до тех пор,
пока он не достигнет 001(1). Указателем стека можно манипулиро-
вать с помощью команд FINCSTP (увеличить указатель стека) и
FDECSTP (уменьшить указатель стека). Тем не менее, так как эти
операции не отмечают регистры как пустые, использование команд
FDECSTP или FINCSTP может запретить применение индикатора вершины
стека для проверки свободных регистров.
Коды условий необходимы чаще всего для того, чтобы решить,
какое действие предпринять в пункте принятия решения программы.
Далее мы рассмотрим несколько примеров использования кодов усло-
вий. Короче говоря, для проверки кодов условий, запишите слово
состояния в память с помощью команды FSTSW; затем проверьте коды
с помощью главного центрального процессора. При сохранении инфор-
- 10-17 -
мации состояния NPX для проверки центральным процессором не забы-
вайте добавлять команду FWAIT после команды записи. Следующий
фрагмент программы демонстрирует, как может появиться последова-
тельность сравнения.
.
.
.
sw87 dw ? ; пространство для слова состояния NPX
.
.
.
FCOM ST(1) ; проверить отношение между ST и ST(1)
FSTSW sw87 ; записать слово состояния NPX
FWAIT ; ждать завершения работы
test sw87,4000h ; операнды равны?
je are_equl ; да...
.
.
.
Значения, присвоенные этим кодам различными командами сравне-
ния, приведены в таблице 10-5. Обратите внимание, что коды усло-
вий не попадают в одну группу, но делятся на части указателем
стека, и что коды, возвращаемые командами FCOM и FTSR, также раз-
деляются битом условия С1, который не используется. Отметьте, что
NAN означает "не-число".
Таблица 10-5
Условия состояния, установленные командами FCOM, FTST и FXAM
ДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДД
¦ КОДЫ УСЛОВИЙ ¦
Команда ГДДДДДДДДДДДДДДДДДДДДДДДґ Результат
¦ C3 C2 C1 C0 ¦
ДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДД
¦ ¦
. F ¦ 0 0 * 0 ¦ ST > источника
. C ¦ 0 0 * 1 ¦ ST < источника
. O ¦ 1 0 * 0 ¦ ST = источник
. M ¦ 1 1 * 1 ¦ ST ? источник
. F ¦ 0 0 * 0 ¦ ST > 0.0
. T ¦ 0 0 * 1 ¦ ST < 0.0
. S ¦ 1 0 * 0 ¦ ST = 0.0
. T ¦ 1 1 * 1 ¦ ST ? 0.0
. F ¦ 0 0 0 0 ¦ + Ненормализованное
. X ¦ 0 0 0 1 ¦ + NAN
. A ¦ 0 0 1 0 ¦ - Ненормализованное
. M ¦ 0 0 1 1 ¦ - NAN
. ¦ 0 1 0 0 ¦ + Нормализованное
. ¦ 0 1 0 1 ¦ + Бесконечность
. ¦ 0 1 1 1 ¦ - Бесконечность
. ¦ 1 0 0 0 ¦ + 0
. ¦ 1 0 0 1 ¦ Пусто
. ¦ 1 0 1 0 ¦ - 0
. ¦ 1 0 1 1 ¦ Пусто
. ¦ 1 1 0 0 ¦ + Денормализованное
. ¦ 1 1 0 1 ¦ Пусто
. ¦ 1 1 1 0 ¦ - Денормализованное
. ¦ 1 1 1 1 ¦ Пусто
ДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДД
(*) - Не существенно
- 10-18 -
Обработка особых ситуаций в NPX
Младший байт слова состояния содержит флаги особых ситуаций.
Эти флаги соответствуют маскам ситуаций в слове управления. Когда
имеет место особая ситуация, NPX устанавливает соответствующий
флаг и затем проверяет, замаскирована эта ситуация или нет. Так
как большинство операций применяют замаскированный ответ (внут-
ренние обработчики прерываний NPX), мы свели их действие в табли-
цу 10-6. Не забывайте о периодической проверке на наличие особых
ситуаций в целях обеспечения точности результатов. Если имеется
особая ситуация, то устанавливается соответствующий флаг и стоит
до тех пор, пока он не будет сброшен посредством инициализации
NPX (команда FINIT) или путем использования команды сброса ситуа-
ции FCLEX. Так как флаги остаются установленными, они обеспечива-
ют кумулятивную запись любых ошибок, возникающих в процессе обра-
ботки.
Другой способ обработки особых ситуаций заключается в размас-
кировании одной или более ситуаций и разрешении прерываний в сло-
ве управления NPX. В этом режиме, если NPX обнаруживает особую
ситуацию, он сигнализирует прерыванием и требует, чтобы главный
центральный процессор обработал ситуацию. Тем не менее, NPX не
всегда связан с линией запроса прерывания центрального процессо-
ра! Для размещения запросов прерываний NPX требуется внешняя схе-
ма обработчика прерываний. Если Ваша система не поддерживает
внешние прерывания NPX, то не разрешайте их!
Если Ваша система поддерживает внешние прерывания и Вы разре-
шили их, то необходимо обеспечить обработчик особых ситуаций, в
то время, когда NPX прерывает работу главного центрального про-
цессора. Для определения причины возникшей проблемы программа
центрального процессора должна прочитать слово состояния NPX. Ес-
ли Вы потребуете, то Ваш обработчик ситуаций тоже может опреде-
лить команду и операнд, приведшие к возникновению проблемы, путем
исследования указателей команды и операнда NPX. Для получения
этой информации обработчик ситуаций должен выполнить одну из ко-
манд NPX, FSTENV или FSAVE. Эти команды записывают в память глав-
ного центрального процессора по меньшей мере содержание пяти ре-
гистров управления NPX (слово состояния, слово управления, слово
признака, указатель команды и указатель операнда). Обработчик си-
туаций может восстановить информацию из памяти и обработать ее.
Если Вы хотите получить более полное представление об этих ре-
гистрах, то изучите листинг 10-1 раздела "Примеры программирова-
ния NPX с помощью MASM", содержащий пример программы, которая
сначала сохраняет эту информацию, а затем декодирует ее.
Таблица 10-6
Установленные по умолчанию ответы на
особые ситуации NPX. (Ситуации замаскированы)
ДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Особая ситуация ¦ Замаскированный ответ
ДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Точность ¦ Возвращает округленный результат
Потеря значимости ¦ Денормализованный результат
Переполнение ¦ Возвращает бесконечность со знаком
Деление на ноль ¦ Возвращает бесконечность со знаком
. ¦ операнда
- 10-19 -
ДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Особая ситуация ¦ Замаскированный ответ
ДДДДДДДДДДДДДДДДДДДДД†ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Денормализованный ¦ Если операнд памяти, то игнорируется
операнд ¦ Если операнд регистра, то переводит в
. ¦ "ненормализованное" и оценивает снова
Неверная операция ¦ Если один операнд NAN, то возвращает
. ¦ его. Если оба операнда NAN, то возвра-
. ¦ щает тот, который имеет большее абсо-
. ¦ лютное значение. Если ни один из опе-
. ¦ рандов не является NAN, то возвращает
. ¦ неопределенность
ДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Использование средств MS-DOS с NPX
Единственное отличие написания программ с использованием NPX
от написания программа без его использования заключается в том,
что применение сопроцессора требует большего количества команд
для применения числовых операций. Так как отличие видно только на
уровне команд, единственными средствами MS-DOS, которым нужно