На главную Назад
Добро пожаловать, уважаемый посетитель!

Как и в наборе команд микропроцессора 8088, у сопроцессора 8087

есть команды, сравнивающие два числа.Сопроцессор 8087 отбрасывает

результат сравнения, но устанавливает в соответствии с ним флаги

состояния.Перед тем как опросить флаги состояния, программа

должна считать слово состояния в память.Далее проще всего

загрузить флаги состояния в регистр AH, а затем, для легкости

проверки условия, - в регистр флагов макропроцессора 8088.

 

На Фиг. 7.18 показан листинг ассемблера команд сравнения

сопроцессора 8087.Так как в операции всегда участвует вершина

стека, в программе надо указать только один регистр или операнд в

памяти.После сравнения в слове состояния содержится информация о

соотношении двух чисел.Таблица на Фиг. 7.19 показывает возможные

варианты соотношений.Для отражения результата сравнения

необходимы только два бита состояния - C3 и C0; расположение C3 и

C0 в слове состояния показано на Фиг. 7.8.

На Фиг. 7.20 приведен фрагмент программы, которая сравнивает

содержимое вершины стека и слово в памяти.Переходы в этой

программе выполняются на основе результата сравнения.В одном из

четырех случаев числа нельзя сравнить.Это происходит тогда, когда

одно из чисел есть NAN (не число) или одна из форм бесконечности.

Microsoft (R) Macro Assembler Version 5.001/1/80 04:04:18

Фиг. 7.18 Команды сравнения сопроцессора 8087Page1-1

 

PAGE,132

TITLEФиг. 7.18 Команды сравнения сопроцессора 8087

 

0000CODESEGMENT

ASSUMECS:CODE,DS:CODE

 

0000WORD_INTEGERLABELWORD

0000SHORT_INTEGERLABELDWORD

0000SHORT_REALLABELDWORD

0000LONG_REALLABELQWORD

 

00009B D8 D1 FCOM

00039B D8 D2 FCOMST(2)

00069B DE 16 0000 RFICOMWORD_INTEGER

000B9B D8 16 0000 RFCOMSHORT_REAL

00109B D8 D9 FCOMP

00139B DA 1E 0000 RFICOMPSHORT_INTEGER

00189B DC 1E 0000 RFCOMPLONG_REAL

001D9B DE D9 FCOMPP

00209B D9 E4 FTST

00239B D9 E5 FXAM

 

 

0026CODEENDS

END

 

Фиг. 7.18 Команды сравнения сопроцессора 8087

 

Сопроцессор 8087 помещает флаги состояния C3 и C0 в точности на те

же места, которые в регистре флагов микропроцессора 8088 занимают

флаги нуля C3 и переноса C0.Как показано на рисунке, если

программа переслала старший байт слова состояния сопроцессора 8087

в регистр флагов микропроцессора 8088, она может выполнить условный

переход с помощью непосредственной проверки состояния флагов с

использованием команды условного перехода, и не нужно выделять и

проверять отдельные биты слова состояния.

 

С3С0Порядок

--------------------------------------------------------------

00ST > источник

01ST < источник

10ST = источник

11ST и источник несравнимы

--------------------------------------------------------------

 

Фиг. 7.19 Порядок сравнения

 

На Фиг. 7.18 демонстрируется, что существуют и другие варианты

команды FCOM, в том числе и то, что для команды FCOM существует

версия FICOM необходимая для ставнения целых чисел.Команды FCOMP

и FICOMP идентичны командам FCOM и FICOM, за исключением того, что

сопроцессор 8087 извлекает из стека содержимое вершины после

выполнения операции.Это позволяет сравнить два числа с помощью

сопроцессора 8087, не беспокоясь о том, что нужно удалить из стека

первый операнд после операции.

 

Microsoft (R) Macro Assembler Version 5.001/1/80 04:04:23

Фиг. 7.20 Условный переходPage1-1

 

 

PAGE,132

TITLEФиг. 7.20 Условный переход

 

0000CODESEGMENT

ASSUMECS:CODE,DS:CODE

 

0000WORD_INTEGERLABELWORD

0000????STATUS_WORDDW?

 

;-----Сравнивается WORD_PTR со словом на вершине стека сопроцессора 8087

 

00029B DE 16 0000 RFICOMWORD_INTEGER; Сравнение слова с ST

00079B DD 3E 0000 RFSTSWSTATUS_WORD; Сохранение слова состояния 8087

000C9B FWAIT; Синхронизация процессора с сопроцессором

000D8A 26 0001 RMOVAH,BYTE PTR STATUS_WORD+1

00119E SAHF; Занесение флагов (C0=CF,C3=ZF)

001272 02JBCONTINUE; Проверка флага C0,переход если 0

001475 00JNEST_GREATER; Проверка флага C3

0016ST_EQUAL: ; Попадаем сюда,если C3=1,C0=0 -

; ...;значения равны

