ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.


База слоганов интернет магазины подарков.

 

Часть 18

Глава 17. Операции с плавающей точкой
----------------------------------------------------------------
Команды с плавающей точкой процессора i486(TM) можно
сгруппировать в шесть функциональных классов:
- Команды передачи данных
- Нетрансцендентные команды
- Команды сравнения
- Трансцендентные команды
- Команды с константами
- Управляющие команды
В этой главе все классы команд описаны как набор средств,
доступных для программиста, работающего на ассемблере
ASM386/486. Для детального ознакомления с форматами,
кодированием и временем выполнения команд обратитесь к описанию
набора команд в Главе 26.
Математический сопроцессор 387(TM) и модуль обработки операций с
плавающей точкой процессора i486 поддерживают большее число
команд, чем математические сопроцессоры 8087 и 80287. Некоторые
системы на основе процессора 386 DX используют математический
сопроцессор 80287. Для того, чтобы узнать, представлены ли в
системе математические сопроцессоры 8087 и 80287 и возможно ли
использование новых команд, обратитесь к примеру на Рисунке 16-
4.
17.1 Операнды источника и назначения
----------------------------------------------------------------
Обычно команда с плавающей точкой имеет один или два операнда,
которые выбираются из регистрового стека модуля обработки
операций с плавающей точкой или из памяти. Многие команды, такие
как FSIN, автоматически работают с элементом в вершине
регистрового стека модуля обработки операций с плавающей точкой.
Другие команды позволяют или требуют, чтобы программист явно
закодировал операнд или операнды в соответствии с мнемоникой
операции. Еще одна разновидность команд принимает один явный
операнд и один неявный операнд (обычно элемент в вершине стека
модуля обработки операций с плавающей точкой).
Не зависимо от того, определены ли операнды программистом или
подразумеваются по умолчанию, операнды команд с плавающей точкой
делятся на два основных типа: операнд-источник и операнд
назначения (приемник). Операнд-источник представляет для
команды входную информацию и не меняется после выполнения.
Даже когда команда переводит операнд-источник из одного формата
в другой (например, вещественное в целое), команда работает во
внутренней области для того, чтобы предотвратить изменение
исходного операнда. Операнд назначения также может предоставлять
команде некоторую входную информацию, но при выполнении, однако,
команда выдает результат в операнд назначения, меняя его
предыдущее содержание.
Многие команды позволяют кодировать операнды различными путями.
Например, команда FADD (вещественное сложение) может быть
записана либо без операндов, либо только с операндом-источником,
либо с исходным и принимающим операндами. Когда указаны оба
операнда, и операнд-приемник и операнд назначения, то
операнд назначения должен предшествовать операнду-источнику в
командной строке и оба должны быть взяты из стека модуля
обработки операций с плавающей точкой.
Операнды из памяти могут быть закодированы любым способом
адресации, предоставляемым байтом ModR/M. Для того, чтобы
ознакомиться с этими методами (БАЗА = (ИНДЕКС x МАСШТАБ) +
СМЕЩЕНИЕ), обратитесь к Главе 2. Команды с плавающей точкой с
операндами из памяти либо читают из памяти, либо пишут в память.
Ни одна команда с плавающей точкой не делает то и другое
одновременно. Для детального ознакомления с каждой командой,
включая способы возможных кодирований, обратитесь к справочной
информации в Главе 26.
17.2 Команды передачи данных
----------------------------------------------------------------
Эти команды (представленные в Таблице 17-1) занимаются передачей
данных между регистрами стека и между вершиной стека и памятью.
Любой из семи типов данных может быть переведен в расширенный
вещественный формат и загружен в стек с помощью простой
команды. Таким же образом можно сохранить их в памяти. Команды
передачи данных автоматически обновляют слово признака
модуля обработки операций с плавающей точкой для того, чтобы
отразить информацию о том, пуст или полон регистр после
очередной команды.
             Таблица 17-1. Команды Передачи Данных
ЪДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДї
і    Вещественный    і       Целый      іУпакованный Десятичный і
ГДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДґ
і FLD  Загрузить     і FILD  Загрузить  і FBLD  Загрузить Упако-і
і      Вещественное  і       Целое      і       ванное Десятич- і
і                    і                  і       ное             і
і FST  Сохранить     і FIST  Сохранить  і                       і
і      Вещественное  і       Целое      і                       і
і FSTP Сохранить Ве- і FISTP Сохранить  і FBSTP Загрузить Упако-і
і      щественное и  і       Целое и    і       ванное Десятич- і
і      Взять из Стекаі       Взять из   і       ное и Взять из  і
і                    і       Стека      і       Стека           і
і FXCH Заменить      і                  і                       і
і      Регистры      і                  і                       і
АДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДЩ
17.3 Нетрансцендентные команды
----------------------------------------------------------------
Набор нетрансцендентных команд предоставляет изобилие вариаций
сложения, вычитания, умножения и деления, а также некоторые
другие полезные функции. Диапазон этих команд изменяется от
простой команды взятия абсолютного значения до команд, которые
проводят точное деление по модулю, округление вещественных чисел
до целых и масштабируют величины степенью двух. На Таблице 17-2
показаны нетрансцендентные команды, помимо основной арифметики.
Основные арифметические команды (сложение, вычитание, умножение
и деление) разработаны для того, чтобы разрабатывать эффективные
алгоритмы. Практически, они позволяют программисту обращаться к
памяти также легко, как и к регистровому стеку модуля обработки
операций с плавающей точкой. На Таблице 17-3 приведены
возможные формы команды/операнда для основной арифметики. В
добавок к основным четырем командам существуют "обратное"
вычитание и деление, которые устраняют необходимость постоянных
обменов между ST(0) и ST(1). Разнообразность форм команд и
операндов дает программисту необычайную гибкость:
- Операнды могут располагаться в регистрах или в памяти.
- Результаты могут быть выданы в выбранные регистры.
- Операнды могут быть данными различных типов: расширенное
  вещественное, двойное вещественное, простое вещественное,
  короткое целое или целое слово. При этом модулем обработки
  операций с плавающей точкой производится автоматический
  перевод в расширенный вещественный формат.
            Таблица 17-2. Нетрансцендентные Команды
                (Кроме Основных Арифметических)
ЪДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і Мнемоника і                     Операция                      і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і           і                                                   і
і FSQRT     і         Извлечение Квадратного Корня              і
і           і                                                   і
і FSCALE    і         Масштабирование                           і
і           і                                                   і
і FXTRACT   і         Выделение Порядка и Мантиссы              і
і           і                                                   і
і FPREM     і         Частичный Остаток                         і
і           і                                                   і
і FPREM1 *  і         Стандарт IEEE Частичный Остаток           і
і           і                                                   і
і FRNDINT   і         Округление до Целого                      і
і           і                                                   і
і FABS      і         Абсолютное Значение                       і
і           і                                                   і
і FCHS      і         Смена Знака                               і
і           і                                                   і
АДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
 * Недоступно для математического сопроцессора 80287/8087.
    Таблица 17-3. Основные Арифметические Команды и Операнды
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДї
і      Вид Команды          і   Форма  і    Формы Операндов:    і
і                           і Мнемоникиі   Приемник, Источник   і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДґ
і                           і          і                        і
і Классический Стек         і    Fop   і{ST(1),ST}              і
і                           і          і                        і
і Классический Стек, допол- і          і                        і
і нительная команда POP     і    FopP  і{ST(1),ST}              і
і                           і          і                        і
і Регистр                   і    Fop   іST(i),ST или ST,ST(i)   і
і                           і          і                        і
і Регистр, Выборка из Стека і    FopP  іST(i),ST                і
і                           і          і                        і
і Память для вещественных   і    Fop   і{ST} обычное веществен- і
і                           і          і     ное/двойное вещес- і
і                           і          і     твенное            і
і                           і          і                        і
і Память для целых          і    FIop  і{ST} целое слово/корот- і
і                           і          і     кое целое          і
і                           і          і                        і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДЩ
ОБРАТИТЕ ВНИМАНИЕ:
В скобках ({ }) содержатся неявные операнды; они не закодированы,
но поддерживаются ассемблером.
op = ADD   DEST ДД DEST + SRC
     SUB   DEST ДД ST - Другой Операнд
     SUBR  DEST ДД Другой Операнд - ST
     MUL   DEST ДД DEST x SRC
     DIV   DEST ДД ST / Другой Операнд
     DIVR  DEST ДД Другой Операнд / ST
Пять основных видов команд могут быть использованы со всеми
шестью командами, как показано в Таблице 17-3. Форма
классического стека может быть использована для того, чтобы
сделать модуль обработки операций с плавающей точкой подобно
машине с классическим стеком. Никакие операнды не нужны для этой
формы, только мнемоника команды. Модуль обработки операций с
плавающей точкой берет исходный операнд из вершины стека (ST), а
принимающий из следующего элемента стека (ST(1)). После
выполнения вычислений, результат возвращается в ST(1), а затем
выталкивается из стека ST, перемещая при этом результат на свое
место.
Регистровая форма является усовершенствованной формой
классического стека. При этом программист определяет вершину
стека как один операнд и любой регистр как другой операнд.
Кодирование вершины стека как операнда назначения предоставляет
удобный способ для доступа к константам из вершины стека, если
они находятся где-либо в стеке. Операнд назначения не должен
быть всегда ST. Основные двухоперандные команды позволяют
использовать другой регистр в качестве приемника. Использование
ST как исходного операнда позволяет, например, прибавлять
вершину стека к регистру, используемому как счетчик цикла.
Часто операнд в вершине стека необходим для одной команды и в
дальнейшем не используется для последующих вычислений. Форма
выталкивания регистра может быть использована для того, чтобы
взять вершину стека как исходный операнд и затем отбросить его,
вытолкнув из стека. При кодировании операндов ST(1) и ST вместе
с мнемоникой выталкивания регистра эквивалентно классическому
стеку: вершина выталкивается, а результат остается в новой
вершине стека.
Две формы памяти повышают гибкость нетрансцендентных команд.
Они разрешают непосредственно использовать как операнд-источник
двоичные целые или вещественные числа из памяти. Это полезно в
ситуациях, когда операнды используются не так часто и нет смысла
держать их все время в регистрах. Обратите внимание, что любой
метод адресации памяти может быть использован для того, чтобы
определить эти операнды так, чтобы они были бы элементами
массивов, структур или других типов организации данных также,
как и простыми скалярными величинами.
17.4 Команды сравнения
----------------------------------------------------------------
Команды этого класса позволяют сравнивать числа всех
поддерживаемых вещественных и целых типов данных. Каждая из этих
команд (Таблица 17-4) анализирует элемент в вершине стека, часто
по отношению к другому операнду, и в результате выдает код
условия в слово состояния (флаги C0, C2 и C3).
Основными командами являются сравнение, тестирование (сравнение
с нулем) и проверка (на тип, знак и нормализацию). Особые формы
команды сравнения предназначены для оптимизации алгоритмов,
разрешая прямое сравнение с двоичными целыми и вещественными
числами в памяти также, как и выталкивание из стека после
сравнения.
                Таблица 17-4. Операции Сравнения
ЪДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і Мнемоника і                     Операция                      і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і           і                                                   і
і FCOM      і Сравнить Вещественные                             і
і           і                                                   і
і FCOMP     і Сравнить Вещественные и Взять из Стека            і
і           і                                                   і
і FCOMPP    і Сравнить Вещественные и Дважды Взять из Стека     і
і           і                                                   і
і FICOM     і Сравнить Целые                                    і
і           і                                                   і
і FICOMP    і Сравнить Целые и Взять из Стека                   і
і           і                                                   і
і FTST      і Тестирование                                      і
і           і                                                   і
і FUCOM*    і Сравнение Неупорядоченных Вещественных            і
і           і                                                   і
і FUCOMP*   і Сравнить Неупорядоченные Вещественные и Взять из  і
і           і Стека                                             і
і           і                                                   і
і FUCOMPP*  і Сравнить Неупорядоченные Вещественные и Взять из  і
і           і Стека Дважды                                      і
і           і                                                   і
і FXAM      і Проверка                                          і
і           і                                                   і
АДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
 * Недоступно для математического сопроцессора 80287/8087.
