5.5. Команды сложения
Назначение команд этой группы вытекает из названия - прибавить число или содержимое регистра (пары) или содержимое индексированного адреса к содержимому регистра (пары). Это первая из групп арифметических команд, с которыми мы еще столкнемся. Сразу отметим, что команды этой группы работают в абсолютной двоичной арифметике.
5.5.1. Простое сложение.
Все команды этой подгруппы влияют на флаг переноса (С-флаг). В зависимости от того, превосходит ли результат сложения FF (255) для однобайтного сложения или FFFF (65535) для двухбайтного сложения содержимого двух регистровых пар, С-флаг либо включается, либо выключается.
Например: 2D + C0 = ED (45+192=237) -> C=0;
5D + C0 = 1D (93+192=29) -> C=1.
Однобайтное сложение.
|
Мнемоника |
Код |
Мнемоника |
Код |
|
ADD A,n |
C6 n |
ADD A,A |
87 |
|
ADD A,H |
84 |
ADD A,L |
85 |
|
ADD A,B |
80 |
ADD A,C |
81 |
|
ADD A,D |
82 |
ADD A,E |
83 |
|
ADD A,(HL) |
86 |
ADD A,(IX+s) |
DD 86 s |
|
ADD A,(IY+s) |
FD 86 s |
|
|
Двухбайтное сложение.
|
Мнемоника |
Код |
Мнемоника |
Код |
|
ADD HL,HL |
29 |
ADD HL,BC |
09 |
|
ADD HL,DE |
19 |
ADD HL,SP |
39 |
|
ADD IX,IX |
DD 29 |
ADD IY,IY |
FD 29 |
|
ADD IX,BC |
DD 09 |
ADD IY,BC |
FD 09 |
|
ADD IX,DE |
DD 19 |
ADD IY,DE |
FD 19 |
|
ADD IX,SP |
DD 39 |
ADD IY,DE |
FD 39 |
5.5.2. Приращение.
Приращение (инкремент) - это увеличение содержимого регистра или ячейки памяти на единицу. В принципе это частный случай сложения, но он настолько широко применяется, что для этих целей была создана особая группа команд. Они нужны в первую очередь для организации разного рода счетчиков, когда при всяком проходе этой операции счетчик получает приращение на единицу.
Поскольку назначение команд «инкремент» состоит не в выполнении операций сложения, а в организации счетчиков, они не влияют на флаг переноса.
|
Мнемоника |
Код |
Мнемоника |
Код |
|
INC A |
3C |
INC H |
24 |
|
INC L |
2C |
INC B |
04 |
|
INC C |
0C |
INC D |
14 |
|
INC E |
1C |
INC (HL) |
34 |
|
INC (IX+s) |
DD 34 s |
INC (IY+s) |
FD 34 s |
|
INC HL |
23 |
INC BC |
03 |
|
INC DE |
13 |
INC SP |
33 |
|
INC IX |
DD 23 |
INC IY |
FD 23 |
Обратите внимание на разницу команд INC HL и INC (HL).
INC HL - прямая команда для регистра HL, она гласит «увеличить на единицу содержимое регистровой пары HL».
INC (HL) - пример применения косвенной адресации; эта команда означает «увеличить на единицу содержимое ячейки памяти, адрес которой находится в регистре HL».
5.5.3. Сложение с учетом переноса.
Команды этой подгруппы имеют мнемонику ADC. Она отличается тем, что к результату сложения двух чисел еще прибавляется единица, если флаг переноса перед началом операции был установлен.
После окончания операции флаг переноса устанавливается в соответствии с результатом (есть перенос - включен, нет - выключен).
Применяются они при сложении многобайтных чисел. Так, например, при сложении двухбайтных чисел 035D и A0C0:
|
03 5D |
|
+ A0 C0 |
|
----- |
|
A4 1D |
возникает ситуация, когда сумма младших байтов дает число, большее 255 (FF). В этот момент и устанавливается флаг переноса. При сложении же старших байтов эта единица будет к ним прибавлена, если сложение производится командой ADC.
|
Мнемоника |
Код |
Мнемоника |
Код |
|
ADC A,n |
CE n |
ADC A,A |
8F |
|
ADC A,H |
8C |
ADC A,L |
8D |
|
ADC A,B |
88 |
ADC A,C |
89 |
|
ADC A,D |
8A |
ADC A,E |
8B |
|
ADC A,(HL) |
8E |
|
|
|
ADC A,(IX+s) |
DD 8E s |
ADC A,(IY+s) |
FD 8E s |
|
ADC HL,HL |
ED 6A |
ADC HL,BC |
ED 4A |
|
ADC HL,DE |
ED 5A |
ADD HL,SP |
ED 7A |
5.6. Команды вычитания
Команды этой группы прямо противоположны командам предыдущей группы. Они также работают в абсолютной двоичной арифметике. Их тоже можно разбить на три подгруппы.
5.6.1. Простое вычитание.
Команды этой подгруппы начинаются с мнемоники SUB и влияют на флаг переноса, но здесь в отличие от команд ADD флаг переноса устанавливается не когда байт переполняется, а когда при вычитании производится заем, т.е. когда вычитаемое больше уменьшаемого.
|
Мнемоника |
Код |
Мнемоника |
Код |
|
SUB n |
D6 n |
SUB A |
97 |
|
SUB H |
94 |
SUB L |
95 |
|
SUB B |
90 |
SUB C |
91 |
|
SUB D |
92 |
SUB E |
93 |
|
SUB (HL) |
96 |
|
|
|
SUB (IX+s) |
DD 96 s |
SUB (IY+s) |
FD 96 s |
Обратите внимание на то, что действие всех этих команд относится к регистру А (аккумулятору), поэтому в мнемониках на него нет указаний, это принимается по умолчанию.
Так, SUB (HL) означает SUB A,(HL) – «вычесть из содержимого аккумулятора то число, которое находится в ячейке памяти, адрес которой находится в регистровой паре HL».
5.6.2. Уменьшение (декремент).
Декремент - уменьшение содержимого регистра или ячейки памяти на единицу. Операция прямо противоположна инкременту. Так же, как и последняя, она служит не столько для вычитания, сколько для организации каких-либо счетчиков, а потому она тоже не влияет на флаг переноса.
|
Мнемоника |
Код |
Мнемоника |
Код |
|
DEC A |
3D |
DEC H |
25 |
|
DEC L |
2D |
DEC B |
05 |
|
DEC C |
0D |
DEC D |
15 |
|
DEC E |
1D |
DEC (HL) |
35 |
|
DEC (IX+s) |
DD 35 s |
DEC (IY+s) |
FD 35 s |
|
DEC HL |
2B |
DEC BC |
0B |
|
DEC DE |
1B |
DEC SP |
3B |
|
DEC IX |
DD 2B |
DEC IY |
FD 2B |
5.6.3. Вычитание с учетом «займа».
Команды этой подгруппы начинаются с мнемоник SBC. По своему смыслу они противоположны командам ADC. Отличие от команд SUB состоит в том, что если флаг переноса включен, то значит, при вычитании младшего разряда был сделан заем из старшего и поэтому при операции со старшим разрядом надо еще вычесть единицу.
Эти команды применяются при вычитании многобайтных (двухбайтных и более) чисел.
|
Мнемоника |
Код |
Мнемоника |
Код |
|
SBC A,n |
DE n |
SBC A,A |
9F |
|
SBC A,H |
9C |
SBC A,L |
9D |
|
SBC A,B |
98 |
SBC A,C |
99 |
|
SBC A,D |
9A |
SBC A,E |
9B |
|
SBC A,(HL) |
9E |
|
|
|
SBC A,(IX+s) |
DD 9E s |
SBC (IY+s) |
FD 9E s |
|
SBC HL,HL |
ED 62 |
SBC HL,BC |
ED 42 |
|
SBC HL,DE |
ED 52 |
SBC HL,SP |
ED 72 |
5.7. Команды сравнения
Мнемоники команд этой группы начинаются с CP от слова compare (сравнивать).
Применяются эти команды чрезвычайно часто. С их помощью можно сравнивать содержимое аккумулятора с числом, с содержимым регистра или с байтом оперативной памяти и по результатам сравнения предпринимать те или иные действия. Поскольку эти команды однозначно относятся к регистру А, то в мнемониках он не указывается, это подразумевается по умолчанию.
В результате операции сравнения значение регистра А не изменяется. Результат операции сказывается только на флагах регистра F.
Если содержимое аккумулятора больше или равно сравниваемому числу, то флаг переноса С выключен (равен 0). Если же оно меньше - включен (равен 1).
|
Мнемоника |
Код |
Мнемоника |
Код |
|
CP A,n |
FE n |
CP A |
BF |
|
CP H |
BC |
CP L |
BD |
|
CP B |
B8 |
CP C |
B9 |
|
CP D |
BA |
CP E |
BB |
|
CP (HL) |
BE |
|
|
|
CP (IX+s) |
DD BE s |
CP (IY+s) |
FD BE s |
5.8. Команды логики
Система команд процессора Z-80 позволяет выполнять три вида логических операций - логическое «И» (AND), логическое «ИЛИ» (OR) и «ИСКЛЮЧАЮЩЕЕ ИЛИ» (XOR). В соответствии с ними мы можем выделить три подгруппы в этой группе команд.
Эти операции похожи на команды сравнения. В них также участвуют два операнда, один из которых находится в аккумуляторе.
5.8.1. Команды «И» (AND).
Данная команда двоичной логики дает результат, равный одному из операндов, если оба операнда равны, а если нет, то нули. Таким образом, результат может быть равен единице, только если оба операнда равны единице.
Пример: Первый операнд 1010 1010 (AA)
Второй операнд 1100 0000 (CO)
---------------------------------
Результат AND 1000 0000 (B0)
Как видите, операция производится побитно, т.е. нулевой бит первого числа сравнивается с нулевым битом второго, первый с первым, второй со вторым и т.д.
В этой подгруппе существуют 11 операций:
|
Мнемоника |
Код |
Мнемоника |
Код |
|
AND n |
E6 n |
AND A |
A7 |
|
AND H |
A4 |
AND L |
A5 |
|
AND B |
A0 |
AND C |
A1 |
|
AND D |
A2 |
AND E |
A3 |
|
AND (HL) |
A6 |
|
|
|
AND (IX+s) |
DD A6 s |
AND (IY+s) |
FD A6 s |
С помощью команды AND можно довольно эффектно сбрасывать биты аккумулятора. Например, если Вам нужно его обнулить, дайте команду:
AND 0 (E6 0)
В программах очень часто бывает нужно проверить состояние некоторых битов, при этом остальные желательно обнулить. Например, если в игровой программе управление ведется от Кемпстон-джойстика, то сигнал от кнопки «огонь» подается по 4-му биту порта 31.

