Программирование на Ассемблере


Основные команды для работы с битами


Основные команды заданы в табл. 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:

Содержание раздела