Команда FSTSW AX (сохранить слово состояния) может быть
использована после сравнения для того, чтобы передать код
условия в регистр AX для просмотра. Команда TEST рекомендуется
для использования флагов модуля обработки операций с плавающей
точкой для управления условным ветвлением. Сначала проверяется,
получилось ли в результате сравнения, что числа неупорядочены.
Это может случится, если один операнд является NaN. Сравните
содержимое регистра AX с константой 0400H; флаг ZF будет очищен
(флаг нуля регистра EFLAGS), если сравнение дало
неупорядоченность, и установлен в противном случае. Теперь можно
использовать команду JNZ для того, чтобы передать управление
(при необходимости) программе, которая обрабатывает случай
неупорядоченных операндов. Отфильтровав случай неупорядоченных
операндов, снова сравните содержимое регистра AX с
соответствующей константой из Таблицы 17-5, а затем используйте
соответствующую условную ветвь.
Нет необходимости все время отфильтровывать случай
неупорядоченности при использовании этого алгоритма для условных
переходов. Если программное обеспечение было тщательно
оттестировано и включает периодические проверки результата на
QNaN (как рекомендовано в Главе 16), то совершенно не
обязательно проверять случай неупорядоченности всякий раз после
сравнения.
Кроме представленых в группе операций сравнения, некоторые
другие команды могут обновлять код условия. Для того, чтобы
быть уверенным, что слово состояния не было случайно изменено,
сохраняйте его сразу же после команды сравнения.
17.5 Трансцендентные команды
----------------------------------------------------------------
Команды этого класса (Таблица 17-6) производят занимающие
большое количество времени вычисления для всех обычных
тригонометрических, обратных тригонометрических,
гиперболических, обратных гиперболических, логарифмических и
степенных функций. Трансцендентные команды работают с верхними
одним или двумя элементами стека и возвращают результат обратно
в стек. Тригонометрические команды предполагают, что их
аргументы выражены в радианах. Логарифмические и степенные
функции работают по основанию 2.
Результаты трансцендентных команд очень точны. Абсолютное
значение относительной ошибки вычисления трансцендентной функции
гарантированно меньше чем 2**(-62). (Относительная ошибка - это
отношение между абсолютной ошибкой и точным значением.)
   Таблица 17-5. Константы Сравнения для Условного Ветвления
ЪДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДї
і      Порядок       і     Константа      і      Переход        і
ГДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДґ
і                    і                    і                     і
і    ST > Операнд    і       4500H        і         JZ          і
і                    і                    і                     і
і    ST < Операнд    і       0100H        і        JNZ          і
і                    і                    і                     і
і    ST = Операнд    і       4000H        і        JNZ          і
і                    і                    і                     і
і    Неупорядочено   і       0400H        і        JNZ          і
і                    і                    і                     і
АДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДЩ
Некоторые тригонометрические функции принимают практически
неограниченный диапазон значений, в то время как другие
трансцендентные команды требуют, чтобы аргументы были более
сжаты в диапазоне. Команды FPREM или FPREM1 можно использовать
для того, чтобы преобразовать допустимый операнд периодической
функции к требуемому диапазону. Программные продукты, имеющие
начальные и конечные приготовления, могут быть использованы для
сокращения аргументов до ожидаемого диапазона и, если
необходимо, для отладки результата, чтобы он соответствовал
начальным аргументам. Описание команд в справочной части Главы
26 дано вместе с разрешенным диапазоном операндов для каждой
команды.
             Таблица 17-6. Трансцендентные Команды
ЪДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і Мнемоника і                    Команды                        і
ГДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і           і                                                   і
і  FSIN*    і    Синус                                          і
і           і                                                   і
і  FCOS*    і    Косинус                                        і
і           і                                                   і
і  FSINCOS* і    Синус и Косинус                                і
і           і                                                   і
і  FPTAN**  і    Тангенс                                        і
і           і                                                   і
і  FPATAN   і    Арктангенс от ST(1) / ST                       і
і           і                                                   і
і           і     x                                             і
і  F2XM1**  і    2 - 1; X находится в ST                        і
і           і                                                   і
і  FYL3X    і    Y x log X; Y находится ST, X - в ST            і
і           і           2                                       і
і           і                                                   і
і  FYL2XP1  і    Y x log (X+1); Y находится ST, X - в ST        і
і           і           2                                       і
АДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
 *  Недоступно для математического сопроцессора 80287/8087.
 ** Операнды из расширенного диапазона математического сопроцес-
    сора 80287/8087
