5. Система команд
5. 1. Методы адресации
Одним из важнейших показателей мощности системы команд любого микропроцессора
является количество методов адресации. Под методом адресации понимается способ обращения
команды к обрабатываемому операнду. Различные методы адресации необходимы, с одной
стороны, для удобства программирования, с другой, для эффективной работы программ.
Далее рассмотрены методы адресации, используемые в системе команд МП Z80.
Непосредственная адресация.
При таком методе адресации операнд находится в памяти непосредственно за кодом
операции команды. Он может быть 8 или 16-битной константой. Формат команд в этой случае:
Регистровая адресация.
В этом случае операнд находится в регистре либо в паре регистров ЦП. Регистр адресуется
тремя битами, входящими в код операции, пара регистров - двумя.
Косвенная адресация.
При этой методе адресации операнд находится в ячейке памяти, адрес которой содержится
в одной из регистровых пар ВС, DE или HL.
Абсолютная адресация.
За кодом операции в этом случае следуют два байта (16 бит), которые являются адресом.
Это может быть адрес данных в памяти, адрес перехода или адрес подпрограммы.
Модифицированная нуль-страничная адресация.
Адресное пространство микропроцессора условно можно разбить на страницы по 4К. Тогда
к нулевой странице будут относиться адреса 0000H.. .1000H. МП Z80 имеет специфический вид
адресации, когда в коде операции 3 бита, задают модифицированный адрес рестарта. Эти адреса
располагаются на нулевой странице области памяти МП. Команда состоит из одного байта:
Следующие три вида адресации МП Z80 существенно расширяют его возможности по
сравнению с I8080.
Относительная адресация.
Этот вид адресации может использоваться командами условного и безусловного переходов.
В каком случае они состоят из двух байтов: первый байт содержит код операции, а второй -
смещение в дополнительном коде. Действительный адрес получается прибавлением смещения к
текущему значению счетчика команд.
Смешение как число со знаком, может задаваться от -128 до +127. Но т.к. оно складывается
с (РС+2), то фактически можно, адресоваться к ячейкам памяти, расположенным на расстоянии от
-126 до +129 байт от адреса кода операции команды перехода.
Преимущества относительной адресации перед абсолютной:
•S команда занимает в памяти на один байт меньше места;
•S программа становится перемещаемой, т.е. не зависит от своего места расположения в
памяти.
Индексная адресация.
Сущность индексной адресации аналогична относительной адресации, только в данном
случае базой выступает не счётчик команд PC, а один из индексных регистров IX или IY. Данный
метод адресации удобен при обработке массивов данный. Смещение d, непосредственно
представленное в команде, складывается с содержимым индексного регистра и образует адрес
памяти, по которому находятся данные. Т. о. можно адресоваться к данным находящимся в памяти
на расстоянии от -128 до +127 байт от содержимого индексного регистра. Структура команд в
данном случае:
Битовая адресация.
Этот вид адресация используется в группе команд для работы с отдельными битами. Три
разряда кода операции являются номером бита операнда, над которым будут производиться
действия (тестирование, сброс или установка).
Встроенная адресация.
Некоторые команды, состоящие только из кода операции, однозначно определяют, где
находится операнд. Например, команды работы с аккумулятором NEG и CPL.
Смешанная адресация.
Если в команде операнды адресованы по-разному, то имеет место смешанная адресация,
например LD (IX+d),r
5.2. Группы/ команд
Систему команд МП можно разделить на группы команд в соответствии с их
функциональным назначением. Группы команд представлены в таблицах 5.1.1 ... 5.1.12.
Первая колонка в этих таблицах содержит символические обозначения (мнемокоды),
используемые при написании программ на языке Ассемблера МП Z80. В основе этих
символических обозначений, как правило, лежит аббревиатура полной записи команды на
английском языке.
Во второй - время выполнения в тактах.
В третьей колонке приведены формат и двоичный кол команды.
Действия, происходящие при выполнении команды, показаны в четвертой колонке. Следует
отметить, что здесь не отражен порядок выполнения этих действий; этот вопрос подробно
рассмотрен в 5.4.
Последняя колонка отражает состояние флагов после выполнения команды.
В дальнейшем описании и таблицах приняты следующие обозначения:
r 8-битный регистр: A=111; B=000; C=001; D=010; E=011; H=100; L=101
dd qq pp rr 16-битная регистровая пара:
dd BC=00; DE=01; HL=10; SP=11
qq BC=00; DE=01; HL=10; AF=11
pp BC=00; DE=01; IX=10; SP=11
rr BC=00; DE=01; IY=10; SP=11
n 8-битный операнд
nn 16-битный операнд
(nn) содержимое ячейки nn (8-битный операнд) или содержимое ячеек nn и nn+1 (16-
битный операнд)
t r, (HL), (IX+d) или (IY+d)
e t или n
d 8-битное смешение (-128 ... +127)
е 8-битное смещение (-126 ... +129)
b позиционный номер бита:
D0=000; D1=001; D2=010; D3=011; D4=100; D5=101; D6=110; D7=111
cc условие перехода:
NZ=000 (не ноль); Z=001 (ноль); NC-010 (нет переноса); C=011 (перенос); PO=100
(нечетность); PE=101 (четность); P=110 (знак плюс); М=111 (знак минус)
p адрес рестарта: p=00H; p=08H; p=10H; p=18H; p=20H; p=28H; p=30H; p=38H
a номер рестарта: a=000; a=001; a=010; a=011; a=100; a=101; a=110; a=111
Состояние флагов:
0 |
флаг сброшен |
1 |
флаг установлен |
- |
неизменное |
X |
неопределенное |
? |
изменяется в соответствии с результатом |
V |
функции переполнения флага P/V |
Р |
Функция четности флага P/V |
IF |
состояние IFF2 |
T число тактов за которое выполняется команда
8-битовые команды загрузки. Мнемоническое сокращение языка Ассемблера для всех
команд загрузки одинаково: LD (load - загрузить). Далее следует указание приёмника, затем -
указание источника пересылаемых данных.
LD приемник, источник
Таблица 5.1.1 содержит все команды 8-битной загрузки. Большую часть кодов в ней
представляет команда LD r1,r2. В качестве r1 и r2 могут использоваться семь регистров: A, B, C,
D, E, H и L, каждый из которых может служить как источником, так и приемником.
Следовательно, эта команда дает в результате 49 кодов операции. В их числе семь команд с r1=r2,
которые по действию аналогичны NOP, т.к. фактического переноса данных не происходит, и
флаги не изменяются.
Источником переносимых данных может быть константа, непосредственно представленная
в команде сразу за кодом операции. Команда в этом случае выглядит так:
LD r,n
Как источником, так и приёмником может служить память. Это дает три типа команд:
LD r,(HL)
LD (HL),r
LD (HL),n
Память не может быть одновременно и источником, и приёмником пересылаемых данных;
пересылка всегда происходит через ЦП.
С помощью управляющего слова DD либо FD предоставляется возможность использовать
команды с индексным способом адресации. В этих командах за кодом операции следует смещение
d.
LD r,(IX+d)
LD r,(IY+d)
LD (IX+d),r
LD (IY+d),r
LD (IX+d),n
LD (IY+d),n
Эти команды не влияют на состояние флагов.
В следующих командах данные пересылаются между аккумулятором и ячейкой памяти,
адресуемой абсолютно - (nn), либо косвенно через регистровую пару:
LD A,(BC)
LD A,(DE)
LD A,(nn)
LD (BC),A
LD (DE),A
LD (nn),A
Флаги также остаются без изменений.
Регистры I и R могут использоваться как источник или приёмник в сочетании с
аккумулятором:
LD A,I
LD A,R
LD I,A
LD R,A
Команды LD A,I и LD A,R в отличим от всех остальных команд загрузки оказывают
влияние на флаги:
Н ^ 0
N ^ 0
P/V ^ IFF2 (триггер разрешения /запрещения прерываний)
В сумке группа 8-битных команд загрузки содержит 104 различных кода.
16 битовые команды загрузки. Команды этой группы представлены в таблице 5.1.2. В них
возможна регистровая адресация и косвенная через указатель стека. Сюда же входят команды
пересылки в стек и извлечения из стека, их мнемонические обозначения PUSH и POP
соответственно. Отличие их от обычных команд загрузки состоит в том, что указатель стека
автоматически уменьшается или увеличивается, когда байт "заталкивается" в стек или извлекается
из стека. По действию команды PUSH и POP взаимно обратные. Это в равной степени откосится и
к последовательности обработки байтов (см. таблицу 5.3): при PUSH сначала обрабатывается
старший байт, при POP - младший.
При всех 16-битовых командах загрузки, за исключением POP AF не происходит изменения
флагов
16-битовые команды обмена. Эта группа содержит 6 команд, которые изображены в
таблице 5.1.8. Мнемоническое обозначение EX происходит от слова Exchange (обмен).
Команда EX AF,AF' дает возможность программным путем переключать пары регистров A,
F и A', F'. А команда EXX позволяет переключаться на вспомогательный набор РОНов. Эти
команды длиной всего один байт, и время, необходимое для переключения, сведено к
минимальному. Т.о. реализовано очень короткое время отклика на прерывание.
Как и 16-битовые команды загрузки, команды обмена не влияют на состояние флагов.
Команды обработки блоков. Команды этой группы (см. таблицу 5.1.3) выполняют две
функции пересылка блоков и поиск байта в блоке данных.
Команды пересылки имеют мнемоники:
LDI загрузка с инкрементом
LDIR загрузка с инкрементом до BC=0
LDD загрузка с декрементом
LDDR загрузка с декрементом до BC=0
Команда LDI (LDD) пересылает содержимое области памяти, начиная с адреса, указанного
в HL в область памяти с начальным адресом в DE. Затем обе регистровые пары инкрементируются
(декрементируются), и счётчик байтов BC уменьшается на 1.
Команда LDIR (LDDR) выполняется, так же как и LDI (LDD), только обработка сразу
"зацикливается". Действие команды подобно пересылке блока данных при ПДП. Как для
адресации, так и для счётчика байтов отведено по 16 бит, т.о. могут обрабатываться блоки любой
длины и в любом месте памяти. Блоки данных могут также перекрываться. При HL=DE команда
теряет смысл т.к. источник и приёмник идентичны. Следует обратить внимание, что при
обработке команды сначала пересылаются данные, только затем декрементируется ВС, и на
основании этого решается вопрос о цикличности команды, выполнять дальнейшую пересылку
данных либо прекратить команду. После выполнения команды BC=0, что соответствует длине
блока в 2 =65536 байт.
Выполнение этих команд влияет на флаги:
Н ^ 0
N ^ 0
P/V ^ 1, при циклическом выполнении команды до пересылки последнего байта
P/V ^ 0, когда результат декремента BC достигнет 0.
Поиск данных в блоке выполняют четыре команды:
CPI сравнение и инкремент
CPIR сравнение и инкремент до BC=0 или A=(HL)
CPD сравнение и декремент
CPDR сравнение и декремент до BC=0 или A=(HL)
При выполнении команды CPI (CPD) из содержимого аккумулятора вычитается
содержимое ячейки памяти с адресом в HL, зятем декрементируется счетчик байтов BC, и
инкрементируется (декрементируется) HL. В соответствии с результатом сравнения
устанавливаются флаги.
Команда CPIR (CPDR) является цикличным повторением команды CPI (CPD) до тех пор,
пока не выполнится одно из условий. Это либо нахождение идентичного байта, либо окончание
просматриваемого блока. Соответственно этому устанавливаются флаги:
S ^ 1, когда результат сравнения отрицательный, иначе S ^ 0
Z ^ 1, когда A=(HL), иначе Z ^ 0
H ^ 1, когда был перенос в 4-й разряд, иначе Н ^ 0
P/V ^ 1, при BC^0
P/V ^ 0, когда результат декремента BC достигнет 0
N ^ 1
При каждом выполнении, до P/V=0, счётчик команд дважды декрементируется, что
означает вновь обращение к этой команде.
8-битные арифметические и логические команды. Команды этой группы отражены в
таблице 5.1.4. Они всегда используют аккумулятор в качестве приёмника результата.
Следовательно, в команде указывается только источник. В совокупности в этой группе 108
различных кодов, которые имеют следующие мнемоники:
ADD s сложение
ADC s сложение с учетом переноса
SUB s вычитание
SBC s вычитание с учетом переноса
AND s логическое " И"
OR s логическое "ИЛИ"
XOR s "исключающее ИЛИ"
CP s сравнение с аккумулятором
INC t инкремент
DEC t декремент
Флаги C, Z, S и H устанавливаются соответственно результату операции. Флаги P/V
действует в качестве флага переполнения V. Флаг N соответствует биту 4 кода выполняемой
операции и указывает команде DAA (см. ниже), какая из арифметических операций выполнялась -
сложение или вычитание.
Команда CP s выполняется так же, как и SUB s, c той разницей, что по результату операции
лишь устанавливаются флаги, а содержимое аккумулятора не изменяется.
Отдельно можно выделить команды, в которых арифметические и логические операции
производятся только над содержимым аккумулятора:
ADD А удвоение аккумулятора
ADC А как ADD A с учётом переноса
SUB A очистка аккумулятора (А^0), флаги: S^0, Z^1, H^0, P/V^0; N^1, C^0.
SBC A как SUB А при C=0; когда C=1, содержимое аккумулятора сбрасывается в 0FFH.
Флаги: S^1, Z^0, H^1, P/V^0; N^1, C^1.
AND А аккумулятор остается без изменений; в соответствии с его содержимым
устанавливаются флаги, S-^старший бит; Z-^1 при А=0, иначе Z-^0; P/V^1 при
чётном количестве единиц, иначе P/V^0; N^0; C^0.
OR A как при AND A.
XOR А очистка аккумулятора (A^00); флаги - как при AND A.
СР А аккумулятор без изменений; флаги устанавливается как при SUB A.
Общие операции с аккумулятором и флагами. К этой группе (таблица 5.1.4) относятся
следующие 5 команд:
DAA десятичная коррекции аккумулятора
CPL дополнение аккумулятора
NEG инверсия аккумулятора
CCF инверсии флага переноса
SCF установка Флага переноса
Десятичная коррекция аккумулятора используется после сложения либо вычитания чисел в
BCD (двоично-десятичной) формате. В этом формате 8-битный операнд представляет собой
двузначное десятичное число, в котором младшей десятичной цифре соответствует младшая
тетрада, а старшей - старшая. Для цифр BCD формата допустимы значения от 0 до 9. Однако,
результат сложения пли вычитания может превысить 9. В этом случае необходима десятичная
коррекция. После команд сложения она действует следующим образом:
1) если содержимое младшей тетрады аккумулятора больше 9 или H=1, то к аккумулятору
добавляется число 6.
2) если содержимое старшей тетрады аккумулятора стало после этого больше 9 или C=1, то
число 6 добавляется и к старшей тетраде аккумулятора.
После вычитания:
1) если H=1, то от аккумулятора вычитается число 6.
2) если C=1, то число 6 вычитается и из старшей тетрады аккумулятора.
Команда CPL побитно инвертирует содержимое аккумулятора (дополнение до 1) Команда
NEG изменяет знак содержимого аккумулятора на противоположный (дополнение до 2), она
соответствует вычитанию содержимого аккумулятора из нуля. С помощью команды SCF флаг
переноса устанавливается в 1, с помощью команды ССF его можно инвертировать.
16-битовые арифметические команды. Команды этой группы сведены в таблицу 5.1.5. Их
мнемоники соответствуют принятым для 8 битных арифметических команд, только
дополнительно указывается приемник результата. 16-битовые арифметические команды
позволяют использовать регистровые пары и 16-разрядные регистры.
В этой группе не предусмотрена команда SUB, поэтому при потребности в ней следует
применять команду SBC, предварительно сбросив флаг переноса, например, командой AND A.
Команды вращения и сдвига. Эта группа команд объединена в таблице 5.1.11.
Эти команды позволяют адресоваться к любому регистру или ячейке памяти. Они особенно
удобны при выполнении умножения и деления. Две команды (RLD и RRD) вращают тетрады
аккумулятора и ячейки памяти, адресуемой парой HL. Их целесообразно применять в двоично-
десятичной (BCD) арифметике. Конкретный вид вращения или сдвига ясен из символических
пояснений к каждой команде. Эта группа содержит 76 команд.
Команды для работы с битами. Почти в каждой программе требуется возможность
устанавливать, сбрасывать и проверять состояние, какого либо бита одного из регистров либо
ячейки памяти. Такие биты в самом общем случае выполняют роль флагов, которые указывают
программе какие предпринять действия. МП Z80 имеет команды, которые производят
тестирование, установку и сброс любого бита регистра или ячейки памяти. Они сведены в таблице
5.1.7. При регистровой адресации действия производятся над аккумулятором или над одним из
РОНов. При косвенной и индексной адресации действия производятся над памятью. При
тестировании бита устанавливается флаг Z, если бит, равен нулю. Эта группа содержит 240
команд.
Команды Переходов собраны в таблице 5.1.6. Переход - это ветвление программы, при
котором в счетчик команд PC загружается новый адрес. В команде он представлен абсолютно,
относительно или косвенно. Следует помнить, что условный переход происходит только при
выполнении условия, заданного в команде. Если условие не выполняется, то программа переходит
к команде, следующей за командой перехода. При абсолютной адресации команда содержит адрес
перехода. Такая команда состоит из трех байтов: кода операции, младшего байта адреса и
старшего байта адреса перехода.
При относительной адресации команда состоит из двух байтов. Второй байт - это
расстояние между адресом перехода и текущим состоянием счетчика команд (т.е. смешение).
Смешение может быть от +127 до -126 относительно адреса кода операции команды, следующей
за командой перехода.
При косвенной адресации в командах перехода содержим е регистровой пары HL пли одног
из индексных регистр (IX или IY) прямо загружается в счетчик команд.
Для организации циклов в программе очень удобна команда DJNZ е. Эти двухбайтная
команда перехода уменьшает содержимое регистра B на единицу, и если оно не стало равно нулю,
то происходит переход на смешение e, заданное в команде.
Группа команд перехода не влияет на состояние флагов.
Команды вызова и возврата. Эта группа объединена в таблице 5.1.10.
Команда вызова подпрограммы CALL - это специфическая команда перехода, при которой
МП запоминает адрес команды, следующей за командой CALL. Команда возврата RET
противоположна команде CALL. В ней адрес из стека прямо загружается в счётчик команд, и
осуществляется возврат к прерванной программе. МП имеет две специальные команды возврата:
RETI - возврат из маскируемого прерывания и RETN -возврат из немаскируемого прерывания.
Команда RETI является единственной командой, которая распознается периферийными
микросхемами комплекта Z80. Это необходимо для организации приоритетных прерываний и
нормального возврата из прерываний, поступивших от периферийных схем. Об этом подробно
написано в книге 7 "Построение систем. Программирование. Отладка".
Команды вызова подпрограмм состоят из 3 байтов. Однако, специфические команды
рестарта RST p состоят из одного байта. Фиксированный адрес перехода встроен в код операции
этих команд (см. методы адресации).
Группа команд вызова и возврата не влияет на состояние флагов.
Команды ввода-вывода. Набор команд ввода-вывода представлен в таблице 5.1.9.
Адресация в этих командах может быть непосредственной либо косвенной, но регистру C.
Команды с непосредственной адресацией IN A,(n) и OUT (n),A аналогичны командам
ввода-вывода МП I8080. Но в добавление к адресу порта n, выставляемому в младшую часть
шины адреса, в старшую часть ША подается содержимое аккумулятора. Это позволяет,
предварительно загрузив аккумулятор нужным значением, использовать 16-разридный адрес
ввода-вывода. На флаги эти две команды не влияют.
В командах с косвенной адресацией данные пересылаются между портом адрес которого
загружен в регистр C, и одним из РОНов.
IN г,(С)
OUT (С), г
При этом в старшую часть адреса подается содержимое регистра B, т.е. также может
использоваться 16-разрядный адрес ввода-вывода.
Две команды IN C,(C) и OUT (C),C имеют особенности. В команде вывода регистр C
содержит адрес канала и его же в качестве данник посылает в порт. В команде ввода содержимое
регистра C после ввода из порта замещается принятыми данными.
Команды OUT (C),r не влияют на флаги. Команды ввода IN r,(C) устанавливают флаги Z, S,
P, H в соответствии с принятыми данными и сбрасывают флаг N. Следует уделить команду INF,
которая, воздействуя на регистр флагов, не изменяет состояния РОН.
Косвенная адресация используется также командами ввода-вывода блоков. Они
пересылают данные между портом, адресуемым регистром C, и памятью, адресуемой регистровой
парой HL.
INI ввод и инкремент HL
INIR ввод и инкремент HL до B=0
IND ввод и декремент HL
INDR ввод и декремент HL по B=0
OUTI вывод и инкремент HL
OTIR вывод и инкремент HL до B=0
OUTD вывод и декремент HL
OTDR вывод и декремент HL до B=0
Регистр B здесь используется как двоичный счётчик - он автоматически декрементируется
после пересылки каждого байта (максимально 256). Вместе с тем, содержимое B выдается в
старшую часть ША. Это может быть использовано в случае, когда необходимо выводить данные в
несколько портов с идущими подряд (в старшем байте) 16-разрядными адресами.
Команды ввода-вывода блоков устанавливают Флаги следующим образом:
S неопределён
Z—— 1, если регистр B=0 (выполнение команд заканчивается), иначе Z—0
H неопределён
P/V неопределён
N—1
C не изменяется
Команды управления микропроцессором. Эта группа (таблица 5.1.12) содержит шесть
команд управления.
Команда NOP - это пустая команда, при которой не выполняется никаких действий.
Команда HALT останавливает работу МП до тех пор, пока не будет принят запрос на прерывание.
После выполнения команды HALT МП внутренне генерирует команды NOP, Чтобы производить
регенерацию динамической памяти. Для работы с прерываниями служат команды DI и EI, которые
запрещают и разрешают прерывания соответственно. МП может работать в одном из трёх
режимов, прерывания, которые устанавливаются командами IM 0, IM 1 и IM 2 (подробнее см.
главу 6).