40
MOV B, B
50
MOV D, B
41
MOV B, C
51
MOV D, C
42
MOV B, D
52
MOV D, D
43
MOV B, E
53
MOV D, E
44
MOV B, H
54
MOV D, H
45
MOV B, L
55
MOV D, L
46
MOV B,[HL]
56
MOV D,[HL]
47
MOV B, A
57
MOV D, A
48
MOV C, B
58
MOV E, B
49
MOV C, C
59
MOV E, C
4A
MOV C, D
5A
MOV E, D
4B
MOV C, E
5B
MOV E, E
4C
MOV C, H
5C
MOV E, H
4D
MOV C, L
5D
MOV E, L
4E
MOV C,[HL]
5E
MOV E,[HL]
4F
MOV C, A
5F
MOV E, A
Как видите, весьма удобные команды. При наличии значения в одном из регистров можно переместить его в другой. Обратите внимание на четыре команды, которые используют пару регистров HL, например на следующую.
MOV B,[HL]
Упомянутая выше команда LDA перемещает байт из памяти в аккумулятор; 16-битный адрес этого байта следует непосредственно за кодом команды LDA. Эта команда MOV перемещает байт из памяти в регистр B. Однако адрес байта, который должен быть загружен в регистр, хранится в паре регистров HL. Как 16-битный адрес оказался в паре регистров HL? Это могло произойти разными способами. Возможно, этот адрес был каким-то образом вычислен.
В общем, обе команды загружают байт из памяти в микропроцессор, но используют два разных метода для адресации памяти. Первый метод называется прямой адресацией, а второй — индексной адресацией.
LDA A,[aaaa]
MOV B,[HL]
Второй набор из 32 команд MOV показывает, что ячейки памяти, адресуемые парой регистров HL, могут являться не только источником, но и местом назначения.
Код
Команда
Код
Команда
40
MOV B, B
50
MOV D, B
60
MOV H, B
70
MOV [HL], B
61
MOV H, C
71
MOV [HL], C
62
MOV H, D
72
MOV [HL], D
63
MOV H, E
73
MOV [HL], E
64
MOV H, H
74
MOV [HL], H
65
MOV H, L
75
MOV [HL], L
66
MOV H,[HL]
76
HLT
67
MOV H, A
77
MOV [HL], A
68
MOV L, B
78
MOV A, B
69
MOV L, C
79
MOV A, C
6A
MOV L, D
7A
MOV A, D
6B
MOV L, E
7B
MOV A, E
6C
MOV L, H
7C
MOV A, H
6D
MOV L, L
7D
MOV A, L
6E
MOV L,[HL]
7E
MOV A,[HL]
6F
MOV L, A
7F
MOV A, A
Некоторые из этих команд, например MOV A, A, не делают ничего полезного. Команды MOV [HL],[HL] вообще не существует. Код, который мог бы ей соответствовать, выделен команде HLT (Halt — остановить).
Более показательный способ анализа команд MOV — рассмотрение битового шаблона их кода. Код команды MOV состоит из восьми битов:
01ннниии,
где буквы ннн соответствуют 3-битному коду места назначения, а иии — 3-битному коду источника. Эти 3-битные коды обозначают следующие регистры.
000 = регистр B
001 = регистр C
010 = регистр D
011 = регистр E
100 = регистр H
101 = регистр L
110 = ячейка памяти по адресу HL
111 = аккумулятор
Команда MOV L, E соответствует коду 01101011, или 6Bh. Вы можете свериться с предыдущей таблицей, чтобы убедиться в этом.
Вероятно, где-то внутри процессора 8080 три бита иии используются в селекторе «8 на 1», а три бита ннн управляют дешифратором «3 на 8», определяющим регистр, где будет зафиксировано значение.
Регистры B и C также можно использовать как 16-битную пару регистров BC, а регистры D и E — как 16-битную пару регистров DE. Если в любой из этих пар регистров содержится адрес ячейки памяти, откуда вы хотите считать или куда хотите записать байт, можете использовать следующие команды.
Код
Команда
Код
Команда
02
STAX [BC], A
0A
LDAX A,[BC]
12
STAX [DE], A
1A
LDAX A,[DE]
Другой тип команды Move называется Move Immediate («Переместить непосредственно») и обозначается мнемокодом MVI. Эта команда состоит из двух байтов. Первый — код команды, второй — байт данных. Этот байт перемещается из памяти в один из регистров или в ячейку памяти, адрес которой содержится в паре регистров HL.