Когда аргумент тригонометрической функции попадает в диапазон
допустимых значений, он автоматически сокращается
соответствующим делением на 2Пи (при точности в 66 битов),
используя для этого точно такой же механизм как и команды
FPREM и FPREM1. Значение числа Пи, используемое в автоматическом
сокращении, выбирается так, чтобы гарантировать, что не будет
потери значимости операнда, представленного в определенном
диапазоне. Внутреннее значение числа Пи:
4 * 0.C90FDAA2 2168C234 C H
Программа может использовать явное значение для числа Пи в
вычислениях, результат которых будет использоваться как аргумент
для дальнейших тригонометрических функций. В таких случаях
(например, результат явного сокращения тригонометрического
операнда выходит за рамки определенного диапазона) значение,
используемое для Пи, должно быть такое же как полное встроенное
66-ти битовое Пи. Это застрахует от того, что результаты будут
последовательно сокращаться при обращении к следующей
тригонометрической функции. Число Пи в 66 битов не может быть
представлено как расширенное вещественное значение, так как оно
должно кодироваться как два или более чисел. Обычное решение -
представить число Пи как сумму верхнего Пи, которое содержит 33
высшие значащие бита, и нижнего Пи, которое содержит 33 низшие
значащие бита. При использовании этого двухчастного Пи, все
вычисления следут выполнять над каждой частью отдельно и
результаты складывать только в конце.
Трудностей установления последовательных значений Пи для
сокрашаемого аргумента можно избежать либо применением
тригонометрических функций только к аргументам из диапазона
механизма автоматического сокращения, либо выполнением всех
сокращений аргумента (до значения меньшего чем Пи/4)
непосредственно в программном обеспечении.
17.6 Операции с константами
----------------------------------------------------------------
Каждая из этих команд (Таблица 17-7) заносит общеиспользуемые
константы в стек. (ST(7) должен быть пуст для того, чтобы
избежать исключения.) Значения имеют полную
расширенную точность (64 бита) и достигают примерно 19-ти
десятичных цифр. Так как расширенная вещественная константа
занимает 10 байт памяти, то команды с константами, которые
имеют длину только 2 байта, сохраняют информацию и повышают скоро
сть
выполнения, упрощая вдобавок программирование.
              Таблица 17-7. Команды с Константами
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і           Мнемоника           і          Команды              і
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і                               і                               і
і            FLDZ               і      Загрузить + 0.0          і
і                               і                               і
і            FLD1               і      Загрузить + 1.0          і
і                               і                               і
і            FLDPI              і      Загрузить Пи             і
і                               і                               і
і            FLDL27             і      Загрузить log 10         і
і                               і                   2           і
і            FLDL2E             і      Загрузить log e          і
і                               і                   2           і
і            FLDLG2             і      Загрузить log  2         і
і                               і                   10          і
і            FLDLN2             і      Загрузить log 2          і
і                               і                   e           і
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Константы, используемые этими командами, во внутреннем
представлении сохраняются в более точном формате, чем
расширенный вещественный. При загрузке констант модуль обработки
операций с плавающей точкой округляет более точные внутренние
константы в соотвестствии с битом RC (управление округлением)
слова состояния. Однако несмотря на это округление, исключения
точности не генерируется (для поддержки совместимости). Когда
устанослено округление до ближайшего, модуль обработки операций
с плавающей точкой выдает точно такие же константы, какие
выдавались бы арифметическими сопроцессорами 8087 и 80287.
17.7 Управляющие команды
----------------------------------------------------------------
Управляющие команды модуля обработки операций с плавающей
точкой показаны в Таблице 17-8. Команда FSTSW обычно
используется для условного ветвления. Остальные команды как
правило не используются в вычислениях, они управляют действиями
модуля обработки операций с плавающей точкой на системном
уровне. Эти действия включают в себя инициализацию модуля
обработки операций с плавающей точкой, обработку численных
исключений и переключение задач.
              Таблица 17-8. Управляющие Инструкции
ЪДДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї
і      Мнемоника      і              Операция                   і
ГДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
і                     і                                         і
і FINIT/FNINIT        і Инициализация FPU                       і
і                     і                                         і
і FLDCW               і Загрузка Управляющего Слова             і
і                     і                                         і
і FSTCW/FNSTCW        і Сохранить Управляющее Слово             і
і                     і                                         і
і FSTSW/FNSTSW        і Сохранить Слово Состояния               і
і                     і                                         і
і FSTSW AX/FNSTSW AX* і Сохранить Слово Состояния в Регистре AX і
і                     і                                         і
і FCLEX/FNCLEX        і Сброс Исключения                        і
і                     і                                         і
і FSTENV/FNSTENV      і Сохранить Окружение                     і
і                     і                                         і
і FLDENV              і Загрузить Окружение                     і
і                     і                                         і
і FSAVE/FNSAVE        і Сохранить Состояние                     і
і                     і                                         і
і FRSTOR              і Восстановить Состояние                  і
і                     і                                         і
і FINCSTP             і Увеличить Указатель Вершины Стека       і
і                     і                                         і
і FDECSTP             і Уменьшить Указатель Вершины Стека       і
і                     і                                         і
і FFREE               і Очистить Регистры                       і
і                     і                                         і
і FNOP                і Нет Операция                            і
і                     і                                         і
і FWAIT               і Отчет об ошибках FPU                    і
і                     і                                         і
АДДДДДДДДДДДДДДДДДДДДДБДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
* Недоступно для математического сопроцессора 8087.
Как показано в Таблице 17-8, конкретные команды имеют
альтернативную мнемонику. Команды, которые инициализируют
модуль обработки операций с плавающей точкой, снимают
исключения или сохраняют (полностью или частично) операционную
среду модуля обработки операций с плавающей точкой, можно
представить в двух видах:
- Ожидать - эта мнемоника начинается с одного F, например FSTSW.
  Этот вид проверяет на немаскируемые численные исключения.
- Не ожидать - эта мнемоника начинается с FN, например FNSTSW.
  Этот вид игнорирует немаскируемые численные исключения.
Когда управляющие команды кодируются с использованием мнемоники
"не ожидать", ассемблер ASM386/486 не выполняет ESC-команду
перед команду WAIT (ожидать), а процессор не тестирует условие
возникновения ошибки при команде с плавающей точкой перед
выполнением управляющей команды.
В Таблице 17-8 показаны не только команды вида "не ожидать".
Все остальные команды с плавающей точкой автоматически
синхронизируются процессором. Все операнды передаются перед тем,
как следующая команда начнет выполняться. Из-за этой
автоматической синхронизации перед неуправляющими командами с
плавающей точкой не надо выполнять команду WAIT для того, чтобы
все было корректно.
Синхронизация исключений возложена на команду WAIT. Так как
модуль обработки операций с плавающей точкой и модуль обработки
целочисленных операций работают параллельно, то в случае
исключения с плавающей точкой возможно, что процессор будет
использовать информацию, необходимую для исправления этой
ситуацией, перед тем, как вызвать обработчик этого исключения.
Применение команды WAIT или FWAIT в надлежащем месте может
предотвратить это. Смотрите Главу 18 для дальнейших пояснений.
Следует также обратить внимание на то, что команды FENI и
FDISI сопроцессора 8087 и команда FSETPM сопроцессора 80287
не реализуют никаких функций в процессоре i486. Если эти коды
операций обнаруживаются в потоке команд, то процессор i486 не
выполняет каких-либо специальных действий и не меняет никаких
внутренних состояний. В Главе 25 приведено более полное описание
различий между командами с плавающей точкой процессора i486 и
арифметических сопроцессоров 8087, 80287 и 387 DX.


Яндекс цитирования