Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
FUCOM
Влияние команды на флаги и форматы команды:
* |
* |
* |
|
|
|
|
D0 E0+i |
FUCOM ST(i) |
Сравнить ST(0) и ST(i) |
Intel387 |
fucom ST(3) |
DD E1 |
FUCOM |
Сравнить ST(0) и ST(1) |
Intel387 |
fucom |
DD E8+i |
FUCOMP ST(i) |
Сравнить ST(0) и ST(i), верхний элемент выталкивается из регистрового стека |
Intel387 |
fucomp ST(4) |
DD E9 |
FUCOMP |
Сравнить ST(0) и ST(1), верхний элемент выталкивается из регистрового стека |
Intel387 |
fucomp |
DA E9 |
FUCOMPP |
Сравнить ST(0) и ST(1), из регистрового стека выталкивается два верхних элемента |
Intel387 |
fucompp |
Описание:
Команды неупорядоченного сравнения вещественных значений сравнивают вершину стека с операндом-источником, который должен быть регистром. По результатам сравнения устанавливаются биты условий C0, C2, C3 регистра SW. Команда FUCOMP, кроме этого, выталкивает из стека верхний элемент (ST). Команда FUCOMPP — два верхних элемента. Биты условий регистра SW аналогичны флагам регистра EFLAGS, они устанавливаются по результатам операций FPU, а их соответствие флагам приведено в таблице 6.192.
Таблица 6.192. Соответствие между битами C0..C3 регистра SW и битами регистра EFLAGS
Флаги FPU |
Флаги EFLAGS |
C0 |
CF |
C1 |
Нет |
C2 |
PF |
C3 |
ZF |
Отличия между командами FCOM, FCOMP, FCOMPP и командами неупорядоченного сравнения FUCOM, FUCOMP, FUCOMPP заключаются в работе с операндами QNaN. FCOM, FCOMP и FCOMPP генерируют исключение #IA и устанавливают флаги в значение "несравнимо" (C0=1, C2=1, C3 = 1), если любой операнд команды NaN (SNaN или QNaN) или представлен в неподдерживаемом формате. Команды FUCOM, FUCOMP и FUCOMPP делают то же самое, кроме генерации исключения #IA для случая с операндами QNaN.
Биты условий устанавливаются в "несравнимо" (С1 C2 С3 = 111), только если исключение #I замаскировано. Флаг C1 устанавливается равным 0 в случае возникновения стековой ошибки #IS.
Знак нуля игнорируется, так что -0.0 равен +0.0.
Операция:
CASE (Отношение операндов) OF
ST > SRC: C3, C2, C0 = 000;
ST < SRC: C3, C2, C0 = 001;
ST = SRC: C3, C2, C0 = 100;
ESAC;
IF ST(0) or SRC = QNaN
THEN
C3, C2, C0 = 111;
ELSE (* ST(0) или SRC в неподдерживаемом формате или SNaN *)
#IA;
IF FPUControlWord.IM = 1
THEN
C3, C2, C0 = 111;
FI;
FI;
IF Команда FUCOMP
THEN
PopRegisterStack;
FI;
IF Команда FUCOMPP
THEN
PopRegisterStack;
PopRegisterStack;
FI;
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru