13. Команды побитовых операций. Логические команды
Natasha Gurova edited this page Jun 24, 2022
·
14 revisions
Pages 31
Clone this wiki locally
Побитовая арифметика
AND <приемник>, <источник> ; побитовое И (AND al, 00001111b)
OR <приемник>, <источник> ; побитовое ИЛИ
XOR <приемник>, <источник> ; побитовое исключающее ИЛИ (XOR AX, AX)
NOT <приемник> ; инверсия
TEST <приемник> <источник> ; Аналог AND, но результат не сохраняется.
; Выставляются SF, ZF, PF.
Побитовые сдвиги
SAR <приёмник>, <счётчик> ; арифметический сдвиг вправо (с сохранением знакового бита)
SHR <приёмник>, <счётчик> ; логический сдвиг вправо (старший бит зануляем)
SHL <приёмник>, <счётчик> ; сдвиг влево (SAL - эквивалентная команда)
ROR <приёмник>, <счётчик> ; циклический сдвиг вправо
ROL <приёмник>, <счётчик> ; циклический сдвиг влево
RCR <приёмник>, <счётчик> ; циклический сдвиг вправо, через флаг переноса
RCL <приёмник>, <счётчик> ; циклический сдвиг влево, через флаг переноса
О циклическом сдвиге с флагом - задействуется не 16 бит, а 17, младший бит попадет в CF, а CF попадет в старший бит при сдвиге вправо
Все команды изменяют регистр флагов FLAGS
ДОП
Нужно понимать, что на лекциях Кузнецов также давал следующие команды для работы с битами/байтами
BT, BTR, BTS, BTC, BSF, BSR, SETcc
? Что такое байт?
Минимальная адресуемая единица памяти
? Что такое битовая строка?
Последовательность битов, которая интерпретируется как независимые биты,
а не как какие-то данные.
Пример – регистр флагов.
Работать с битами напрямую нельзя, поэтому у нас есть чудо команды.
BT <база>, <смещение> ; считать в CF значение бита из битовой строки
BTS <база>, <смещение> ; установить бит в 1
BTR <база>, <смещение> ; сбросить бит в 0
BTC <база>, <смещение> ; инвертировать бит
BSF <приемник>, <источник> ; прямой поиск бита (от младшего разряда)
BSR <приемник>, <источник> ; обратный поиск бита (от старшего разряда)
SETcc <приемник> ; выставляет приемник (1 байт) в 1 или 0
; в зависимости от условия, аналогично Jcc.
Пример, в котором я не очень уверена
mov AX, OOFFh ; Анализируемое данное (помним, что AX - 2 байта)
; |
bts AX, 8 ; AX = 0000 0000 1111 1111 (бит 8 был = 0 -> установка бита, ZF = 0)
; AX = 0000 0001 1111 1111