Основные команды для работы с битами
Основные команды заданы в табл. 10.1
Таблица 10.1. Основные команды для работы с битами
Но-мер | Назначение | Код | Выполняемые действия | Формируемые флаги |
| ||||
1 | Побитовое сложение | OR | оп1|=оп2 | c=0, o=0, z, p, s | |||||
2 | Побитовое умножение | AND | оп1&=оп2 | c=0, o=0, z, p, s | |||||
3 | Проверка | TEST | оп1&оп2 | c=0, o=0, z, p, s | |||||
4 | Побитовое
Отрицание | NOT | ~оп1 | Флаги не изменяются | |||||
5 | Сложение по модулю 2 | XOR | оп1^=оп2 | c=0, o=0, z, p, s |
Примеры использования команд.
Пример1. Записать команды для:
· установки в 1 заданного бита в байте;
· установки в 0 заданного бита в слове;
· инвертирования заданного бита в двойном слове;
· проверки заданного бита в двойном слове;
Пусть номер бита является константой
BitNumber EQU 3
b db 37h
w dw 1234h
d1 dd 12345678h
d2 dd 12345678h
...
; установка в 1 заданного бита в байте
OR b, 1 SHL BitNumber
; установка в 0 заданного бита в слове
AND w, NOT (1 SHL BitNumber)
; инвертирование заданного бита в двойном слове
XOR d1, 1 SHL BitNumber
проверка заданного бита в двойном слове
TEST d2, 1 SHL BitNumber
jz zero
...
zero:
Пример 2.
Задан массив байтов. Переписать в другой массив те байты первого массива, в которых биты 0 и 4 единичные, биты 1, 3, 7 - нулевые, значения остальных битов не имеет значения.
Для решения этой задачи сформируем маски для выделения требуемых битов и проверки заданных битов на 1. Первая маска может быть сформирована так:
(1 shl 0) or (1 shl 4) or (1 shl 1) or (1 shl 3) or (1 shl 7).
Вторая маска имеет вид:
(1 shl 0) or (1 shl 4).
Ideal
p386
model flat
extrn ExitProcess:proc
dataseg
a db 11h, 12h, 23h, 34h, 56h, 78h, 90h, 0a1h, 0b2h, 0c3h, 0d4h, 0e5h
count dd 11
b db 11 dup (0)
codeseg
begin:
mov ecx, [count]
mov eax, 0; индекс исходного массива
mov edx, 0 ;индекс результирующего массива
fori:
mov bl, [a+eax]
mov bh, bl
and bl, (1 shl 0) or (1 shl 4) or (1 shl 1) or (1 shl 3) or (1 shl 7)
xor bl, (1 shl 0) or (1 shl 4)
jnz short next
mov [b+edx], bl
inc edx
next:
inc eax
loop fori
call ExitProcess
end begin
В этом примере только первое число удовлетворяет поставленным требованиям.
Пример 3. Вычислить значение булевского выражения.
Значение выражения равно истине, если значение хотя бы одного слагаемого равно истине. Для выделения требуемых битов и проверки единичных битов используются константы:
; Первое слагаемое
c11 db 11010110b
c12 db 10000110b
; Второе слагаемое
c21 db 01101100b
c22 db 01001000b
; Третье слагаемое
c31 db 00000111b
c32 db 00000101b
Пусть вычисляется значения для байта
x db 10101010b
Результат записывается в поле RES и равен 0 для ответа «Ложь» и 1 для ответа «Истина».
RES db ?
; Проверка первого слагаемого
mov RES, 1; Пусть ответ равен «Истина»
mov al, [x]
and al, [c11]
xor al, [c12]
jz short true
; Проверка второго слагаемого
mov al, [x]
and al, [c21]
xor al, [c22]
jz short true
; Проверка третьего слагаемого
mov al, [x]
and al, [c31]
xor al, [c32]
jz short true
mov [RES], 0
true: