Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скляров И. Изучаем Assembler за 7 дней (2010).pdf
Скачиваний:
1335
Добавлен:
23.02.2015
Размер:
2.11 Mб
Скачать

 

http://www.sklyaroff.ru

110

 

 

Таблица 5.8. (окончание)

 

 

 

 

FCLEX

Обнулить флаги исключений (PE, UE, OE, ZE, DE, IE, а также флаги ES,

 

 

SF и B в регистре состояния FPU). Данная команда проверяет наличие

 

 

произошедших и необработанных исключений и обрабатывает их до

 

 

выполнения. Команда FCLEX полностью эквивалентна команде WAIT

 

 

FNCLEX

 

 

 

 

 

FNCLEX

Обнулить флаги исключений (PE, UE, OE, ZE, DE, IE, а также флаги ES,

 

 

SF и B в регистре состояния FPU) без ожидания

 

 

 

 

 

FSTENV

Сохранить состояние сопроцессора (CWR, SWR, TWR, IPR, DPR) в

 

приемник

приемник (14 или 28 байт в памяти, в зависимости от разрядности

 

 

операндов). Данная команда проверяет наличие произошедших и

 

 

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

 

 

FSTENV полностью эквивалентна WAIT FNSTENV

 

 

 

 

 

FNSTENV

Сохранить состояние сопроцессора (CWR, SWR, TWR, IPR, DPR) в

 

приемник

приемник (14 или 28 байт в памяти, в зависимости от разрядности

 

 

операндов) без ожидания

 

 

 

 

 

FLDENV

Загрузить состояние сопроцессора (CWR, SWR, TWR, IPR, DPR) из

 

источник

источника (область памяти в 14 или 28 байт, в зависимости от

 

 

разрядности операндов)

 

 

 

 

 

FSAVE приемник

Сохранить состояние FPU. Сохраняет регистры данных и

 

 

вспомогательные регистры в приемник (область памяти 94 или 108 байт, в

 

 

зависимости от разрядности операндов) и инициализирует FPU

 

 

аналогично командам FINIT/FNINIT. Данная команда проверяет наличие

 

 

произошедших и необработанных исключений и обрабатывает их до

 

 

выполнения. Команда FSAVE полностью эквивалентна WAIT FNSAVE

 

 

 

 

FNSAVE

Сохранить состояние FPU без ожидания. Сохраняет регистры данных и

 

приемник

вспомогательные регистры в приемник (область памяти 94 или 108 байт, в

 

 

зависимости от разрядности операндов) и инициализирует FPU

 

 

аналогично командам FINIT/FNINIT

 

 

 

 

 

FXSAVE

Быстрое сохранение состояния FPU. Данная команда работает только на

 

приемник

процессорах Pentium II и выше. Сохраняет регистры данных и

 

 

вспомогательные регистры в приемник (512-байтную область памяти с

 

 

адресом, кратным 16), не проверяя на необработанные исключения,

 

 

аналогично команде FNSAVE

 

 

 

 

 

FRSTOR

Восстановить состояние FPU. Загружает регистры данных и

 

источник

вспомогательные регистры из источника (область в памяти размером в 94

 

 

или 108 байт, в зависимости от разрядности операндов)

 

 

 

 

 

FXRSTOR

Быстрое восстановление состояния FPU. Данная команда работает только

 

источник

на процессорах Pentium II и выше. Восстанавливает текущее состояние

 

 

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

 

 

источника (512-байтной области памяти с адресом, кратным 16), который

 

 

был запомнен командой FXSAVE

 

 

 

 

 

FINCSTP

Инкремент указателя стека. Увеличивает на 1 значение поля TOP регистра

 

 

состояния FPU. Если TOP было равно семи, оно обнуляется

 

 

 

 

 

FDECSTP

Декремент указателя стека. Уменьшает на 1 значение поля TOP регистра

 

 

состояния FPU. Если TOP было равно нулю, оно устанавливается в 7

 

 

 

 

 

FFREE ST(n)

