Применение логических инструкций

Логические команды служат для сброса или установки отдельных бит в байте или слове. Они включают булевы операторы НЕ, И, ИЛИ, исключающее ИЛИ и операцию тестирования, которая устанавливает флаги, но не изменяет значения своих операндов.

Логические инструкции

not dst

Инструкция not инвертирует все биты байта или слова.

and dst, src

Инструкция and выполняет операции логическое И двух операндов (байтов или слов) и возвращает результат в операнд-приемник. Бит результата устанавливается в 1, если установлены в 1 оба соответствующих ему бита операндов, и устанавливаются в 0 противном случае.

or dst, src

Инструкция or выполняет операции логическое ИЛИ двух операторов (байтов или слов) и помещает результат на место операнда-приемника. Бит результата устанавливается в 1, если равен 1 хотя бы один из двух соответствующих ему битов операндов и устанавливается в 0 в противном случае.

xor dst, src

Инструкция xor выполняет операцию логическое исключающее ИЛИ двух операндов и помещает результат на место операнда-приемника. Бит результата устанавливается в 1, если соответствующие ему биты операндов имеют противоположные значения, и устанавливается в 0 в противном случае.

test dst, src

Инструкция test выполняет логическое И двух операндов (байтов или слов), модифицирует флаги, но результат не возвращает, т.е. операнды не изменяются.

В таблице 4.1. приведены значения регистра флагов, устанавливаемые логическими командами.

Таблица 4.1  
Логические инструкции  
Мнемокод Флаги Действие  
Код Операнды O S Z A P C  
and dst, src x x u x логическое И  
or dst, src x x u x логическое ИЛИ  
xor dst, src x x u x логическое исключающее ИЛИ  
not Dst - - - - - - логическое НЕТ  
test dst, src x x u x логическое И без изменения dst  
  Примечание:
  - флажок не модифицируется;
  х Устанавливается или сбрасывается в соответствии с результатом;
  u не определен;
  Сбрасывается в 0.
                       

Примеры использования логических команд

Установить 3 и 0 биты в регистре аl, остальные биты не изменять.

or al, 00001001b

Сбросить 4 и 6 битвы в регистре al, остальные биты не изменять.

and al, 10101111b

Инвертировать 2 и 4 биты в регистре al, остальные биты не изменять.

xor al, 00010100b

Перейти на метку LAB, если установлен 4 бит регистра al, в противном случае продолжить выполнение программы.

test al, 00010000b

jnz LAB

продолжаем

. . .

LAB:

Посчитать число единиц в регистре al, рассматривая байт, как набор бит.

mov cx, b ; число сдвигов

xor bl, bl ; обнуление BL

LL: shl al, 1 ; сдвиг влево на один разряд

jnc NO ; переход, если нет переноса

inc bl ; иначе увеличить BL

NO: loop LL ; возврат, если cx ¹0

Пример выполнения работы

Дан массив из 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, 0ffh ; четное число единиц?

jp OK ; да, больше ничего делать не надо

or al, 80h ; нечетное дополнить до четного?

jmp short OK

; бит 0 сброшен

BITOCLR: test al, 0ffh ; четное число единиц?

jnp OK ; нет, больше ничего делать не нужно

or al,80h ; нечетное, дополнить до нечетного

OK: mov [bx], al ; записать измененный байт массива

loop BEG

QUIT: mov ax, 4c00h ; Код завершения 0

Int 21h ; Выход в DOS

code ends

end START

Варианты заданий

Дан массив из 10 байт. Посчитать количество байт, в которых сброшены 6 и 4 биты.

Дан массив из 8 байт. Рассматривая его, как массив из 64 бит, пос­чи­тать количество единиц.

Дан массив из 8 байт. Рассматривая его как массив логических значений х0 х1 х2 х3 х4 х5 х6 х7 (true-есть ненулевые биты в байте, false-все биты нулевые), вычислить логическую формулу

f=(x7 & x6 & x1) V (x6 & x4 & x2 & x1 & x0) V (x7 & x6 & x3 & x1).

Дан массив из 10 байт. Посчитать количество байт с числом единиц в байте равным три.

Рассматривая байт как набор логических значений x7 x6 x5 x4 x3 x1 x0 (true -1, false - 0), вычислить логическую формулу

f=(x7 & x6 & x3 ) V (x6 & x4 & x2 & x1) V (x7 & x6 & x2 & x0)

Дан массив из 8 байт. Рассматривая его, как массив из 64 бит посчитать длину самой длинной последовательности единиц.

Дан массив из 10 байт. Посчитать количество единиц во всех разрядах, кратных трём: 3, 6, 9, …, 75, 78.

Дан массив из 5 байт. Рассматривая его как массив из 8 пятиразрядных слов, найти “исключающее или” всех 8 слов для выражения “10101”.

Дан массив из 6 байт. Рассматривая его, как массив из 48 бит, посчитать в нём количество нулей.

Дан массив из 8 байт. Рассматривая его, как массив из 64 бит, посчитать количество пар единиц в окружении нулей. Конец последовательности рассматривать как нуль.

Дан массив из 7 байт. Рассматривая его, как массив из восьми семибитных слов, посчитать количество слов с нечетным числом нулей в слове.

Дан массив из 9 байт. Рассматривая его как массив из 72 бит, посчитать число переходов между нулями и единицами.

Дан массив из 3 байт. Рассматривая его, как массив из 24 бит, посчитать количество одиночных единиц в окружении нулей. Конец последовательности рассматривать как нуль.

Дан массив из 6 байт. Посчитать количество байт число единиц, в которых не превышает 3.

Дан массив из 11 байт. Посчитать количество байт, в которых нет единиц, стоящих рядом.

Дан массив из 4 байт. Рассматривая его, как массив из 32 бит посчитать длину самой длинной последовательности нулей.

Дан массив из 6 байт. Посчитать количество единиц во всех разрядах, кратных пяти: 5, 10, …, 45.

Дан массив из 3 байт. Рассматривая его как массив из 8 трёхразрядных слов, найти “исключающее или” всех 8 слов для выражения “101”.

Дан массив из 7 байт. Рассматривая его, как массив из 56 бит, посчитать в нём количество нулей, стоящих после единицы. Конец последовательности рассматривать как нуль.

Дан массив из 8 байт. Рассматривая его, как массив из 64 бит, посчитать количество пар единиц в окружении нулей. Конец последовательности рассматривать как нуль.

Дан массив из 5 байт. Рассматривая его, как массив из восьми пятибитных слов, посчитать количество слов с чётным числом единиц в слове.

Дан массив из 6 байт. Рассматривая его, как массив из 48 бит, посчитать число двух единиц, стоящих между нулями. Конец и начало последовательности рассматривать как нули.

Дан массив из 3 байт. Рассматривая его, как массив из 24 бит, посчитать количество одиночных единиц в окружении нулей. Конец последовательности рассматривать как нуль.

Дан массив из 6 байт. Посчитать количество байт, число единиц в которых не превышает 3.

Дан массив из 11 байт. Посчитать количество байт, в которых нет единиц, стоящих рядом.

Вопросы по теме

В чем отличие команд test и and?

Как сбросить 5-й бит переменной байта ВВ?

Как установить 5-й бит переменной байта ВВ?

Как инвертировать 5-й бит переменной байта ВВ?

Как проверить установлен ли 5-й бит переменной байта ВВ?

Как проверить четным или нечетным является количество уста­нов­лен­ных бит в байте?

Какие флаги условий модифицируются после выполнения команд and, or, xor ?

В чем основное отличие команд логических и арифметических сдвигов?

Укажите максимальное число двоичных разрядов, на которые можно сдвинуть операнд с помощью одной команды сдвига?


Наши рекомендации