Сравнение
Сравнение
Команда сравнения 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 Сравнение с повышенной точностью