4.4.4. Сравнение

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