2.2. ЛОГИЧЕСКИЕ КОНСТРУКЦИИ
74. Сброс заданных битов в аккумуляторе - AND N.
Число N является маской. Оно содержит нули в тех битах, которые должны быть выключены в аккумуляторе и единицы в тех позициях, которые должны остаться без изменений. Например, AND 1101 1011B - выключает 2-ой и 5-ый биты.
Поскольку команда RES выключает биты только по одному, то для получения такого же результата пришлось бы давать последовательность:
RES 2,A RES 5,A
75. Проверка битов в аккумуляторе.
Задача состоит в том, чтобы выставить флаги так, как будто бы была выполнена команда AND для аккумулятора и для регистра или адреса, но содержимое аккумулятора при этом оставить без изменений.
LD reg,A - запомнили аккумулятор
LD HL,ADDR - указание на адрес
AND (HL) - логическое "И"
LD A, reg - восстановили аккумулятор
Команда LD на флаги не влияет.
76. Операция AND для флагового регистра и числа. Маскирование флагов .
переброска флаг. регистра через стек ввод маски маскирование
сохранение результата в rpl обратная переброска в регистр F через стек
PUSH AF POP rp LD A, N AND rpl LD rpl, A PUSH rp POP AF
!. Логические конструкции "ИЛИ".
77. Включение заданных битов в аккумуляторе.
OR N
Число N является маской. Оно содержит единицы в тех битах, которые должны быть включены в аккумуляторе и нули в тех позициях, которые должны остаться без изменений. Например: OR 0010 0100B - включает 2-ой и 5-й биты.
Поскольку команда SET включает биты только по одному, то для получения такого же результата пришлось бы давать последовательность :
SET 2, A SET 5,A
78. Проверка 16-разрядного регистра на 0.
LD A,rph OR rpl
В результате операции будет 0 (включится флаг Z) в том и только в том случае, если и старший и младший байт проверяемого регистра равны нулю.
79. Операция OR для флагового регистра и числа. Маскирование флагов.
OR F, N
PUSH AF |
переброска флаг. регистра |
POP rp |
через стек |
LD A, N |
ввод маски |
OR rpl |
маскирование |
LD rpl, A |
сохранение результата в rpl |
PUSH rp |
обратная переброска в |
POP AF |
регистр F через стек |
2.2.3. Логические конструкции "ИСКЛЮЧАЮЩЕЕ ИЛИ".
80. Переключение заданных битов в аккумуляторе.
XOR N
Число N является маской. Оно содержит единицы в тех битах, которые должны быть переключены в аккумуляторе и нули в тех битах, которые должны остаться без изменений. Например, XOR 0010 0100В - переключает 2-й и 5-й биты.
81. Инвертировать аккумулятор с установкой флагов.
XOR FF
Эта команда отличается от CPL тем, что в отличие от нее влияет на флаги.
82. Побитное сравнение. Сравнить аккумулятор с регистром и включить биты в тех позициях, которые отличаются.
XOR reg
2.2.4. Логические конструкции "HE".
84. Инвертировать содержимое заданного адреса.
CPL (ADDR) LD HL, ADDR
LD A,(HL) CPL
LD (HL),A
85. Инвертировать младший бит содержимого регистра.
INC reg
ИЛИ
DEC reg
Правда, здесь надо иметь в виду, что эти команды могут изменить прочие биты в регистре.
86. Инвертировать младший бит заданного адреса.
LD HL,ADDR INC (HL)
ИЛИ
LD HL,ADDR DEC (HL)
87. Инвертировать младший полубайт в аккумуляторе.
XOR 0F
88. То же, но старший.
XOR F0
89. Инвертировать содержимое регистровой пары.
CPL rp LD HL, FFFF
AND A SBC HL, rp
Повторно напоминаем, что поскольку для 16-разрядных регистров нет команды SUB, приходится использовать команду SBC, а она влечет за собой еще и вычитание содержимого флага переноса (флага С) , поэтому этот флаг надо предварительно занулить (очистить), что делается командой AND A.
2.2.5. Конструкции сдвига.
90. Логический сдвиг аккумулятора влево.
ADD A,A
91. Логический сдвиг влево содержимого HL. SLL HL ADD HL, HL
92. Логический сдвиг влево индексного регистра. SLL xy ADD xy, xy
93. Логический сдвиг вправо содержимого регистровой пары. SRL rp SRL rph
RR rpl
Ключевым здесь является то, что младший байт здесь должен не сдвигаться, а ротировать, чтобы "подхватить" содержимое флага переноса, образовавшееся в результате сдвига старшего байта.
94. Арифметический сдвиг вправо содержимого регистровой
пары.
SRA rp SRA rph
RR rpl
95. Логический сдвиг влево 16-разрядного числа, находящегося по заданному адресу.
SLL (ADDR) LD HL, ADDR
SLA (HL) INC HL
ИЛИ
LD xy,ADDR SLA (xy+0) RL (xy+1)
При сдвиге влево сначала сдвигается младший байт, а затем ротируется старший.
96. Логический сдвиг вправо 16-разрядного числа, находящегося по заданному адресу.
SRL (ADDR) LD HL, ADDR+1
SRL (HL) DEC HL RR (HL)
ИЛИ
LD xy,ADDR SRL (xy+1) RR (xy+0)
97. Обмен полубайтов в аккумуляторе.
RLCA RRCA
RLCA ИЛИ RRCA
RLCA RRCA
RLCA RRCA
98. Нормализация аккумулятора Аккумулятор сдвигается вле во до тех пор, пока его старший байт не будет равен 1. Не сдвигать, если в аккумуляторе содержится 0.
AND A - проверка аккумулятора на 0
JP M,END - выход, если старший бит = 1
JR Z, END - выход, если акк-р равен нулю
SHIFT: ADD A,A - сдвиг влево
JP P,SHI FT - повторить сдвиг, если стар
ший бит равен нулю
END: NOP
99. Нормализация содержимого регистровой пары HL.
LD A, H - проверка содержимого
OR L регистровой пары на ноль
JR Z,END - выход, если 0
SHIFT: ADD HL,HL - сдвиг влево
JR NC,SHIFT - сдвигать, пока не произойдет перенос
RR H - затем вернуть вправо на одну
RR L позицию
NOP
Примечание: ADD HL,HL влияет на флаг переноса, но не влия ет на флаг знака и флаг нуля.
|
|
|
2 .2.6. Конструкции ротации. |
|
100. |
Ротация |
регистровой |
пары вправо. |
|
Проблема состоит в том, |
чтобы младший бит младшего байта |
был |
перенесен в ст ' арший бит старшего байта. |
RR |
rp |
|
RRC rpl |
- младший бит копируется в С |
|
|
|
RL rpl |
- байт восстанавливается, но |
|
|
|
|
флаг С остался |
|
|
|
RR rph |
- ротация старшего байта |
|
|
|
RR rpl |
- ротация младшего байта |
|
101. |
Ротация |
регистровой |
пары влево. |
RL |
rp |
|
RLC rph |
|
|
|
|
RR rph |
|
|
|
|
RL rpl |
|
|
|
|
RL rph |
|
|
102 . |
Ротация |
регистровой |
пары вправо через флаг переноса |
RRC |
rp |
|
RR rph |
|
|
|
|
RR rpl |
|
|
103 . |
Ротация |
регистровой |
пары влево через флаг переноса, |
RLC |
rp |
|
RL rph |
|
|
|
|
RL rpl |
|
|
104. |
Ротация |
вправо 16- |
разрядного числа, находящегося |
указанному |
адресу |
, через флаг |
переноса. |
RRC |
(ADDR) |
|
LD HL,ADDR+1 |
|
|
|
RR (HL) |
|
|
|
|
DEC HL |
|
|
|
|
RR (HL) |
|
ИЛИ
LD xy,ADDR RR (xy+1) RR (xy+0)
+
влево 16-разрядного через флаг переноса LD HL,ADDR RL (HL) INC HL RL (HL)
LD xy,ADDR RL (xy+0) RL (xy+1)
105. Ротация указанному адресу, RLC (ADDR)
ИЛИ
2.2.7. Конструкции для проверки регистров и адресов.
106. Проверка аккумулятора. Выставляются флаги в соответствии с содержимым, которое при этом не изменяется.
AND A или OR A
Оба варианта сбрасывают флаг переноса.
107. Проверка состояния регистра с выставлением флагов.
INC reg DEC reg
108. Проверка состояния заданного адреса.
LD HL,ADDR INC (HL) DEC (HL)
109. Проверка содержимого регистра.
LD A,rph OR rpl
110. Проверка содержимого индексного регистра.
PUSH xy POP rp LD A,rph OR rpl
111. Проверка 16-битного числа, находящегося по заданному
адресу.
LD HL,(ADDR) LD A, H OR L