Назначение команд этой группы вытекает из названия - прибавить
число или содержимое регистра (пары) или содержимое индексированного адреса к
содержимому регистра (пары). Это первая из групп арифметических команд, с
которыми мы еще столкнемся. Сразу отметим, что команды этой группы работают в
абсолютной двоичной арифметике.
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.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
|
Мнемоники команд этой группы начинаются с 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
|
Система команд процессора 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
|