|
||||||||||||
Трюки на Ассемблере, бинарные операции AND, OR
Время создания: 27.08.2014 08:34
Раздел: Компьютер - Программирование - Ассемблеры - Архитектура Intel
Запись: xintrea/mytetra_syncro/master/base/1409114066ebj90pahbn/text.html на raw.github.com
|
||||||||||||
|
||||||||||||
Введение Команда AND
Команда OR
Все 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 |
||||||||||||
Так же в этом разделе:
|
||||||||||||
|
||||||||||||
|