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



12.4.3. Команды сравнений чисел

В процессорах 8086/80286/80386 команды условных переходов выполняются в соответствии с установкой отдельных битов регистра флагов процессора. В арифметическом сопроцессоре существуют специальные команды сравнений, по результатам выполнения которых устанавливаются биты кодов условий в регистре состояния:

FCOMСравнение
FICOMЦелочисленное сравнение
FCOMPСравнение и извлечение из стека
FICOMPЦелочисленное сравнение и извлечение из стека
FCOMPPСравнение и двойное извлечение из стека
FTSTСравнение операнда с нулем
FXAMАнализ операнда

Команда FCOM вычитает содержимое операнда, размещенного в оперативной памяти, из верхушки стека ST(0). Результат вычитания никуда не записывается и указатель верхушки стека ST не изменяется.



Обозначим операнд команды сравнения как "x". В следующей таблице приведем значения битов кодов условия после выполнения команды "FCOM x":

C3C0Условие
00ST(0) > x
01ST(0) < x
10ST(0) = x
11ST(0) и x не сравнимы.

Последняя комбинация возникает при попытке сравнения нечисел, неопределенностей или бесконечностей, а также в некоторых других случаях.

Команда FICOM работает с 16- или 32-битовыми числами, в остальном она аналогична команде FCOM.

Команды FCOMP и FICOMP аналогичны, соответственно, командам FCOM и FICOM, за исключением того, что после выполнения операнд извлекается из стека.

Команда FCOMPP выполняет те же действия, что и FCOM, но она после выполнения извлекает из стека оба операнда, участвовавших в сравнении.

Для сравнения операнда с нулем предназначена команда FTST. После ее выполнения коды условий устанавливаются в соответствии со следующей таблицей:

C3C0Условие
00ST(0) > 0
01ST(0) < 0
10ST(0) = 0
11ST(0) и 0 не сравнимы.

Команда FXAM анализирует содержимое ST(0). После ее выполнения устанавливаются коды условий, по которым можно судить о знаке числа, о его конечности или бесконечности, нормализованности и т.д.

Бит C1 содержит знак анализируемого числа:

C1Знак числа
0положительное число;
1отрицательное число.

С помощью бита C0 можно определить, является число конечным или бесконечным:

C0Конечность/бесконечность числа
0конечное число;
1бесконечное число.

Для конечных чисел дальнейшая классификация может проводиться по содержимому кодов условий C2 и C3:

C3C2Описание числа
00Ненормализованное число
01Нормализованное число
10Нулевое число
11Число денормализовано

Аналогично, для бесконечных чисел коды условий C2 и C3 имеют следующее значение:

C3C2Описание числа
00Нечисло
01Бесконечное число
10Пустое число
11Пустое число

С помощью команды "FSTSW AX" программа может переписать содержимое регистра состояния сопроцессора в регистр AX центрального процессора. Далее содержимое регистра AH можно переписать в регистр флагов центрального процессора при помощи команды SAHF. Биты кодов условий сопроцессора отображаются на регистр флагов центрального процессора таким образом, что для анализа кодов условий можно использовать команды условных переходов:
---T-T-T-T-T-T-T--¬ ¦B ¦C3¦ ¦ST¦ ¦C2¦C1¦C0¦ L--+--+--+--+--+--+--+--- ---T-T-T-T-T-T-T--¬ ¦SF¦ZF¦ ¦AF¦ ¦PF¦ ¦CF¦ L--+--+--+--+--+--+--+---

Например, в следующем фрагменте программы выполняется переход к метке error, если операнды несравнимы: fcom fstsw ax sahf je error



Содержание раздела