Сравнение

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