Так ли необходимы все эти регистры? Почему мы в них не нуждались, собирая компьютер в главе 17? Теоретически использовать их не обязательно, а практически — весьма удобно. Многие компьютерные программы способны одновременно манипулировать несколькими числами. Это проще всего делать, если числа хранятся не в памяти, а в регистрах микропроцессора. Кроме того, программа работает быстрее: чем реже она обращается к памяти, тем быстрее выполняется.
Для команды процессора 8080 под названием MOV (Move — переместить) предусмотрено 63 кода. Эти коды занимают только один байт и, как правило, перемещают содержимое одного регистра в другой или в тот же самый. Множество команд MOV — следствие использования в микропроцессоре семи регистров (включая аккумулятор).
Вот первые 32 команды MOV. Помните, что место назначения соответствует аргументу слева, а источник — аргументу справа.
Код
Команда
Код
Команда
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ннниии,
где буквы
000 = регистр B
001 = регистр C
010 = регистр D
011 = регистр E
100 = регистр H
101 = регистр L
110 = ячейка памяти по адресу HL
111 = аккумулятор
Команда MOV L, E соответствует коду 01101011, или 6Bh. Вы можете свериться с предыдущей таблицей, чтобы убедиться в этом.
Вероятно, где-то внутри процессора 8080 три бита
Регистры 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.
Код
Команда
06
MVI B, xx
0E
MVI C, xx
16
MVI D, xx
1E
MVI E, xx
26
MVI H, xx
2E
MVI L, xx
36
MVI [HL], xx
3E
MVI A, xx
Например, после выполнения команды MVI E,37h в регистре E будет содержаться байт 37h. Этот третий метод обращения к памяти называется
Набор из 32 кодов команд выполняет четыре основные арифметические операции, с которыми мы познакомились, когда собирали процессор (глава 17). К ним относятся сложение (ADD), сложение с переносом (ADC), вычитание (SUB) и вычитание с заимствованием (SBB). Во всех случаях аккумулятор является одним из двух операндов, а также местом назначения для результата.
Код
Команда
Код