Команда
80
ADD A, B
90
SUB A, B
81
ADD A, C
91
SUB A, C
82
ADD A, D
92
SUB A, D
83
ADD A, E
93
SUB A, E
84
ADD A, H
94
SUB A, H
85
ADD A, L
95
SUB A, L
86
ADD A,[HL]
96
SUB A,[HL]
87
ADD A, A
97
SUB A, A
88
ADC A, B
98
SBB A, B
89
ADC A, C
99
SBB A, C
8A
ADC A, D
9A
SBB A, D
8B
ADC A, E
9B
SBB A, E
8C
ADC A, H
9C
SBB A, H
8D
ADC A, L
9D
SBB A, L
8E
ADC A,[HL]
9E
SBB A,[HL]
8F
ADC A, A
9F
SBB A, A
Предположим, что в аккумуляторе А содержится байт 35h, а в регистре B — байт 22h. После выполнения команды SUB A, B в аккумуляторе будет содержаться байт 13h.
Если в A содержится байт 35h, в регистре H — 10h, в регистре L — 7Ch, в ячейке памяти 107Ch — 4Ah, то при выполнении команды ADD A,[HL] байт в аккумуляторе (35h) прибавляется к байту в ячейке, к которой обращается пара регистров HL (4Ah), а результат (7Fh) сохраняется в аккумуляторе.
Команды ADC и SBB позволяют процессору 8080 складывать и вычитать 16-, 24-, 32-битные числа, а также числа большей разрядности. Предположим, что пары регистров BC и DE содержат 16-битные числа. Вы хотите сложить их и поместить результат в пару регистров BC. Это можно сделать так.
MOV A, C ; младший байт
ADD A, E
MOV C, A
MOV A, B ; старший байт
ADC A, D
MOV B, A
Для сложения используются две команды: ADD — для младшего байта, ADC — для старшего. Любой бит переноса, возникающий в результате первого сложения, участвует во втором сложении. Поскольку прибавлять можно только к значению в аккумуляторе, в этом небольшом фрагменте кода команда MOV используется не менее четырех раз. Команды MOV очень часто встречаются в программном коде для процессора 8080.
Пришло время поговорить о флагах микросхемы 8080. В процессоре из главы 17 использовались флаг переноса и флаг нуля. Микросхема 8080 предусматривает еще три флага: знака, четности и вспомогательного переноса. Все флаги хранятся в 8-битном регистре, который называется
флаг знака устанавливается в 1, если старший бит результата равен 1, то есть если результат отрицательный;
флаг нуля устанавливается в 1, если результат равен 0;
флаг четности устанавливается в 1, если результат
флаг переноса устанавливается в 1, если в результате выполнения команды ADD или ADC возникает бит переноса либо в результате выполнения команд SUB и SBB бит переноса не возникает (такая реализация флага переноса отличается от того, как он был реализован в компьютере из главы 17);
флаг вспомогательного переноса устанавливается в 1, если в результате выполнения команды возникает перенос из младшей тетрады в старшую; этот флаг используется только для команды DAA (Decimal Adjust Accumulator — десятичная коррекция аккумулятора).
На флаг переноса непосредственно влияют две команды.
Код
Команда
Значение
37
STC
Установить флаг переноса в 1
3F
CMC
Дополнить флаг переноса до 1 или инвертировать флаг переноса
В отличие от компьютера из главы 17, который тоже выполнял команды ADD, ADC, SUB и SBB (хотя и не с такой же степенью гибкости), процессор 8080 способен еще и на булевы операции И, ИЛИ и исключающее ИЛИ. За выполнение арифметических и логических операций отвечает арифметико-логическое устройство процессора.
Код
Команда
Код
Команда
A0
AND A, B
B0
OR A, B
A1
AND A, C
B1
OR A, C
A2
AND A, D
B2
OR A, D
A3
AND A, E
B3
OR A, E
A4
AND A, H
B4
OR A, H
A5
AND A, L
B5
OR A, L
A6
AND A,[HL]
B6
OR A,[HL]
A7
AND A, A
B7
OR A, A
A8
XOR A, B
B8
CMP A, B
A9
XOR A, C
B9
CMP A, C
AA
XOR A, D
BA
CMP A, D
AB
XOR A, E
BB
CMP A, E
AC
XOR A, H
BC
CMP A, H
AD
XOR A, L
BD
CMP A, L
AE
XOR A,[HL]
BE
CMP A,[HL]
AF
XOR A, A
BF
CMP A, A
Команды AND, OR и XOR выполняются
MVI A,0Fh
MVI B,55h
AND A, B
Если бы последней была команда OR, то результат был бы равен 5Fh; если бы последней была команда XOR — 5Ah.
Команда CMP (Compare — сравнить) аналогична команде SUB, за исключением того, что результат не сохраняется в аккумуляторе. Другими словами, команда CMP выполняет вычитание, а затем удаляет результат. В чем же смысл? Во флагах! Флаги говорят о том, как два сравниваемых байта соотносятся. Рассмотрим, например, следующие команды.
MVI B,25h
CMP A, B
После их выполнения содержимое аккумулятора (А) остается прежним. Если значение в A равно 25h, будет установлен флаг нуля, а если значение в A меньше 25h — флаг переноса.
Для восьми арифметических и логических операций также существуют версии, которые выполняются непосредственно над байтами.
Код
Команда
Код
Команда
C6
ADI A, xx
E6
ANI A, xx
CE
ACI A, xx
EE
XRI A, xx
D6
SUI A, xx
F6
ORI A, xx
DE
SBI A, xx
FE
CPI A, xx