Команды сравнений

МНЕМОНИКА ОПИСАНИЕ
FCOM операнд/(без операндов) Сравнение
FICOM операнд Целочисленное сравнение
FCOMP операнд/(без операндов) Сравнение с извлечением из списка
FICOMP операнд Целочисленное сравнение с извлечением
FCOMPP (без операндов) Сравнение и двойное извлечение
FTST (без операндов) Сравнение с нулем
FXAM (без операндов) Анализ
FUCOM (без операндов) Сравнение мантисс операндов
FUCOMP (без операндов) Сравнение мантисс операндов с извлечением
FUCOMPP (без операндов) Сравнение мантисс операндов с двойным извлечением

Во всех операциях сравнения всегда существует ST(0), поэтому требуется один операнд, если нет операндов, то второй операнд берется из ST(1).

FCOM X сравнивает содержимое ST(0) с операндом X и устанавливает следующие коды условия :

 

Условие сравнения С3 С2 С0
ST(0) > X
ST(0) < X
ST(0) = X
ST(0) и X “не сравнимы”

Х- численный регистр, или число в памяти одинарной или двойной точности. Указатель вершины стека - не изменяется.

FCOM - без операндов - это FCOM ST(1).

FCOMP - это FCOMP ST(1) и извлекается из стека содержимое регистра ST(0), то есть указатель вершины стека уменьшается на единицу.

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

FICOM - аналогична FCOM, но операндом является целое число (16 или 32 бита) в памяти.

FCOMP - аналогична FCOM, но после операции сравнения производится одно извлечение из стека, то есть указатель вершины стека уменьшается на единицу.

FICOMP - аналогична FCOMP для целых чисел

FCOMPP (без операндов) действует как FCOM (без операндов), но после сравнения она извлекает из стека оба операнда, то есть указатель вершины стека уменьшается на два.

FTST – сравнивает нулем и устанавливает следующие коды условия:

Условие сравнения С3 С2 С0
ST(0) > 0
ST(0) < 0
ST(0) = 0
ST(0) и 0 “не сравнимы”

FXAM - аналогична FTST, но установка кодов условий другая:

 

С1 = 0 С1 = 1
ST(0) >0 ST(0) <0

 

 

С0 = 0 С0 = 1
ST(0) конечное ST(0) не конечное

 

 

С3 С2     С3 С2  
ненормализованное   нечисло
нормализованное   бесконечность
  пустой регистр
денормализованное   пустой регистр

 

FXAM выполняется примерно в два раза быстрее чем FTST.

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

FUCOM, FUCOMP, FUCOMPP - сравнивают мантиссы. Допускается сравнение нечисел.

Бит С2 = 1, если один или оба операнда - нечисла, а биты С0 и С3 устанавливает соотношение между мантиссами.

- безоперандные- сравнивают ST(0) и ST(1).

Коды условий после команд сравнения мантисс:

С3 С2 С0  
ST(0) > 0
ST(0) < 0
ST(0) = 0
?

Как используются коды условий сопроцессора для условных переходов основного процессора?

Ассемблерная команда сопроцессора FSTSW AX копирует содержимое регистра состояния сопроцессора в регистр AX основного процессора.

Затем коды условий проверяются в среде основного процессора.

Команда SAHF (запомнить AH во флагах) позволяет получить следующий результат:

SF ZF   AF   PF   CF SAHF
15              
B C3   ST   C2 C1 C0 FSTW AX

Результат FCOM по установке флажков такой же, как и у команды CMP основного процессора за исключением условия “не сравнимы”.

FCOM FSTSW AX FWAIT, если нет FPU SAHF JE MET Переход к MET, если ST(0) = ST(1) Команды JE, JNE, JA, JAE, JB, JBE, JP, JNP, JC, JNC, JZ, JNZ – можно использовать для условных переходов