          КОМАНДЫ ЛОГИЧЕСКИХ ОПЕРАЦИЙ: AND, OR, XOR, TEST, NOT
          ------------------------------------------------------------
          
             Логические   операции   являются   важным   элементом   в
          проектировании  микросхем  и  имеют  много  общего  в логике
          программирования.  Команды   AND, OR, XOR и TEST  - являются
          командами логических операций.  Эти команды используются для
          сброса и установки бит и для арифметических операций  в коде
          ASCII (см.гл.13). Все эти команды обрабатывают один байт или
          одно слово в регистре  или в памяти,  и  устанавливают флаги
          CF, OF, PF, SF, ZF.
          
          AND:  Если оба из  сравниваемых битов равны  1, то результат
          равен 1; во всех остальных случаях результат - 0.
          
          OR:  Если хотя  бы  один  из сравниваемых битов равен  1, то
          результат  равен  1;  если  сравниваемые  биты  равны  0, то
          результат - 0.
          
          XOR: Если один из сравниваемых битов равен 0, а другой равен
          1,  то результат  равен 1;  если сравниваемые биты одинаковы
          (оба - 0 или оба - 1) то результат - 0.
          
          TEST:  действует как AND-устанавливает флаги, но не изменяет
          биты.
          
             Первый  операнд в логических  командах  указывает на один
          байт или слово в регистре или в памяти  и является единствен
          ным  значением,  которое  может  изменятся  после выполнения
          команд.  В  следующих командах  AND,  OR  и XOR используются
          одинаковые битовые значения:
             
                              AND       OR        XOR
                              0101      0101      0101
                              0011      0011      0011
               Результат:     0001      0111      0110
             

          
          Ассемблер для IBM PC. Глава 7                            145


             Для  следующих несвязанных примеров,  предположим, что AL
          содержит 1100 0101, а BH содержит 0101 1100:
             
             1.     AND  AL,BH     ;Устанавливает в AL 0100 0100
             2.     OR   BH,AL     ;Устанавливает в BH 1101 1101
             3.     XOR  AL,AL     ;Устанавливает в AL 0000 0000
             4.     AND  AL,00     ;Устанавливает в AL 0000 0000
             5.     AND  AL,0FH    ;Устанавливает в AL 0000 0101
             6.     OR   CL,CL     ;Устанавливает флаги SF и ZF
             
          Примеры  3  и  4  демонстрируют  способ  очистки регистра. В
          примере 5   обнуляются  левые четыре бита регистра  AL. Хотя
          команды сравнения  CMP могут быть  понятнее, можно применить
          команду OR для следующих целей:
          
             1.     OR   CX,CX     ;Проверка CX на нуль
                    JZ   ...       ;Переход, если нуль
             2.     OR   CX,CX     ;Проверка знака в CX
                    JS   ...       ;Переход, если отрицательно
             
             Команда  TEST  действует   аналогично  команде   AND,  но
          устанавливает только  флаги,  а операнд не  изменяется. Ниже
          придено несколько примеров:
             
             1.     TEST BL,11110000B   ;Любой из левых бит в BL
                    JNZ  ...            ;  равен единице?
             2.     TEST AL,00000001B   ;Регистр AL содержит
                    JNZ  ...            ;  нечетное значение?
             3.     TEST DX,OFFH        ;Регистр DX содержит
                    JZ   ...            ;  нулевое значение?
             
          Еще одна логическая команда NOT устанавливает обpатное значе
          ние бит в байте или в слове,  в регистре или  в памяти: нули
          становятся  единицами,  а единицы -  нулями. Если, например,
          pегистр  AL содержит 1100  0101,  то команда NOT AL изменяет
          это значение на 0011 1010. Флаги не меняются. Команда NOT не
          эквивалентна  команде   NEG,   которая  меняет   значение  с
          положительного  на  отрицательное  и  наоборот,  посредством
          замены бит на противоположное значение и прибавления единицы
          (см."Отрицательные числа" в гл.1.).