Можно было бы проверить, не включена ли эта кнопка командой CP 10 (десятичное 16), но из этого ничего не получится, т.к. часто кнопка «огонь» включается одновременно с движением объекта. Например, если объект движется вправо - вверх и при этом «стреляет», то включены биты 1,2 и 4 и код равен 2 + 4 + 10 =16. Такая «проверка» показала бы, что кнопка якобы не включена. Поэтому перед проверкой все остальные биты надо погасить. Это легко сделает команда AND 10, а потом можно давать и CP 10. Процесс гашения ненужных битов называется маскированием.
5.8.2. Команда «ИЛИ» (OR).
Эта команда также исполняется побитным сравнением двух двоичных чисел. Ее результат равен единице, если данный бит включен в первом или во втором операнде или в обоих вместе. Таким образом, в результате может быть 0 только если в обоих операндах 0, а в противном случае - 1.
Пример: Первый операнд 1010 1010 (AA)
Второй операнд 1100 0000 (C0)
---------------------------------------
Результат OR 1110 1010 (EA)
Эта команда позволяет Вам столь же эффективно включать нужные биты в аккумуляторе (или проверять их включение), как команда AND позволяла их выключать. Например, если Вам надо, чтобы в аккумуляторе были гарантированно включены биты 5, 3, 2 - дайте команду OR 2С (20 + 8 + 4 = 2C).
|
Мнемоника |
Код |
Мнемоника |
Код |
|
OR n |
F6 n |
OR A |
B7 |
|
OR H |
B4 |
OR L |
B5 |
|
OR B |
B0 |
OR C |
B1 |
|
OR D |
B2 |
OR E |
B3 |
|
OR (HL) |
B6 |
|
|
|
OR (IX+s) |
DD B6 s |
OR (IY+s) |
FD B6 s |
Интересна команда OR A. В результате ее действия производится сравнение по «ИЛИ» содержимого аккумулятора с ним же самим. Разумеется, в результате в аккумуляторе ничего не изменится, но зато гарантированно будет сброшен флаг переноса (флаг С регистра F). Такой же результат дает и применение команды AND A. Обе эти команды очень часто используются в программах именно для этой цели.
5.8.3. Команды «ИСКЛЮЧАЮЩЕЕ ИЛИ» (XOR).
В отличие от «ИЛИ» здесь результат равен 1, если хотя бы один из операндов равен 1, но не оба вместе. В остальных случаях он равен нулю.
Пример: Первый операнд 1010 1010 (AA)
Второй операнд 1100 0000 (C0)
---------------------------------
Результат XOR 0110 1010 (6A)
Команда XOR A часто используется для обнуления аккумулятора. Это же можно сделать и командой LD A,0, но XOR короче (один байт вместо двух), а кроме того при команде XOR, как и при всех командах логики AND, OR, XOR сбрасывается флаг переноса, а команды группы загрузки LD на флаги влияния не оказывают.
|
Мнемоника |
Код |
Мнемоника |
Код |
|
XOR n |
EE n |
XOR A |
AF |
|
XOR H |
AC |
XOR L |
AD |
|
XOR B |
AB |
XOR C |
A9 |
|
XOR D |
AA |
XOR E |
AB |
|
XOR (HL) |
AE |
|
|
|
XOR (IX+s) |
DD AE s |
XOR (IY+s) |
FD AE s |



