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