Система команд x86 |
|
Программирование - Архитектура и система команд микропроцессоров x86 |
FCOMI
Влияние команды на флаги и форматы команды:
* |
* |
|
|
|
|
|
DB F0+i |
FCOMI ST,ST(i) |
Сравнить ST(0) и ST(i) и установить флаги ZF, PF, CF согласно результата |
Pentium Pro |
fcomi st,st(1) |
DF F0+i |
FCOMIP ST,ST(i) |
Сравнить ST(0) и ST(i) и установить флаги ZF, PF, CF согласно результата, верхний элемент выталкивается из регистрового стека |
Pentium Pro |
fcomip st,st(5) |
DB E8+i |
FUCOMI ST,ST(i) |
Сравнить ST(0) и ST(i) и установить флаги ZF, PF, CF согласно результата |
Pentium Pro |
fucomi st,st(1) |
DF E8+i |
FUCOMIP ST,ST(i) |
Сравнить ST(0) и ST(i) и установить флаги ZF, PF, CF согласно результата, верхний элемент выталкивается из регистрового стека |
Pentium Pro |
fucomip st,st(2) |
Описание:
Команды сравнения вещественных значений FCOMI, FCOMIP, FUCOMI, FUCOMIP сравнивают вершину стека с операндом-источником, который может быть регистром или операндом в памяти (коротким или длинным вещественным). По результатам сравнения устанавливаются не биты условий C0, C2, C3 регистра SW, а соответствующие флаги регистра EFLAGS (см. таблицу 6.142.).
Таблица 6.142. Соответствие между битами C0..C3 регистра SW
и битами регистра EFLAGS
Флаги FPU |
Флаги EFLAGS |
C0 |
CF |
C1 |
Нет |
C2 |
PF |
C3 |
ZF |
Команды FCOMIP и FUCOMIP, кроме этого, выталкивают из стека верхний элемент (ST).
Отличия между командами FCOMI, FCOMIP и командами неупорядоченного сравнения FUCOMI, FUCOMIP заключаются в работе с операндами QNaN. FCOMI и FCOMIP генерируют исключение #IA и устанавливают флаги в значение "несравнимо" (ZF = 1, PF = 1, CF = 1), если любой операнд команды NaN (SNaN или QNaN) или представлен в неподдерживаемом формате. Команды FUCOMI и FUCOMIP делают то же самое, кроме генерации исключения #IA для случая с операндами QNaN.
Если исключение #I не замаскировано, то флаги не устанавливаются перед вызовом обработчика исключений.
Флаг C1 регистра SW устанавливается равным 0 в случае возникновения стековой ошибки #IS.
Знак нуля игнорируется, так что -0.0 равен +0.0.
Операция:
CASE (relation of operands) OF
ST(0) > ST(i): ZF, PF, CF = 000;
ST(0) < ST(i): ZF, PF, CF = 001;
ST(0) = ST(i): ZF, PF, CF = 100;
ESAC;
IF Команда FCOMI или FCOMIP
THEN
IF ST(0) or ST(i) = NaN or unsupported format
THEN
#IA
IF FPUControlWord.IM = 1
THEN
ZF, PF, CF = 111;
FI;
FI;
FI;
IF Команда FUCOMI или FUCOMIP
THEN
IF ST(0) or ST(i) = QNaN, but not SNaN or unsupported format
THEN
ZF, PF, CF = 111;
ELSE (* ST(0) или ST(i) в неподдерживаемом формате или SNaN *)
#IA;
IF FPUControlWord.IM = 1
THEN
ZF, PF, CF = 111;
FI;
FI;
FI;
IF Команды FCOMIP или FUCOMIP
THEN
PopRegisterStack;
FI;
Все права защищены © Алексей Ровдо, 1994-2023. Перепечатка возможна только по согласованию с владельцем авторских прав. admin@club155.ru