Команды сравнений чисел
В центральном процессоре команды условных переходов выполняются в соответствии с установкой отдельных битов регистра флагов процессора. В арифметическом сопроцессоре существуют специальные команды сравнений, по результатам выполнения которых устанавливаются биты кодов условий в регистре состояния:
Команда | Описание | ||
FCOM | Сравнение | ||
FICOM | Целочисленное сравнение | ||
FCOMP | Сравнение и извлечение из стека | ||
FICOMP | Целочисленное сравнение и извлечение из стека | ||
FCOMPP | Сравнение и двойное извлечение из стека | ||
FTST | Сравнение операнда с нулем | ||
FXAM | Анализ операнда |
Команда FCOM вычитает содержимое операнда, размещенного в оперативной памяти, из верхушки стека ST(0). Результат вычитания никуда не записывается и указатель верхушки стека ST не изменяется.
Обозначим операнд команды сравнения как "x". В следующей таблице приведем значения битов кодов условия после выполнения команды "FCOM x":
C3 | C0 | Условие | |||
0 | 0 | ST(0) > x | |||
0 | 1 | ST(0) < x | |||
1 | 0 | ST(0) = x | |||
1 | 1 | ST(0) и x не сравнимы |
Последняя комбинация возникает при попытке сравнения нечисел, неопределенностей или бесконечностей, а также в некоторых других случаях.
Команда FICOM работает с 16- или 32-разрядными числами, в остальном она аналогична команде FCOM.
Команды FCOMP и FICOMP аналогичны, соответственно, командам FCOM и FICOM, за исключением того, что после выполнения операнд извлекается из стека.
Команда FCOMPP выполняет те же действия, что и FCOM, но она после выполнения извлекает из стека оба операнда, участвовавших в сравнении.
Для сравнения операнда с нулем предназначена команда FTST. После ее выполнения коды условий устанавливаются в соответствии со следующей таблицей:
C3 | C0 | Условие | |||
0 | 0 | ST(0) > 0 | |||
0 | 1 | ST(0) < 0 | |||
1 | 0 | ST(0) = 0 | |||
1 | 1 | ST(0) и 0 не сравнимы |
Команда FXAM анализирует содержимое ST(0). После ее выполнения устанавливаются коды условий, по которым можно судить о знаке числа, о его конечности или бесконечности, нормализованности и так далее.
Бит C1 содержит знак анализируемого числа:
C1 |
Знак числа |
0 |
Положительный |
1 |
Отрицательный |
C0 |
Описание |
0 |
Конечное число |
1 |
Бесконечное число |
C3 |
C2 |
Описание числа |
0 |
0 |
Ненормализованное число |
0 |
1 |
Нормализованное число |
1 |
0 |
Нулевое число |
1 |
1 |
Число денормализовано |
C3 |
C2 |
Описание числа |
0 |
0 |
Нечисло |
0 |
1 |
Бесконечное число |
1 |
0 |
Пустое число |
1 |
1 |
Пустое число |
Например, в следующем фрагменте программы выполняется переход к метке error, если операнды несравнимы:
.286
. . .
fcom
fstsw ax
sahf
je error