Слайд 3Использование логического И
Логическое умножение AND и TEST используют для сброса в 0
отдельных битов первого операнда.
Подобранный для этих целей непосредственный второй операнд называют «маска». Для сброса отдельных битов в 0 маска должна иметь нули в этих разрядах, в остальных - 1
Пример: надо сбросить в 0 биты 2,3 и 4 в регистре bl.
Маска должна быть такой: 11100011
and bl, 11100011b ; биты bl: ???????? (произвольный код)
& 11100011 (маска)
-------------------
рез-т в bl: ???000??
Слайд 4Использование логического ИЛИ
Логическое сложение OR используют для установки в 1
отдельных
битов первого операнда. Второй непосредственный операнд является «маской».
Для установки отдельных битов в 1 маска должна иметь единицы в этих разрядах, в остальных – 0.
Пример: Установить в единицы биты 7-5 и 1-0 в регистре bl
or bl, 11100011b ; bl: ???????? (произвольный код)
˅ 11100011 (маска)
-------------------
bl: 111???11
Слайд 5Использование исключающего ИЛИ
Исключающее ИЛИ (сложение по модулю 2) XOR используют для
инвертирования отдельных битов первого операнда. Второй непосредственный операнд - «маска».
Для инвертирования отдельных битов маска должна иметь единицы в этих разрядах, в остальных – 0.
Пример: Инвертировать биты 7-5 и 1-0 в регистре bl
хor bl, 11100011b ; bl: aaaaaaaa (произвольный код)
⊕ 11100011 (маска)
-------------------
bl: āāāaaaāā
Слайд 6Команды сдвигов
Выполняют сдвиг кодов, находящихся в регистре или памяти, на указанное количество
бит
Количество бит задается 2-м операндом. Его можно указать двумя способами:
- однобайтным непосредственным числом (i8)
- предварительно занести в регистр CL.
Общий синтаксис команд сдвига:
Команда сдвига r/m, i8 ; сдвиг на i8 бит
Команда сдвига r/m, cl ; сдвиг на количество бит,
записанных в cl
Слайд 7Циклические сдвиги
ROL - циклический влево
Выдвинутый бит заползает с стороны младших разрядов
и дублируется в СF
Пример: циклический сдвиг однобайтного кода влево на 3 бита
bl= 01110000 → rol bl, 3 → bl= 100000011
ROR –циклический вправо
Слайд 8Циклические сдвиги через флаг CF
Флаг CF становится дополнительным битом в контуре сдвига
RCR
- циклический вправо через СF
RCL - циклический влево через СF
Пример: пусть, bl= 11110001 и флаг cf=0
rcr bl,1 ; в результате: bl= 01111000 и cf=1
Слайд 9Простые сдвиги
В освобождающийся разряд заносится 0, а выдвигаемый бит попадает
во флаг СF.
SHL – сдвиг влево
SHR – сдвиг вправо
Пример. Простой сдвиг однобайтного кода вправо на 3 бита
bl =11110001 → shr bl, 3 → bl = 00011110 и бит cf = 0
Слайд 10Выполнение умножения/деления простыми сдвигами
Простые сдвиги ВСЕГДА используют для умножения/ деления на величины,
кратные степени двойки (2,4,8,16,32,64,128, …)
Сдвиг влево на 1 бит - умножение на 2
на 2 бита - . . . .. на 4
на 3 бита = . . на 8
на к бит = . . . . на 2к
Сдвиг вправо на 1 бит - деление на 2
. . . . .
на к бит - деление на 2к
Пример: Сдвиг влево на 3 = умножению на 8
bl= 0000011 (310) → shl bl, 3 → bl=00011000 (2410)
Слайд 11Арифметические сдвиги
Используются для сдвига знаковых чисел.
SAL – арифметический сдвиг влево
(аналогичен простому сдвигу SHL)
SAR – арифметический сдвиг вправо. Освобождающиеся разряды заполняются значением знакового (старшего) разряда
Пример: деление на 4 знакового кода арифм.сдвигом вправо на 2
bl= 11111000 → sar bl, 2 → bl = 11111110
(-810) (-210)
Слайд 12Команды битовых операций
Поиск бита
BSF reg, reg/mem ; Поиск самого младшего единичного бита
в reg
или mem. В первом reg возвращается номер бита.
Пример: пусть, bl= 00101000
Результат выполнения команды bsf al, bl → al= 03h
BSR reg, reg/mem ; Поиск самого старшего единичного бита
в reg/ mem. В первом reg возвращается номер бита
Пример: пусть, bl= 00101000
Результат выполнения команды bsr al, bl → al= 05h
Слайд 13
Копирование бита в CF
ВТ reg/mem,i8 ; из reg или mem во
флаг CF копируется бит
с номером i8
Пример:
bl=11001011
Результат выполнения команды bt bl, 3 → CF =1