1.2. Битовые операции в языке Ассемблер.
Логические операции с битами-OR, XOR, NOT, AND.Эти команды работают с приемником и источником, исключение команды ‘NOT’. Каждый бит в приемнике сравнивается с тем же самым битом в источнике, и в зависимости от команды 0 и 1 помещается в бит приемник:
Команда |
AND |
OR |
XOR |
NOT |
||||||||||||
Бит источника |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
||
Бит приемника |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
X |
X |
||
Бит результата |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
||
Для выполнения операции логического И предназначена команда AND. У этой команды 2 операнда, результат помещается на место первого операнда. Часто эта команда используется для обнуления определённых битов числа. При этом второй операнд называют маской. Обнуляются те биты операнда, которые в маске равны 0, значения остальных битов сохраняются. Логическое ИЛИ вычисляется с помощью команды OR. У этой команды тоже 2 операнда и результат помещается на место первого. Часто эта команда используется для установки в 1 определённых битов числа. Если бит маски равен 1, то бит результата будет равен 1, остальные биты сохранят свои значения.
Обозначение операции в комментарии к первой строке используется во многих языках высокого уровня. Часто XOR используется для обнуления регистров. Если операнды равны, то результат операции равен 0. Такой способ обнуления работает быстрее и, в отличии от команды MOV, не содержит непосредственного операнда, поэтому команда получается короче (и не содержит нулевых байтов).
Каждый бит операнда меняет своё значение на противоположное (0- 1, 1- 0).
Операция выполняется с помощью команды NOT. У этой команды только один операнд. Результат помещается на место операнда. Эта команда не изменяет значение флагов.
Ещё одна команда сравнения- TEST.Команда TEST выполняет операцию AND с двумя операндами и в зависимости от результата устанавливает или сбрасывает соответствующие флаги. Результат не сохраняется. TEST используется для проверки бит, например в регистре:
Test eax, 100b
jnz смещение
Команда jnz выполнит переход, если в регистре eax третий бит справа- установлен. Очень часто команду test используют для проверки, равен ли регистр нулю:
Test ecx, ecx
jz смещение
Команда jz выполнит переход, если ecx=0 [8].
1.3. Примеры использования битовых операций.
Примеры с использованием команды OR:
Установить 3 и 0 биты в регистре al, остальные биты не изменять.
or al, 00001001b
Допустим:
al, 11000011, тогда 3 и 0 биты будут равняться 1,т.к.:
Таким образом, операция OR служит для установки бита в 1.
Пример с использованием команды AND:
Сбросить 4 и 6 биты в регистре al, остальные биты не изменять.
and al, 10101111
Допустим:
al, 1101000, тогда 4 и 6 биты сбросятся до 1, т.к.:
Таким образом, операция AND служит для сбрасывания каких-то определённых битов.
Пример с использованием команды NOT:
Посчитать число единицы в регистре al, рассматривая байт, как набор бит.
mov cx, b :число сдвига
xor bl, bl :обнуление Bl
LL: shl al, 1 :сдвиг влево на один разряд
jnc NO :переход, если нет переноса
inc bl :иначе увеличить Bl
NO: loop
LL
:возврат, если сх
0
Получается, что команда NOT считает число единиц в регистре, при этом рассматривая байт, как набор битов.
Пример с использованием команды XOR:
Инвертировать 2 и 4 биты в регистре al, остальные биты не изменять.
xor al, 00010100b
Допустим al, 00001111
Из этого следует, что команда XOR инвертирует биты в регистре.
Пример с использованием команды TEST:
Дан массив из 10 байт. Все байты имеют нулевые старшие биты. Необходимо каждый байт содержащий единицу в нулевом бите дополнить до чётного числа единиц установкой седьмого бита.
data segment
NB db 04h, 07h, 14h, 23h, 04h, 38h, 3Fh, 2Ah0Dh, 34h
data ends
code segment
assume cs: code, ds:data
start: mov ax, data
mov ds, ax ;загрузить сегментный адрес данных
lea bx, NB ;bx-текущий адрес массива NB
mov cx, 10 ;cx-счетчик числа интерации
BEG: mov al, [bx] ;считать очередной байт массива
test al, 1b ;установлен ли бит 0?
jz BITOCLR ;нет, бит 0 сброшен
;бит 0 установлен
test al, ffh ;четное число единиц?
jp OK ;да, больше ничего делать не надо
or al, 80h ;нечетное дополнить до четного
jmp short OK ;бит 0 сброшен
BITOCLR: test al, ffh ;четное число единиц?
jnp OK ;нет, больше делать не нужно
or al, 80h ;нечетное дополнить до четного
OK: mov [bx], al ;записать измененный байт массива
loop BEG
QUIT: mov ax, 4c00h ;код завершения 0
int 21h ;выход в DOS
code ends
end start