0016ST_GREATER:; Попадаем сюда,если C3=0,C0=0 - число

; ...;на вершине стека 8087 больше WORD_PTR

0016CONTINUE:

001675 00JNEST_LESS; Проверка флага C3

0018UNORDERED:; Попадаем сюда,если C3=1,C0=1 - невоз-

; ...;можно определить какое из чисел больше

0018ST_LESS:; Попадаем сюда,если C3=0,C0=1 - число

; ...;на вершине стека 8087 меньше WORD_PTR

 

0018CODEENDS

END

 

Фиг. 7.20 Условный переход

 

У команды FCOMPP программист не указывает никаких операндов.

Эта команда всегда сравнивает верхние два элемента стека.После

сравнения они оба исчезают из стека.

 

Команды сравнения с извлечением из стека обеспечивают удобный

способ очистки стека.Поскольку у сопроцессора 8087 нет команды,

удобно извлекающей операнд из стека, вместо нее можно использовать

команды сравнения с извлечением из стека.Эти команды также

изменяют и регистр состояния, и их нельзя использовать, если биты

состояния имеют значение для дальнейшей работы, но в большинстве

случаев эти команды позволяют быстро извлечь из стека один или два

операнда.Так как сопроцессор 8087 регистрирует ошибку при

переполнении стека, необходимо удалить все операнды из стека при

окончании вычислений.

 

Существуют две специальные команды сравнения.Команда

сравнения содержимого вершины стека с нулем FTST, с помощью которой

можно быстро определить знак содержимого вершины стека.(Результат

сравнения иллюстрируется таблицей на Фиг. 7.19, нужно только всюду в

таблице слово "источник" заменить на слово "нуль").

 

Команда FXAM, строго говоря, не является командой сравнения.

Хотя она и работает с содержимым вершины стека, но не сравнивает

содержимое вершины ни с одним другим числом.Скорее команда FXAM

устанавливает все четыре флага регистра состояния (от C3 до C0

включительно), показывая, какого типа число находится в вершине

стека.Так как сопроцессор 8087 может обрабатывать любые формы

чисел, а не только нормализованные числа с плавающей точкой,

команда FXAM определит, что же находится в вершине стека.На

Фиг. 7.21 показаны значения битов состояния в каждом случае.

 

Если при арифметической обработке вы не делаете что=либо из

ряда вон выходящее и не работаете на пределе разрядной сетки

сопроцессора 8087, то не нужно рассматривать никакие из приведенных

выше результатов команды FXAM; вы должны ожидать увидеть лишь

положительные либо отрицательные нормализованные числа или нули.

Если выясняется, что вершина стека пустая, то обычно выдается

ошибка.Программа может сделать такую проверку для контроля

параметра, переданного в вершине стека.

 

Остальные значения - это реакция микросхемы 8087 на ошибку.

Когда сопроцессор 8087 обнаруживает ошибку, он пытается возбудить

прерывание по особой ситуации, устанавливая соответствующие биты в

слове состояния.Однако если ситуация замаскирована с помощью

управляющего слова, сопроцессор 8087 сам реагирует на нее.Он

решает, какая реакция соответствует данной ошибке и возбуждает

появление специфического числа в регистре.Например, результат NAN

возникает, если операция некорректна, как в случае извлечения

квадратного корня из отрицательного числа.Бесконечность

появляется, если результат операции слишком велик для представления

с плавающей точкой.

C3C2C1C0ЗначениеС3С2С1С0Значение

---------------------------------------------------------------------------------------------------

0 000+ Ненормально 1000+ 0

0 001+ NAN 1001Пусто

0 010- Ненормально 1010- 0

0 011- NAN 1011Пусто

0 100+ Нормально 1100+ Ненормальное

0 101+ Бесконечность 1101Пусто

0 110- Нормально 1110- Ненормальное

0 111- Бесконечность 1111Пусто

---------------------------------------------------------------------------------------------------



Фиг. 7.21 Пример интерпретации кодов состояний

Денормализованные и ненормализованные числа возникают при

достижении другого предела представления чисел с плавающей точкой.

Когда число становится настолько маленьким, что у него уже нет

смещенного порядка, оно становится денормализованным.Вместо того,

чтобы заменить число нулем, процессор 8087 записывает наименьшее

значение порядка и ненормализованную мантиссу.Это означает, что

число теряет точность, так как у его мантиссы появляются незначащие

нули.Но денормализованный результат все же точнее, чем просто

нуль.И это тот случай, при котором сопроцессор 8087, продолжая

работу, наилучшим образом реагирует на плохие условия.Пометка

числа, как денормализованного, должна насторожить вас.При этом

также устанавливается бит денормализации в регистре особых

ситуаций, и остается установленным до тех пор, пока команда FCLEX

не сбросит биты особых ситуаций.С помощью анализа флагов

программа может зарегистрировать возникновение ошибки и отнестись к

результатам с подозрением.


 

Mail.ru