Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основной текст лекций.doc
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆
    1. Применение логических инструкций

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

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

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

and dst, src ; операция логическое И

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

or dst, src ; операция логическое ИЛИ

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

xor dst, src ;операция логическое исключающее ИЛИ

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

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

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

or al, 00001001b

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

and al, 10101111b

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

xor al, 00010100b

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

test al, 00010000b

jnz LAB

продолжаем

. . .

LAB:

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

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

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

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

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

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

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

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

Дан массив из 10 байт. Все байты имеют нулевые старшие биты. Необходимо каждый байт, содержащий единицу в нулевом бите дополнить до четного числа единиц установкой седьмого бита.

Текст программы:

.data

NB db 04h, 07h, 14h, 23h, 04h,38h, 3Fh, 2Ah0Dh, 34h

.code

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 ; четное число единиц?

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

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

jmp short OK ; бит 0 сброшен

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

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

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

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

loop BEG

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

int 21h ; Выход в DOS

end START