Пример выполнения работы
Примеры использования логических команд
Логические инструкции
Применение логических инструкций
Логические команды служат для сброса или установки отдельных бит в байте или слове. Они включают булевы операторы НЕ, И, ИЛИ, исключающее ИЛИ и операцию тестирования, которая устанавливает флаги, но не изменяет значения своих операндов.
not dst
Инструкция not инвертирует все биты байта или слова.
and dst, src
Инструкция and выполняет операции логическое И двух операндов (байтов или слов) и возвращает результат в операнд-приемник. Бит результата устанавливается в 1, если установлены в 1 оба соответствующих ему бита операндов, и устанавливаются в 0 противном случае.
or dst, src
Инструкция or выполняет операции логическое ИЛИ двух операторов (байтов или слов) и помещает результат на место операнда-приемника. Бит результата устанавливается в 1, если равен 1 хотя бы один из двух соответствующих ему битов операндов и устанавливается в 0 в противном случае.
xor dst, src
Инструкция xor выполняет операцию логическое исключающее ИЛИ двух операндов и помещает результат на место операнда-приемника. Бит результата устанавливается в 1, если соответствующие ему биты операндов имеют противоположные значения, и устанавливается в 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
· 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 ; четное число единиц?
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
· end START
Варианты заданий
1. Дан массив из 10 байт. Посчитать количество байт, в которых сброшены 6 и 4 биты.
2. Дан массив из 8 байт. Рассматривая его, как массив из 64 бит, посчитать количество единиц.
3. Дан массив из 8 байт. Рассматривая его как массив логических значений х0 х1 х2 х3 х4 х5 х6 х7 (true-есть ненулевые биты в байте, false-все биты нулевые), вычислить логическую формулу
4. f=(x7 & x6 & x1) V (x6 & x4 & x2 & x1 & x0) V (x7 & x6 & x3 & x1).
5. Дан массив из 10 байт. Посчитать количество байт с числом единиц в байте равным три.
6. Рассматривая байт как набор логических значений x7 x6 x5 x4 x3 x1 x0 (true -1, false - 0), вычислить логическую формулу
7. f=(x7 & x6 & x3 ) V (x6 & x4 & x2 & x1) V (x7 & x6 & x2 & x0)
8. Дан массив из 8 байт. Рассматривая его, как массив из 64 бит посчитать длину самой длинной последовательности единиц.
9. Дан массив из 10 байт. Посчитать количество единиц во всех разрядах, кратных трём: 3, 6, 9, …, 75, 78.
10. Дан массив из 5 байт. Рассматривая его как массив из 8 пятиразрядных слов, найти “исключающее или” всех 8 слов для выражения “10101”.
11. Дан массив из 6 байт. Рассматривая его, как массив из 48 бит, посчитать в нём количество нулей.
12. Дан массив из 8 байт. Рассматривая его, как массив из 64 бит, посчитать количество пар единиц в окружении нулей. Конец последовательности рассматривать как нуль.
13. Дан массив из 7 байт. Рассматривая его, как массив из восьми семибитных слов, посчитать количество слов с нечетным числом нулей в слове.
14. Дан массив из 9 байт. Рассматривая его как массив из 72 бит, посчитать число переходов между нулями и единицами.
15. Дан массив из 3 байт. Рассматривая его, как массив из 24 бит, посчитать количество одиночных единиц в окружении нулей. Конец последовательности рассматривать как нуль.
16. Дан массив из 6 байт. Посчитать количество байт число единиц, в которых не превышает 3.
17. Дан массив из 11 байт. Посчитать количество байт, в которых нет единиц, стоящих рядом.
18. Дан массив из 4 байт. Рассматривая его, как массив из 32 бит посчитать длину самой длинной последовательности нулей.
19. Дан массив из 6 байт. Посчитать количество единиц во всех разрядах, кратных пяти: 5, 10, …, 45.
20. Дан массив из 3 байт. Рассматривая его как массив из 8 трёхразрядных слов, найти “исключающее или” всех 8 слов для выражения “101”.
21. Дан массив из 7 байт. Рассматривая его, как массив из 56 бит, посчитать в нём количество нулей, стоящих после единицы. Конец последовательности рассматривать как нуль.
22. Дан массив из 8 байт. Рассматривая его, как массив из 64 бит, посчитать количество пар единиц в окружении нулей. Конец последовательности рассматривать как нуль.
23. Дан массив из 5 байт. Рассматривая его, как массив из восьми пятибитных слов, посчитать количество слов с чётным числом единиц в слове.
24. Дан массив из 6 байт. Рассматривая его, как массив из 48 бит, посчитать число двух единиц, стоящих между нулями. Конец и начало последовательности рассматривать как нули.
25. Дан массив из 3 байт. Рассматривая его, как массив из 24 бит, посчитать количество одиночных единиц в окружении нулей. Конец последовательности рассматривать как нуль.
26. Дан массив из 6 байт. Посчитать количество байт, число единиц в которых не превышает 3.
27. Дан массив из 11 байт. Посчитать количество байт, в которых нет единиц, стоящих рядом.