Assembler для начинающих


Сравнение



Сравнение


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




Содержание раздела