Команды этого класса позволяют сравнивать числа всех поддерживаемых вещественных и целых типов данных. Каждая из этих команд (Таблица 17-4) анализирует элемент в вершине стека, часто по отношению к другому операнду, и в результате выдает код условия в слово состояния (флаги C0, C2 и C3).
Основными командами являются сравнение, тестирование (сравнение с нулем) и проверка (на тип, знак и нормализацию). Особые формы команды сравнения предназначены для оптимизации алгоритмов, разрешая прямое сравнение с двоичными целыми и вещественными числами в памяти также, как и выталкивание из стека после сравнения.
Таблица 17-4. Операции Сравнения +---------------------------------------------------------------+| Мнемоника | Операция |+-----------+---------------------------------------------------|| | || FCOM | Сравнить Вещественные || | || FCOMP | Сравнить Вещественные и Взять из Стека || | || FCOMPP | Сравнить Вещественные и Дважды Взять из Стека || | || FICOM | Сравнить Целые || | || FICOMP | Сравнить Целые и Взять из Стека || | || FTST | Тестирование || | || FUCOM* | Сравнение Неупорядоченных Вещественных || | || FUCOMP* | Сравнить Неупорядоченные Вещественные и Взять из || | Стека || | || FUCOMPP* | Сравнить Неупорядоченные Вещественные и Взять из || | Стека Дважды || | || FXAM | Проверка || | |+---------------------------------------------------------------+ * Недоступно для математического сопроцессора 80287/8087.
Команда FSTSW AX (сохранить слово состояния) может быть использована после сравнения для того, чтобы передать код условия в регистр AX для просмотра. Команда TEST рекомендуется для использования флагов модуля обработки операций с плавающей точкой для управления условным ветвлением. Сначала проверяется, получилось ли в результате сравнения, что числа неупорядочены. Это может случится, если один операнд является NaN. Сравните содержимое регистра AX с константой 0400H; флаг ZF будет очищен (флаг нуля регистра EFLAGS), если сравнение дало неупорядоченность, и установлен в противном случае. Теперь можно использовать команду JNZ для того, чтобы передать управление (при необходимости) программе, которая обрабатывает случай неупорядоченных операндов. Отфильтровав случай неупорядоченных операндов, снова сравните содержимое регистра AX с соответствующей константой из Таблицы 17-5, а затем используйте соответствующую условную ветвь.
Нет необходимости все время отфильтровывать случай неупорядоченности при использовании этого алгоритма для условных переходов. Если программное обеспечение было тщательно оттестировано и включает периодические проверки результата на QNaN (как рекомендовано в Главе 16), то совершенно не обязательно проверять случай неупорядоченности всякий раз после сравнения. Кроме представленых в группе операций сравнения, некоторые другие команды могут обновлять код условия. Для того, чтобы быть уверенным, что слово состояния не было случайно изменено, сохраняйте его сразу же после команды сравнения.