Для кодирования команд в системе команд микропроцессора 8080 использованы практически все возможные варианты 8-разрядного кода команд, то есть команд чуть меньше 256.
По функциональному назначению их можно разделить на 6 основных групп.
· Команды пересылок – обеспечивают операции перемещения однобайтных или двухбайтных операндов между регистрами процессора, памятью данных или памятью программ;
· Команды передач управления – обеспечивают безусловные и условные ветвления в программе.
· Команды организации подпрограмм – обеспечивают условные и безусловные вызовы подпрограмм и возвраты из подпрограмм.
· Команды арифметических, логических и сдвиговых операций среди которых арифметические сложение и вычитание, а также логические “И”, “ИЛИ”, “НЕ”, “Исключающее ИЛИ”, сдвига вправо и влево, сравнения.
· Команды управления стеком – обеспечивают установку указателя стека, а также операции чтения и записи стека.
· Команды ввода, вывода и управления состоянием процессора – обеспечивают операции обмена байтами процессора с регистрами интерфейсов внешних устройств, а также управление триггером разрешения прерываний процессора, перевод процессора в состояние останова и отсутствие операций.
Полный список команд с выделением групп представлен в табл. 1.6, а перечень использованных для описания команд сокращений представлен в табл. 1.7. Буквы в заголовке табл. 1.6 обозначают: Ф – формат команды, выраженный количеством байтов команды; Т – количество машинных тактов в команде; Ц – количество машинных циклов в команде.
Таблица 1.6
Список команд микропроцессора 8080
Мнемокод | Действия | F | Название | Код | Ф | Т | Ц |
Команды пересылок | |||||||
MOV r1,r2 | (r1)(r2) | – | MOVe Register to Regist | 01DDDSSS | |||
MOV M,r | M(HL)(r) | – | MOVe Register to Memory | 01110SSS | |||
MOV r,M | (r)M(HL) | – | MOVe Memory to Register | 01DDD110 | |||
MVI r,d8 | (r)d8 | – | MOVe Immediate Register | 00DDD110 | |||
MVI M,d8 | M(HL)d8 | – | MOVe Immediate Memory | ||||
STA adr | M(adr)(A) | – | STore A direct | ||||
LDA adr | (A)M(adr) | – | LoaD A direct | ||||
STAX B | M(BC)(A) | – | STore A indirect | ||||
STAX D | M(DE)(A) | – | STore A indirect | ||||
LDAX B | (A)M(BC) | – | LoaD A indirect | ||||
LDAX D | (A)M(DE) | – | LoaD A indirect | ||||
LXI B,d16 | (BC)d16 | – | Load Immediate Register pair B&C | ||||
LXI D,d16 | (DE)d16 | – | Load Immediate register pair D&E | ||||
LXI H,d16 | (HL)d16 | – | Load Immediate register pair H&L | ||||
LXI SP,d16 | (SP)d16 | – | Load Immediate stack pointer | ||||
SHLD adr | M(adr)(L) M(adr+1)(H) | – | Store H&L Direct | ||||
LHLD adr | (L)M(adr) (H)M(adr+1) | – | Load H&L Direct | ||||
XCHG | (HL)«(DE) | – | eXCHanGe H&L, D&E | ||||
Команды передачи управления | |||||||
PCHL | (PC)(HL) | – | H&L to Programm Counter | ||||
JMP adr | (PC)adr | – | JuMP unconditional | ||||
JNZ adr | JMP if Z=0 | – | Jump on No Zero | ||||
JZ adr | JMP if Z=1 | – | Jump on Zero | ||||
JNC adr | JMP if CY=0 | – | Jump on No Carry | ||||
JC adr | JMP if CY=1 | – | Jump on Carry | ||||
JPO adr | JMP if P=0 | – | Jump on Parity Odd | ||||
JPE adr | JMP if P=1 | – | Jump on Parity Even | ||||
JP adr | JMP if S=0 | – | Jump on Positive | ||||
JM adr | JMP if S=1 | – | Jump on Minus | ||||
Команды организации подпрограмм | |||||||
CALL adr | stack(PC) (PC)adr | – | CALL unconditional | ||||
CNZ adr | CALL if Z=0 | – | Call on No Zero | ||||
CZ adr | CALL if Z=1 | – | Call on Zero | ||||
CNC adr | CALL if CY=0 | – | Call on No Carry | ||||
CC adr | CALL if CY=1 | – | Call on Carry | ||||
CPO adr | CALL if P=0 | – | Call on Parity Odd | ||||
CPE adr | CALL if P=1 | – | Call on Parity Even | ||||
CP adr | CALL if S=0 | – | Call on Positive | ||||
CM adr | CALL if S=1 | – | Call on Minus | ||||
RST N | stack(PC) (PC)N*8 | – | ReSTart | 11nnn111 | |||
RET | (PC)stack | – | RETurn | ||||
RNZ | RET if Z=0 | – | Return on No Zero | ||||
RZ | RET if Z=1 | – | Return on Zero | ||||
RNC | RET if CY=0 | – | Return on No Carry | ||||
RC | RET if CY=1 | – | Return on Carry | ||||
RPO | RET if P=0 | – | Return on Parity Odd | ||||
RPE | RET if P=1 | – | Return on Parity Even | ||||
RP | RET if S=0 | – | Return on Positive | ||||
RM | RET if S=1 | – | Return on Minus | ||||
Команды арифметических, логических и сдвиговых операций | |||||||
ADD r | (A)(A)+(r) | + | ADD Register to A | 10000SSS | |||
ADD M | (A)(A)+M(HL) | + | ADD Memory to A | ||||
ADI d8 | (A)(A)+d8 | + | ADd Immediate to A | ||||
ADC r | (A)(A)+(r)+ (CY) | + | ADd Register to A with Carry | 10001SSS | |||
ADC M | A)(A)+M(HL)+(CY) | + | ADd Memory to A with Carry | ||||
ACI d8 | (A)(A)+d8+ (CY) | + | Add Immediate to A with Carry | ||||
INR r | (r)(r)+1 | –CY | INcRement Register | 00DDD100 | |||
INR M | M(HL) M(HL)+1 | –CY | INcRement Memory | ||||
INX B | (BC)(BC)+1 | – | INcrement register pair B&C | ||||
INX D | (DE)(DE)+1 | – | INcrement register pair D&E | ||||
INX H | (HL)(HL)+1 | – | INcrement register pair H&L | ||||
DAD B | (HL)(HL)+ (BC) | CY | Double register ADd. Add B&C to H&L | ||||
DAD D | (HL)(HL)+ (DE) | CY | Double register ADd. Add D&E to H&L | ||||
DAD H | (HL)(HL)+ (HL) | CY | Double register ADd. Add H&L to H&L | ||||
DAD SP | (HL)(HL)+ (SP) | CY | Double register ADd. Add SP to H&L | ||||
SUB r | (A)(A)–(r) | + | SUBtract Register from A | 10010SSS | |||
SUB M | (A)(A)–M(HL) | + | SUBtract Memory from A | ||||
SUI d8 | (A)(A)–d8 | + | SUbtract Immediate from A | ||||
SBB r | (A)(A)–(r)–(CY) | + | SUbtract Register from A with borrow | 10011SSS | |||
SBB M | (A)(A)–M(HL)– (CY) | + | Subtract Memory from A with borrow | ||||
SBI d8 | (A)(A)–d8–(CY) | + | Subtract Immediate from A with Borrow | ||||
DCR r | (r)(r)–1 | –CY | DeCrement Register | 00DDD101 | |||
DCR M | M(HL) M(HL)–1 | –CY | DeCrement Memory | ||||
DCX B | (BC)(BC)–1 | – | DeCrement register pair B&C | ||||
DCX D | (DE)(DE)–1 | – | DeCrement register pair D&E | ||||
DCX H | (HL)(HL)–1 | – | DeCrement register pair H&L | ||||
ANA r | (A)(A)&(r) | + | ANd Register with A | 10100SSS | |||
ANA M | (A) (A)&M(HL) | + | ANd Memory with A | ||||
ANI d8 | (A)(A)&d8 | + | ANd Immediate with A | ||||
ORA r | (A)(A)Ú(r) | + | OR Register with A | 10110SSS | |||
ORA M | (A) (A)ÚM(HL) | + | OR Memory with A | ||||
ORI d8 | (A)(A)Úd8 | + | OR Immediate with A | ||||
XRA r | (A)(A)Å(r) | + | eXclusive or Register with A | 10101SSS | |||
XRA M | (A)(A)ÅM(HL) | + | eXclusive or Memory with A | ||||
XRI d8 | (A)(A)Åd8 | + | eXclusive or Immediate with A | ||||
CMP r | (F)(A–(r) | + | CoMPare Register with A | 00DDD101 | |||
CMP M | (F)(A)–M | + | CoMPare Memory with A | ||||
CPI d8 | (F)(A)–d8 | + | ComPare Immediate with A | ||||
RAR | CY | Rotate A Right through carry | |||||
RAL | CY | Rotate A Left through carry | |||||
RRC | CY | Rotate A Right into the Carry | |||||
RLC | CY | Rotate A Left into the Carry | |||||
DAA | Десятичная коррекция | + | Decimal Adjust A | ||||
CMA | (A)() | – | CoMplement A | ||||
STC | (CY)1 | CY | SeT Carry | ||||
CMC | (CY)() | CY | CoMplement Carry | ||||
Команды управления стеком | |||||||
SPHL | (SP)(HL) | – | H&L to Stack Pointer | ||||
PUSH B | stack(BC) | – | PUSH register pair B&C on stack | ||||
PUSH D | stack(DE) | – | PUSH register pair D&E on stack | ||||
PUSH H | stack(HL) | – | PUSH register pair H&L on stack | ||||
PUSH PSW | stack(A)&(F) | – | PUSH A&F on stack | ||||
POP B | (BC)stack | – | POP register pair B&C off stack | ||||
POP D | (DE)stack | – | POP register pair D&E off stack | ||||
POP H | (HL)stack | – | POP register pair H&L off stack | ||||
POP PSW | (A)&(F)stack | – | POP A&F off stack | ||||
XTHL | (HL)«stack | – | eXchange H&L, Top of stack | ||||
Команды ввода, вывода и управления состоянием процессора | |||||||
IN port | ABport (A)DB | – | INput | ||||
OUT port | ABport DB(A) | – | OUTput | ||||
DI | Запрет прерываний | – | Disable Interrupts | ||||
EI | Разрешение прерываний | – | Enable Interrupts | ||||
HLT | Останов | – | HaLT | ||||
NOP | Нет операции | – | No-OPeration |
Таблица 1.7
Обозначения принятые при описании команд
Обозн. | Пояснения |
r,r1,r2 | один из 8 разрядных регистров общего назначения: A,B,C,D,E,H,L |
SSS | адрес регистра источника информации (Табл.1) |
DDD | адрес регистра приёмника информации (Табл.1); |
() | содержимое. Например,(A) – содержимое регистра A. |
M() | содержимое ячейки памяти, адрес которой задан косвенно. Например, M(HL) – содержимое ячейки памяти, адрес которой хранится в регистровой паре HL. |
d8,d16 | соответсвенно 8- и 16-разрядный операнды, адресуемые непосредственно |
adr | 16-разрядный адрес памяти |
port | 8-разрядный адрес устройства ввода-вывода |
PC | регистр-счётчик команд (Programm Counter) |
SP | регистр-указатель стека (Stack Pointer) |
nnn | двоичный код номера N |
AB | шина адреса (Adress Bus) |
DB | шина данных (Data Bus) |
F | влияние команды на признаки |
+ | команда влияет на все признаки |
– | команда не влияет ни на какой признак |
+CY | команда влияет только на признак CY |
–CY | команда влияет на все признаки кроме признака CY |
Ф | формат команды (количество байт) |
Т | количество машинных тактов в команде |
Ц | количество машинных циклов в команде |
Команды пересылок
Команды выполняют пересылки однобайтного или двухбайтного операнда, от источника к приёмнику. При этом исходное содержимое источника остаётся без изменений, то есть получается копирование содержимого источника в приёмник.
В качестве операнда источника может быть:
· регистр (однобайтные операции) или регистровая пара процессора (двухбайтные операции);
· одна или две последовательно расположенные ячейки памяти данных;
· одна или две последовательно расположенные ячейки памяти программы, в которых размещены второй и третий байты самой команды пересылки.
В качестве операнда приёмника может быть:
· регистр или регистровая пара процессора;
· одна или две последовательно расположенные ячейки памяти данных.
Следует отметить, что команды пересылок между ячейками памяти отсутствуют в составе системы команд микропроцессора 8080. Такого рода пересылки предполагается выполнять через регистры процессора путём нескольких соответствующих команд.
Однобайтные пересылки
Для пересылок между регистрами процессора предназначены команды типа MOV r1,r2, в которых r1 – регистр приёмника, r2 – регистр источника. Приёмником или источником может быть любой регистр общего назначения процессора.
Пример 1.21
Адрес Число Мнемокод Комментарий
0800 78 MOV A,B; пересылка из регистра В в аккумулятор
0801 4C MOV C,H; пересылка из регистра H в регистр C
0802 55 MOV D,L; пересылка из регистра L в регистр D
Всё это короткие однобайтные по формату 5-тактовые команды. На их интерпретацию процессору требуется только один машинный цикл для выборки самой команды.
Для пересылок между регистрами процессора и памятью данных предназначены команды типа MOV r,M – для чтения памяти и MOV M,r – для записи памяти. В этих командах M – ячейка памяти, адрес которой будет взят из регистровой пары HL.
Пример 1.22
Адрес Число Мнемокод Комментарий
0800 56 MOV D,M; пересылка из ячейки M в регистр D
0801 71 MOV M,C; пересылка из регистра C в ячейку M
Это однобайтовые по формату, но уже 7-тактовые команды. Дополнительный машинный цикл нужен в фазе выполнения команды. Кроме того, программисту, применяющему данные команды, следует помнить о необходимости предварительной подготовки адреса памяти M в регистровой паре HL.
Есть и другие команды обеспечивающие пересылки между регистрами процессора и памятью данных. Их особенность в том, что регистром для обмена с памятью может быть только аккумулятор. Ячейка памяти может определятся:
· прямым адресом adr в командах типа LDA adr – чтение из памяти и STA adr – запись в память;
· косвенно через одну из двух возможных регистровых пар – BC или DE в командах LDAX B, LDAX D – чтение из памяти и в командах STAX B, STAX D – запись в память.
Пример 1.23.
Адрес Число Мнемокод Комментарий
0800 3A 00 0B LDA 0B00h; пересылка из ячейки адресом 0B00 в ре-;гистр A
0803 32 10 0B STA 0B10h; пересылка из A в ячейку с адресом 0B10
Это – медленные трёхбайтные 13-тактовые команды. Кроме трёх машинных циклов требуемых для чтения байтов команды, необходим ещё один цикл на выполнение операции пересылки.
Пример 1.24.
Адрес Число Мнемокод Комментарий
0800 1A LDAX D; пересылка из ячейки M(DE) в
; аккумулятор
0801 02 STAX B;пересылка из аккумулятора в ячейку;M(BC)
Эти команды занимают в памяти только один байт памяти. Они требуют на выполнение 7 машинных тактов и предварительного определения адреса в регистровой паре.
Для пересылок с целью записать в регистр процессора или в память какое-то непосредственно указанное число применяются команды типа MVI r,d8 – для записи в регистр и MVI M,d8 – для записи в память. В этих командах непосредственно указанное число обозначено в общем виде – d8, а ячейка памяти M определена косвенно через адрес в регистровой паре HL.
Пример 1.25.
Адрес Число Мнемокод Комментарий
0800 0E 45 MVI B,45h;пересылка числа 45 в регистр B
0802 36 6B MVI M,6Bh;пересылка числа 6B в ячейку памяти
;M(HL)
Двухбайтные пересылки
Для пересылок между регистрами процессора и памятью имеются команды типа LHLD adr – чтение памяти и SHLD adr – запись в память. Регистрами в этих командах являются регистры пары HL, а память можно определять прямо в самой команде адресом adr. Этот адрес определит место младшего байта числа, а место старшего байта числа окажется по адресу adr+1.
Пример 1.26.
Адрес Число Мнемокод Комментарий
0800 2A 00 0B LHLD 0B00h; пересылка числа из регистровой пары
; HL в память: M(0B00)(L),
; M(0B01)(H)
0803 22 10 0B SHLD 0B10h; пересылка числа из памяти
; в регистровую пару HL: M(0B00)(L),
; M(0B01)(H)
Несмотря на то что на выполнение этих команд требуется 16 тактов, аналогичные действия с применением нескольких команд однобайтных пересылок оказываются гораздо более долгими. Например, 36 тактов потребуется в варианте примера 6.7:
Пример 1.27
Метка Мнемокод Комментарий
LDA 0B00; 13 тактов
MOV L,A; 5 тактов
LDA 0B01; 13 тактов
MOV H,A; 5 тактов
Для двухбайтных пересылок между регистрами есть только одна команда, причём не обычная пересылка, а обмен содержимым регистровых пар DE и HL – команда HCHG.
Кроме того, имеются команды непосредственной загрузки регистровых пар и 16-разрядного регистра указателя стека SP вторым и третьим байтами из состава байтов команды – LXI B,d16; LXI D,d16; LXI H,d16; LXI SP,d16. В этих командах d16 – загружаемое двухбайтное число, а регистровые пары обозначены буквами своих старших регистров.
Пример 1.28.
Адрес Число Мнемокод Комментарий
0800 01 00 00 LXI B,0000h; Пересылка числа 0 в регистр. пару BC
0803 21 97 19 LXI H,1997h; Пересылка числа 1997 в регистровую
; пару HL: (H)19, (L)97.