Освободить регистр данных. Команда отмечает в регистре TWR, что

 

 

указанный регистр данных ST(n) пустой. Содержимое регистра TOP не

 

 

изменяется

 

 

 

 

 

FNOP

Холостая операция сопроцессора. Данная команда занимает место и

 

 

время, но не выполняет никакого действия

 

 

 

 

 

WAIT (FWAIT)

Ожидание процессором завершения текущей операции сопроцессора.

 

 

WAIT и FWAIT – это разные названия одной и той же команды

 

 

 

 

 

5.4.4.5. Команды сравнения

Команды сравнения FPU приведены в табл. 5.9.

 

http://www.sklyaroff.ru

111

 

 

Таблица 5.9. Команды сравнения FPU

 

 

 

 

 

Команда

Описание

 

 

 

 

 

FCOM источник

Сравнение вещественных чисел хранящихся в ST(0) и в источнике.

 

 

Источник может быть 32или 64-битная переменная или регистр ST(n).

 

 

Если источник не указан, сравниваются ST(0) и ST(1). При этом

 

 

устанавливаются флаги С0, С2 и С3 следующим образом:

 

 

 

• ST(0) > источник C0=0, C2=0, C3=0

 

 

 

• ST(0) < источник C0=1, C2=0, C3=0

 

 

 

• ST(0) = источник C0=0, C2=0, C3=1

 

 

 

Если операнды несравнимы, то C0=C2=C3=1

 

 

 

 

 

FCOMP

Сравнить и вытолкнуть из стека. Сравнивает вещественного число в ST(0)

 

источник

с источником, затем выталкивает содержимое ST(0) из стека и увеличивает

 

 

TOP на 1. Источник может быть 32или 64-битная переменная или регистр

 

 

ST(n). Флаги С0, С2 и С3 устанавливаются также как в команде FCOM

 

 

 

 

 

FCOMPP

Сравнивает ST(0) и ST(1) и выталкивает из стека и ST(0), и ST(1). Флаги

 

 

С0, С2 и С3 устанавливаются также как в команде FCOM

 

 

 

 

 

FUCOM ST(n)

Сравнение ST(0) с ST(n) без учета порядков. Флаги С0, С2 и С3

 

 

устанавливаются также как в команде FCOM

 

 

 

 

 

FUCOMP ST(n)

Сравнение ST(0) с ST(n) без учета порядков. При выполнении операции

 

 

происходит выталкивание из стека ST(0). Флаги С0, С2 и С3

 

 

устанавливаются также как в команде FCOM

 

 

 

 

 

FUCOMPP

Сравнение ST(0) с ST(n) без учета порядков. При выполнении операции

 

ST(n)

происходит выталкивание из стека и ST(0), и ST(n). Флаги С0, С2 и С3

 

 

устанавливаются также как в команде FCOM

 

 

 

 

 

FICOM

Сравнение целых чисел в ST(0) с источником (16-, 32-битная переменная

 

источник

или ST(n))

 

 

 

 

 

FICOMP

Сравнение целых чисел в ST(0) с источником (16-, 32-битная переменная

 

источник

или ST(n)). При выполнении операции происходит выталкивание ST(0) из

 

 

стека

 

 

 

 

 

FCOMI

Сравнить и установить EFLAGS. Выполняет сравнение ST(0) и источника

 

источник

(регистр ST(n)) и устанавливает флаги следующим образом:

 

 

 

• ST(0) > источник ZF=0, PF=0, CF=0;

 

 

 

• ST(0) < источник ZF=0, PF=0, CF=1;

 

 

 

• ST(0) = источник ZF=1, PF=0, CF=0.

 

 

 

Если операнды несравнимы, то все три флага равны 1

 

 

 

 

 

FCOMIP

Сравнить, установить EFLAGS и вытолкнуть. Флаги устанавливаются

 

источник

также как в команде FCOMI

 

 

 

 

 

FUCOMI

Сравнить без учета порядков и установить EFLAGS. Флаги

 

источник

