5. Система команд процессора.
Система команд процессора Z-80 довольно обширна и потому наилучший способ ее изучения состоит в том, чтобы сгруппировать похожие по своему действию команды и осваивать их по группам.
Мы выделим 19 основных групп команд, но некоторые из этих групп будут иметь подгруппы.
Начиная освоение машинных кодов, в главе 1 мы использовали десятичную систему для записи кодов операций, операндов и адресов. Это делалось для более быстрой адаптации читателей к особенностям программирования на уровне процессора. Теперь же, когда мы установили, что профессионально эффективнее работать в шестнадцатеричной системе, мы будем применять ее. Указывать суффикс «H» в записи чисел и адресов уже не будем.
5.1. Загрузка числа в регистр
5.1.1. Загрузка одиночного регистра.
Эти команды существуют для всех одиночных регистров.
Команды - двухбайтные. Сначала следует код операции, за ним - само число n. При засылке числа в регистр, старое значение, находившееся в нем, утрачивается.
|
Мнемоника |
Код |
Мнемоника |
Код |
|
LD A,n |
3E n |
LD B,n |
06 n |
|
LD C,n |
0E n |
LD D,n |
16 n |
|
LD E,n |
1E n |
LD H,n |
26 n |
|
LD L,n |
2E n |
|
|
5.1.2. Загрузка регистровой пары.
В регистровую пару может быть загружено двухбайтное число, т.е. от 0 до 65535. Эти команды для всех регистров, кроме IX и IY - трехбайтные. За кодом операции следуют два байта, задающие число. Для операций с индексными регистрами IX и IY эти команды - четырехбайтные, т.к. код операции включает в себя префикс DD (для регистра IX) или FD (для регистра IY).
Наиболее часто двухбайтное число, засылаемое в регистровую пару, является адресом, но это может быть и просто целое число. Следует помнить, что всегда первый байт числа загружается в младший регистр пары, а второй - в старший.
|
Мнемоника |
Код |
Мнемоника |
Код |
|
LD HL,nn |
21 n n |
LD BC,nn |
01 n n |
|
LD DE,nn |
11 n n |
LD IX,nn |
DD 21 n n |
|
LD IY,nn |
FD 21 n n |
LD SP,nn |
31 n n |
5.2. Копирование и обмен содержимого регистров
5.2.1. Копирование одиночных регистров.
Для аккумулятора и шести регистров общего назначения существуют 49 команд, позволяющих копировать содержимое одного регистра в другой. Ни одна из этих команд на флаги не влияет.
Все эти команды - однобайтные. Коды этих команд приведены в таблице ниже.
|
|
LD A,r |
LD H,r |
LD L,r |
LD B,r |
LD C,r |
LD D,r |
LD E,r |
|
A |
7F |
67 |
6F |
47 |
4F |
57 |
5F |
|
H |
7C |
64 |
6C |
44 |
4C |
54 |
5C |
|
L |
7D |
65 |
6D |
45 |
4D |
55 |
5D |
|
B |
78 |
60 |
68 |
40 |
48 |
50 |
58 |
|
C |
79 |
61 |
69 |
41 |
49 |
51 |
59 |
|
D |
7A |
62 |
6A |
42 |
4A |
52 |
5A |
|
E |
7B |
63 |
6B |
43 |
4B |
53 |
5B |
Для регистров I и R существуют команды копирования только в паре с аккумулятором.
|
Мнемоника |
Код |
Мнемоника |
Код |
|
LD A,I |
ED 57 |
LD A,R |
ED 5F |
|
LD I,A |
ED 47 |
LD R,A |
ED 4F |
5.2.2. Копирование содержимого регистровых пар.
Эти команды работают только с указателем стека. В этой группе только три команды. Они также не изменяют содержимого флагов.
|
Мнемоника |
Код |
Мнемоника |
Код |
|
LD SP,HL |
F9 |
LD SP,IX |
DD F9 |
|
LD SP,IY |
FD F9 |
|
|
В тех случаях, когда Вам надо скопировать содержимое произвольной регистровой пары в другую произвольную, например из BC в DE, Вы можете воспользоваться двумя командами копирования одиночных регистров - LD D,B и LD E,C.
Второй способ для этой цели - произвести переброску через стек, но для этого надо воспользоваться командами для работы со стеком см. раздел 5.11.
5.2.3. Команды обмена.
В этой подгруппе три команды:
EX DE, HL (код ED) - обмен между собой содержимым регистров HL и DE.
На флаги не влияет.
EXX (код D9) - переключить основной набор регистров на
альтернативный.
EX AF,A'F' (код 08) - переключить аккумулятор и флаговый
регистры на альтернативные.
5.3. Загрузка регистров из памяти
Эти команды требуют указания адреса, откуда данные могут быть загружены в регистр. Существуют три основных метода адресации:
· прямая адресация;
· косвенная адресация;
· индексная адресация.
В соответствии с этими тремя методами мы и рассмотрим три подгруппы в этой группе.
5.3.1. Загрузка регистра прямой адресацией.
После кода команды следует двухбайтный адрес ячейки nn, содержимое которой загружается в данный регистр. Единственный случай, когда такой командой загружается одиночный регистр - это загрузка аккумулятора, во всех остальных случаях загружаются два байта в регистровую пару. Предполагается, что второй байт берется из ячейки nn+1. При этом содержимое указанного адреса идет в младший регистр, а следующего - в старший. Интересно отметить, что загрузка пары HL может выполняться двумя способами.
|
Мнемоника |
Код |
Мнемоника |
Код |
|
LD A,(nn) |
3A n n |
LD SP,(nn) |
ED 7B n n |
|
LD HL,(nn) |
2A n n |
Вторая форма |
ED 6B n n |
|
LD BC,(nn) |
ED 4B n n |
LD DE,(nn) |
ED 5B n n |
|
LD IX,(nn) |
DD 2A n n |
LD IY,(nn) |
FD 2A n n |
5.3.2. Загрузка регистра косвенной адресацией.
Здесь не указывается, из какого адреса надо взять данные, зато указывается, в какой регистровой паре находится этот адрес. Еще раз напомним, что загружается не этот адрес, а то, что в нем находится.
Пример: LD A,(HL) - код 7E загрузить в регистр A то число, которое находится в ячейке памяти, адрес которой находится в регистре HL.
Остальные этой подгруппы.
|
Мнемоника |
Код |
Мнемоника |
Код |
|
LD A,(BC) |
0A |
LD A,(DE) |
1A |
|
LD H,(HL) |
66 |
LD L,(HL) |
6E |
|
LD B,(HL) |
46 |
LD C,(HL) |
4E |
|
LD D,(HL) |
56 |
LD E,(HL) |
5E |
5.3.3. Загрузка регистра индексной адресацией.
Этим методом из памяти могут загружаться однобайтные данные в аккумулятор или в регистры общего назначения. Адрес требуемого байта задается следующим образом:
· в регистре IX или IY находится базовый адрес таблицы или массива данных;
· в команде после кода операции указывается операнд «смещение» s требуемого адреса относительно базового. Величина s может быть только однобайтной от 0 до 255.
Обратите внимание на возможную ошибку: если Вам надо загрузить в регистр общего назначения тот байт, который находится по базовому адресу таблицы, хранящемуся в IX или в IY, то смещение все равно указывать надо. Просто в этом случае s=0.
|
Мнемоника |
Код |
Мнемоника |
Код |
|
LD A,(IX+s) |
DD 7E s |
LD A,(IY+s) |
FD 7E s |
|
LD H,(IX+s) |
DD 66 s |
LD H,(IY+s) |
FD 66 s |
|
LD L,(IX+s) |
DD 6E s |
LD L,(IY+s) |
FD 6E s |
|
LD B,(IX+s) |
DD 46 s |
LD B,(IY+s) |
FD 46 s |
|
LD C,(IX+s) |
DD 4E s |
LD C,(IY+s) |
FD 4E s |
|
LD D,(IX+s) |
DD 56 s |
LD D,(IY+s) |
FD 56 s |
|
LD E,(IX+s) |
DD 5E s |
LD E,(IY+s) |
FD 5E s |
Ни одна из команд загрузки регистров из памяти не меняет флаги. В Справочнике (часть 3) указано время исполнения команд в тактовых циклах. При частоте 3,5 МГц один тактовый импульс длится - 0,000000286 сек. Минимальная продолжительность команды в процессоре Z-80 - 4 тактовых цикла. Из рассмотренных в данной группе команд самыми быстрыми являются команды загрузки регистров косвенной адресацией. Они занимают в основном 7 циклов. Команды загрузки прямой адресацией длятся 16 - 20 циклов, а при индексной адресации - 19 циклов.
5.4. Команды записи данных из регистров в память
Команды этой группы прямо противоположны командам предыдущей группы. Также как и там, здесь можно выделить три подгруппы в зависимости от метода адресации.
5.4.1. Запись в память при прямой адресации.
|
Мнемоника |
Код |
Мнемоника |
Код |
|
LD (nn),A |
32 n n |
LD (nn),SP |
ED 73 n n |
|
LD (nn),HL |
22 n n |
Вторая форма |
ED 63 n n |
|
LD (nn),BC |
ED 43 n n |
LD (nn),DE |
ED 53 n n |
|
LD (nn),IX |
DD 22 n n |
LD (nn),IY |
FD 22 n n |
Обратите внимание на то, что в этой подгруппе нет команд на запись в память целых чисел. Когда необходимо выполнить такую операцию, ее делают поэтапно. Сначала число заносят в регистр командой 1-ой группы, а затем отправляют из регистра в память командой 4-й группы.
Поскольку эти команды являются противоположными командами 3-й группы, они часто употребляются совместно. Командами 4-й группы программные переменные отправляются на временное хранение в отведенное им в памяти место, а командами 3-й группы - вызываются из памяти в процессор для обработки.
5.4.2. Запись в память при косвенной адресации.
|
Мнемоника |
Код |
Мнемоника |
Код |
|
LD (HL),A |
77 |
LD (BC),A |
02 |
|
LD (DE),A |
12 |
LD (HL),H |
74 |
|
LD (HL),L |
75 |
LD (HL),B |
70 |
|
LD (HL),C |
71 |
LD (HL),D |
72 |
|
LD (HL),E |
73 |
LD (HL),n |
36 n |
5.4.3. Запись в память при индексной адресации.
Команды этой подгруппы существуют для всех одиночных регистров общего назначения и аккумулятора. Базовый адрес может находиться как в регистровой паре IX, так и в IY.
|
Мнемоника |
Код |
Мнемоника |
Код |
|
LD (IX+s),A |
DD 77 s |
LD (IY+s),A |
FD 77 s |
|
LD (IX+s),H |
DD 74 s |
LD (IY+s),H |
FD 74 s |
|
LD (IX+s),L |
DD 75 s |
LD (IY+s),L |
FD 75 s |
|
LD (IX+s),B |
DD 70 s |
LD (IY+s),B |
FD 70 s |
|
LD (IX+s),C |
DD 71 s |
LD (IY+s),C |
FD 71 s |
|
LD (IX+s),D |
DD 72 s |
LD (IY+s),D |
FD 72 s |
|
LD (IX+s),E |
DD 73 s |
LD (IY+s),E |
FD 73 s |
|
LD (IX+s),n |
DD 36 s n |
LD (IY+s),n |
FD 36 s n |