MyTetra Share
Делитесь знаниями!
О, смотри-ка какое хорошее место. Дайте два!
Трюки на Ассемблере, бинарные операции AND, OR
27.08.2014
08:34
Раздел: Компьютер - Программирование - Ассемблеры - Архитектура Intel

Введение

Команда 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

← Содержание ...
 
MyTetra Share v.0.35
Яндекс индекс цитирования