устанавливаются также как в команде FCOMI

 

 

 

 

 

FUCOMIP

Сравнить без учета порядков, установить EFLAGS и вытолкнуть из стека.

 

источник

Флаги устанавливаются также как в команде FCOMI

 

 

 

 

 

FTST

Проверка ST(0) на ноль. Сравнивает содержимое ST(0) с нулем и

 

 

выставляет флаги C3, C2 и C0 аналогично другим командам сравнения

 

 

 

 

 

FXAM

Анализ содержимого вершины стека (ST(0)). Устанавливает флаги C3, C2,

 

 

C0 следующим образом:

 

 

 

• 000 — неподдерживаемый формат;

 

 

 

• 001 — не число;

 

 

 

• 010 — нормализованное число;

 

 

 

• 011 — бесконечность;

 

 

 

• 100 — ноль;

 

 

 

• 101 — пустой операнд;

 

 

 

• 110 — денормализованное число

 

 

 

 

 

http://www.sklyaroff.ru

112

5.4.4.6. Трансцендентные команды

Трансцедентные команды FPU приведены в табл. 5.10.

 

Таблица 5.10. Трансцендентные команды FPU

 

 

Команда

Описание

 

 

FSIN

Вычисляет синус значения находящегося в ST(0), и сохраняет результат в

 

этом же регистре. Значение считается заданным в радианах и не может

 

быть больше 263 или меньше -263. Если значение выходит за эти пределы,

 

флаг C2 устанавливается в 1 и содержимое ST(0) не изменяется

 

 

FCOS

Вычисляет косинус значения находящегося в ST(0), и сохраняет результат

 

в этом же регистре. Значение считается заданным в радианах и не может

 

быть больше 263 или меньше -263. Если значение выходит за эти пределы,

 

флаг C2 устанавливается в 1 и содержимое ST(0) не изменяется

 

 

FSINCOS

Вычисляет синус и косинус значения находящегося в ST(0), результат

 

вычисления синуса оказывается в ST(1), а косинуса – в ST(0), TOP

 

уменьшается на 1. Значение считается заданным в радианах и не может

 

быть больше 263 или меньше -263. Если значение выходит за эти пределы,

 

флаг C2 устанавливается в 1 и содержимое ST(0) не изменяется

 

 

FPTAN

Вычисляет тангенс числа, находящегося в регистре ST(0) и сохраняет

 

результат в этом же регистре, а затем в стек проталкивается 1, поэтому

 

результат оказывается в ST(1), а ST(0) содержит 1, TOP уменьшается на

 

единицу. Значение считается заданным в радианах и не может быть

 

больше 263 или меньше -263. Если значение выходит за эти пределы, флаг

 

C2 устанавливается в 1 и содержимое ST(0) и стек не изменяются.

 

Единица помещается в стек для того, чтобы можно было получить

 

котангенс вызовом команды FDIVR сразу после FPTAN

 

 

FPATAN

Вычисляет арктангенс числа: arctg(ST(1)/ST(0)).

 

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

 

оказывается в вершине стека

 

 

F2XM1

Вычисление 2x-1. Возводит 2 в степень, значение которой расположено в

 

ST(0), и вычитает 1. Результат сохраняется в ST(0). Значение ST(0)

 

должно лежать в пределах от -1 до +1, иначе результат не определен

 

 

FYL2X

Вычисление y × log2(x). Вычисляет ST(1) × log2(ST(0)), помещает

 

результат в ST(1) и выталкивает ST(0) из стека, так что после этой

 

операции результат оказывается в ST(0). Первоначальное значение ST(0)

 

должно быть неотрицательным

 

 

FYL2XP1

Вычисление y × log2(x+1). Вычисляет ST(1) × log2(ST(0)+1), помещает

 

результат в ST(1) и выталкивает ST(0) из стека, так что после этой

 

операции результат оказывается в ST(0). Первоначальное значение ST(0)

 

должно быть в пределах от –(1-√2/2) до (1+√2/2), в противном случае

 

результат не определен