Общее представление команд

Для кодирования команд в системе команд микропроцессора 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.