Введение
Команда AND
Происхождение |
От англ. слова and - и |
Формат |
AND приёмник, источник |
Действие |
Побитовое логическое действие "И"
Если соответствующие биты обоих операндов равны 1, то результат равен 1. Во всех остальных случаях результат =0. |
Команда OR
Происхождение |
От англ. слова or - или |
Формат |
OR приёмник, источник |
Действие |
Побитовое логическое действие "ИЛИ"
Если соответствующие биты обоих операндов равны 0, то результат равен 0. Во всех остальных случаях результат =1. |
Все 4 варианта переключения битов выглядят так:
0101
AND
1001
----
Результат: 0001
0101
OR
1001
----
Результат: 1101
Думаю, это несложно понять.
Практика и примеры
Теперь осталось только закрепить на практике, разобрав несколько жизненных примеров.
Получаем из символьного кода цифры её значение (в prax14 делали так с одним байтом, теперь сразу 4):
mov EAX, 31323334h ; загружаем ASCII-коды символов "1234"
and EAX, 0F0F0F0Fh ; в EAX будет 01020304h
Таким образом, мы "убиваем" старшую тетраду каждого байта и не изменяем младшую.
Разумеется, так же можно обнулять и E-часть регистра:
mov EAX, 12345678h ; загружаем любое число
and EAX, 0000FFFFh ; в EAX будет 00005678h
И даже весь регистр:
and EAX, 0 ; в EAX будет 0
Можно сделать число чётным:
mov EAX, 77777777h ; загружаем любое число
and EAX, -2 ; -2 это ведь 11111111 11111111 11111111 11111110b
; Теперь в EAX обязательно чётное число ("очётили" в младшую сторону)
Можно сделать число кратным степени двойки:
mov EAX, 77777777h ; загружаем любое число
and EAX, -4 ; -4 это ведь 11111111 11111111 11111111 11111100b
; Теперь в EAX число, обязательно кратное 4 в младшую сторону
and EAX, -10h ;-10h это ведь 11111111 11111111 11111111 11110000b
; А теперь обязательно кратное 16 в младшую сторону
Хорошо, а что может делать OR?
Например, в обратную сторону получаем символьный код цифры из значения:
mov EAX, 01020304h ; загружаем значения
or EAX, 30303030h ; в EAX будут ASCII-коды символов "1234"
Таким образом, мы записываем в старшую тетраду каждого байта тройку и не изменяем младшую тетраду.
Соответственно, легко сделать число нечётным:
mov EAX, 88888888h ; загружаем некоторое число
or EAX, 1 ; Теперь в EAX обязательно нечётное число ("онечётили" в большую сторону)
То есть можно включить любой нужный бит или сразу несколько битов:
or EAX, 10101010 10101010 10101010 10101010b
Обычно это делается для того, чтобы задавать параметры или состояния, которые предварительно описывают в константах, примерно так:
ICON_FLAG equ 1 ; 0001b
OPEN_FLAG equ 2 ; 0010b
EDIT_FLAG equ 4 ; 0100b
X_FLAG equ 8 ; 1000b
...
or dword ptr [Status], EDIT_FLAG ; вкл. состояние редактирования (бит № 2)
Бинарники любят спорить. Они спорят так часто, что уже давно знают результат любого спора. И всё равно они спорят. Спорят даже в тех случаях, когда результат не меняется. Впрочем, иногда цель спора не очевидна. Возможно, молодой бинат просто хочет произвести впечатление на красотку с флагом.
Чаще всего команду OR используют хитрее. Проверить регистр на ноль можно так:
or EAX,EAX ; не изменяет содержимое регистра, но включает ZF (флаг нуля), если EAX=0