Команда сравнения CMP сравнивает два числа, вычитая одно из другого. Она не записывает результат, но флаги состояния устанавливает в соответствии с результатом. Эта команда изменяет только флаги. В программе команда сравнения используется так же, как и команда вычитания; однако команды сравнения с заемом не существует.
Сравнение с повышенной точностью требует чуть больше усилий, чем сравнение байтов или слов. Фактически в этих случаях много проще использовать команду вычитания вместо команды сравнения. На Фиг. 4.11 показано сравнение пары 32-битовых чисел в памяти с использованием регистра AX в качестве области временного хранения. Это сравнение определяет, какое из чисел больше. Программа в результате своего выполнения устанавливает коды условия. Флаг переноса определяет, какое из чисел больше: если флаг равен 1, число VALUE больше.
Вторая программа на Фиг. 4.11 проверяет два 32-битовых числа на равенство. Программа сохраняет младший результат, а затем комбинирует его со старшим, и таким образом выясняет эквивалентность результата нулю. Команда OR описана в следующем разделе, а здесь существенно то, что она комбинирует два значения так, что окончательное значение равно 0 тогда и только тогда, когда оба исходных значения равны 0. Результат этой подпрограммы сравнения - значение флага нуля; если он равен 1, числа равны.
Microsoft (R) Macro Assembler Version 5.00 1/1/80 04:00:59
Фиг. 4.11 Сравнение чисел заданных с повышенной точностью Page 1-1
PAGE ,132
TITLE Фиг. 4.11 Сравнение чисел заданных с повышенной точностью
0000 CODE SEGMENT
ASSUME CS:CODE,DS:CODE
0000 ???????? VALUE1 DD ? ; Область данных размером 32 разряда
0004 ???????? VALUE2 DD ?
0008 FIG4_11 PROC NEAR
;----- Сравниваются по неравенству два 32-разрядных числа
0008 COMPARE_UNEQUAL:
0008 A1 0000 R MOV AX, WORD PTR VALUE1
000B 2B 06 0004 R SUB AX, WORD PTR VALUE2 ; Вычитание младшей части
000F A1 0002 R MOV AX, WORD PTR VALUE1+2
0012 1B 06 0006 R SBB AX, WORD PTR VALUE2+2 ; Вычитание старшей части
0016 C3 RET ; Возврат с установленными флагами
;----- Сравниваются по равенству два 32-разрядных числа
0017 COMPARE_EQUAL:
0017 A1 0000 R MOV AX, WORD PTR VALUE1
001A 2B 06 0004 R SUB AX, WORD PTR VALUE2 ; Вычитание младшей части
001E 8B D8 MOV BX, AX ; В BX младшая часть результата
0020 A1 0002 R MOV AX, WORD PTR VALUE1+2
0023 1B 06 0006 R SBB AX, WORD PTR VALUE2+2 ; Вычитание старшей части
0027 0B C3 OR AX, BX ; Объединение результатов
0029 C3 RET ; Флаг Z показывает равенство
002A FIG4_11 ENDP
002A CODE ENDS
END
Фиг. 4.11 Сравнение с повышенной точностью