УСТАНОВКА И СБРОС БИТОВ
До сих пор все команды, с которыми мы работали,
включали обработку 8-битовых или 16-битовых чисел. Группа
"установка и сброс битов" позволяет нам обрабатывать
отдельные пальцы на руке ЦП (отдельные биты регистров) и/или
содержимое ячеек памяти. Из-за очень трудоемкого характера
работы с отдельными битами это не очень широко используемая
группа команд. Более того, как правило, установка отдельного
бита в регистре или ячейке памяти занимает даже больше, чем
изменение или чтение всех 8 битов этой ячейки памяти или
регистра. Тем не менее, есть ситуации, когда вам необходимо
знать установлен или сброшен бит в середине байта, или даже
установить бит. Обратите внимание, что установка и сброс
битов может выполняться с помощью логических операторов.
Группа команд "установки и сброса битов" позволяет
"включить" или "выключить" по желанию произвольный бит, или
даже просто посмотреть на заданный бит, чтобы проверить, в
каком он состоянии.
Давайте посмотрим на первый набор команд:
SET N,R
SET N,(HL)
SET N,(IX + Д)
SET N,(IY + Д)
Команда SET включает бит с номером N (в обозначениях 0-7) в
регистре R или заданной ячейке памяти. Никакие флаги не
изменяются.
Группа команд RESET действует на ту же в точности
группу регистров или ячеек памяти, но вместо включения битов
она их выключает.
Команду BIT на самом деле нужно читать BIT?,
поскольку функция этой команды состоит в проверке содержимого
указанного бита.Никаких изменений в регистры или память не
вносится, но флаг нуля изменяется в соответствии с состоянием
проверяемого бита.
Если БИТ = 0, то флаг нуля устанавливается (=1).
Если БИТ = 1, то флаг нуля сбрасывается (=0).
Это на первый взгляд может показаться запутанным, но
нужно посмотреть на это следующим образом: если бит равен
нулю, то устанавливается флаг нуля; если бит установлен, то
флаг нуля подниматься не будет.
СДВИГИ И ЦИКЛИЧЕСКИЕ СДВИГИ
Вы можете сдвигать регистры влево, вправо, как
захотите. Сложность состоит в том, чтобы различать различные
сдвиги и циклические сдвиги с тем, чтобы знать, какие и когда
нужно использовать, и помнить, что бит переноса часто можно
рассматривать в качестве 9-го бита регистров (т.е. бит
переноса является восьмым битом, если биты пронумерованы от 0
до 7. Некоторые команды циклического сдвига захватывают бит
переноса (в качестве девятого бита), так что циклический
сдвиг в целом составляет цикл из 9 битов.
Например, давайте рассмотрим команду RLA (смысл
каждой команды будет объяснен ниже).
Другие циклические сдвиги захватывают только
8-битовый цикл, хотя флаг переноса изменяется в соответствии
со значением бита, которому приходится "проделывать кружной
путь". Примером может служить команда RLCA.
Это означает, что при циклическом сдвиге влево, как
показано выше, содержимое бита 0 перемещается в бит 1, бита 1
- в бит 2 и т.д., а содержимое бита 7 перемещается и в бит 0
и в бит переноса. Сравните это с командой RLA, описанной
выше, где бит 7 перемещается в бит переноса, а бит переноса -
в бит 0.
ЦИКЛИЧЕСКИЕ СДВИГИ ВЛЕВО
В основном есть два типа циклических сдвигов влево:
Циклический сдвиг влево регистров (циклический сдвиг влево
круговой - "круговой" означает, что цикл охватывает только 8
битов, как в команде RLC, описанной выше) - это 9-битовый
сдвиг влево, аналогичный показанному выше для RL A.
RL A - "циклический сдвиг влево накопителя";
RL R - "циклический сдвиг влево регистра R".
RLC A - циклический сдвиг влево круговой регистра A
RLC R - циклический сдвиг влево круговой регистра R
RLC (HL) - циклический сдвиг влево круговой (HL)
RLC (IX + Д) - циклический сдвиг влево круговой (IX + Д)
RLC (IY + Д) - циклический сдвиг влево круговой (IY + Д)
Помимо этих двух команд циклического сдвига влево
есть еще команда сдвига влево, но она может обрабатывать
только регистр A.
SL A - сдвиг накопителя влево
Отличие этой команды состоит в том, что содержимое
бита переноса теряется, а нулевой бит заполняется нулем.
По-существу, это сводится к умножению A на 2, поскольку
ничего в накопитель не переносится. Обдумайте работу команды
SL A в случае A =80H.
ЦИКЛИЧЕСКИЕ СДВИГИ ВПРАВО
Вновь у нас два основных режима циклического сдвига,
но на этот раз вправо. Вращение вправо охватывает тот же
диапазон допустимых ячеек памяти и вращений, что и вращения
влево.
RR A - циклический сдвиг накопителя вправо
RR R - циклический сдыиг регистра вправо
RRC A - циклический сдвиг вправо круговой регистра A
RRC R - циклический сдвиг вправо круговой регистра R
RRC (HL) - циклический сдвиг вправо круговой (HL)
RRC (IX + Д) - циклический сдвиг вправо круговой (IX + Д)
RRC (IY + Д) - циклический сдвиг вправо круговой (IY + Д)
Имеется сдвиг вправо, аналогичный сдвигу влево.
SRL R - логический сдвиг вправо регистра R
В данном случае, это чистое деление на 2, если мы
используем числа без знака (т.е. диапазон чисел, которые мы
хотим представлять, составляет 0 - 255).
Поскольку в некоторых прикладных задачах мы
применяем соглашение о том, что для задания отрицательных
чисел бит 7 устанавливается равным 1 (что дает нам диапазон
от -128 до +127), имеется дополнительная команда сдвига
вправо.
SRA R - арифметический сдвиг вправо регистра R
Как видите, это тоже деление на 2, но оно сохраняет
бит знака.