Общие сведения о системе команд.
Фиксированный набор команд конкретного микропроцессора называют системой команд. Функциональные способности процессора определяются совокупностью базовых команд с различными кодами операций. Общее число команд (кодов операции) в системе всегда больше числа базовых команд. Например, к базовой команде относится команда
MOV dst, scr,
которая обеспечивает функцию пересылки данных из источника
scr
в приемник
dst.
Таких команд в системе может быть очень много. Система команд представляется в виде таблицы. Таблица может иметь различную структуру, однако обычно содержит следующие сведения о команде:
? мнемоническое обозначение команды, представляющее собой сокращенную запись названия команды. Для этого используются три–четыре латинские буквы названия операции, выполняемой командой. Мнемоника является удобной формой представления кода операции команды. Кроме того, она используется при описании команды на языке ассемблера. Программа ассемблера преобразует мнемоническое обозначение кодов операции в соответствующие двоичные эквиваленты;
? шестнадцатеричные коды команд;
? влияние выполненной команды на флаги регистра слова состояния программы;
? число байтов в команде и число машинных циклов и такте, затрачиваемых на выполнение команды;
? словесное и (или) символьное описание выполняемой командой операции. Часто для удобства систему команд разбивают на отдельные группы по функциональному признаку. Например систему команд микропроцессора:
? КР580ВМ80, содержащую 78 базовых команд, разбивают на пять групп: пересылки, логической обработки, арифметической обработки, передачи управления и управления процессором,
? К1810
B
М86, содержащую 113 базовых команд, разбивают на шесть групп: пересылки, логической обработки, арифметической обработки, обработки строк, передачи управления и управления процессором. Ниже на примере процессоров КР580ВМ80 приведено краткое описание функциональных особенностей команд каждой группы.
Система команд 8–разрядных процессоров.
Рассмотрим систему команд 8–разрядного процессора 8080, в которую входит 78 базовых команд, содержащих 111 кодов операций.
Команды имеют длину от 1 до 3 байт. Код операции всегда размещен в первом байте команды. Второй байт команды отводится под непосредственный операнд или адрес порта, второй и третий байты являются адресом ячейки памяти. Команды допускают явное задание только одного адреса памяти, т. е. относятся к классу одноадресных команд.
При описаний–команд используются следующие обозначения:
?
src
,
dst
— 8–разрядные источник и приемник. Источником или приемником может быть один из 8–разрядных регистров А, В, С,
D, E,
Н или ячейка памяти М, доступ к которой обеспечивает регистровая пара
HL
, содержащая адрес пересылаемого байта. В коде операции источник
src
и приемник
dst
указаны в виде трехразрядного кода
SSS
и
DDD
;
?
RP
— двухразрядный код регистровых пар ВС,
DE, HL,
А + РП (регистр признаков) или указателя стека
SP;
?
data, data16
— 8– и 16–разрядный операнд;
?
addr
,
port
— 16–разрядный адрес памяти и 8–разрядный адрес порта;
? (
addr
), (
SP
) — содержимое ячейки памяти по указанным адресам;
? (
SP
)+, –(
SP
) — операции постинкремента и предекремента со стеком, описание которых приведено в параграфе 2.6.
Система команд разбивается на пять функциональных групп. Рассмотрим особенности команд каждой группы.
Команды пересылки.
Группа содержит наиболее часто встречающиеся в программах команды пересылки данных, источниками и приемниками которых могут быть внутренние регистры процессора, основная память и внешние устройства. Команды не оказывают воздействий на флаги регистра состояния. Мнемоника команды отражает особенности выполняемой операции и способ переадресации. Например, мнемоника
MOV, MVI
указывает на перемещение (
Move
) операндов;
LDA
,
LDAX
,
LXI
,
LHLD
— на загрузку (
Load
);
STA,
STAX
,
SHLD
— на сохранение (
Save
).
Для операций с байтами используется мнемоника
MOV
,
MVI
,
LDA, STA, LDAX, STAX;
для операций со словами —
LXI, LHLD, SHLD.
Прямая адресация при загрузке и сохранении содержимого аккумулятора отражается мнемоникой
LDA
и
STA,
косвенная — мнемоникой
LDAX
и
STAX.
Примечание:
ВР — двухразрядный код регистровых пар ВС,
D
Е, Н
L
, А + РП (регистр признаков) или указателя стека
S
Р.
Команды этой группы сведены в табл. 2.8.1 и позволяют осуществить:
? операцию пересылки данных между источником (
src
) и приемником (
dst
), которая записывается в виде
dst
<—
src
(команда 1). Источниками и приемниками являются внутренние регистры общего назначения (А, В, С,
D
, Е, Н) и ячейка памяти
M
. Допускается любая комбинация и за исключением М <—
M
, т. е. перезагрузка ячейки памяти М не разрешается;
? загрузку регистров общего назначения и ячейки М вторым байтом В2 (команда 2) и регистровых пар ВС,
D
Е,
HL
(в том числе указателя стека
S
Р) вторым В2 и третьим ВЗ байтами (команда 3), причем всегда ВЗ загружается в старшие регистры (В,
D
, Н) пары, В2 — в младшие регистры (С, Е ,
L
);
? пересылку данных между аккумулятором А и основной памятью (команды 4–7), между аккумулятором и внешним устройством (команды 8, 9). При пересылке между аккумулятором А и памятью адреса ячеек памяти располагаются в регистровых парах ВС,
D
Е или в третьем и втором байтах ВЗВ2 команды;
? пересылку данных между парой регистров
HL
и памятью (команды 10, 11). При этом операнд из регистра
L
пересылается в ячейку с адресом ВЗВ2, образованным из третьего и второго байта команды, а из регистра Н — по адресу на единицу больше. При обратной пересылке сначала из ячейки с адресом ВЗВ2 в регистр
L
загружается первый операнд, затем из ячейки с адресом ВЗВ2 + 1 в регистр Н — второй;
? пересылку
данных между парами регистров, включая пару из аккумулятора А и регистра признаков РП, и стеком (команды 12, 13). При записи в стек содержимое указателя стека уменьшается на единицу, и по адресу
S
Р – 1 загружается первый операнд из регистра В,
D
,
Н или А, затем содержимое указателя стека снова уменьшается на единицу, и по адресу
S
Р – 2 загружается второй операнд из регистра С, Е,
L
или РП. При выводе из стека сначала загружается регистр С, Е,
L
или РП операндом, хранящимся в ячейке с адресом
S
Р указателя стека. Затем содержимое увеличивается на единицу, из ячейки с адресом
S
Р + 1 второй операнд загружается в регистр В,
D
,
Н или А, и содержимое указателя стека вновь увеличивается на единицу и принимает значение
S
Р + 2.
Следует отметить, что при загрузке регистровой пары А, РП (ее код
R
Р = 11) из стека изменяется состояние триггеров регистра признаков РП. Это единственная команда (из всех команд пересылки данных), которая влияет на признаки;
? пересылку
содержимого пары регистров Н
L
в указатель стека
S
Р и программный счетчик РС (команды 14, 15);
? обмен
данными между парами регистров Н
L
и
D
Е, парой регистров Н
L
и стеком (команды 16, 17). При обмене содержимое регистровой пары Н
L
помещается в пару
D
Е или стек, а содержимое регистровой пары
D
Е или стека — в пару Н
L
. Операция обмена обозначается символом «↔».
Арифметические команды.
Вычислительные возможности микропроцессора ограничены простыми командами сложения и вычитания 8–разрядных операндов. Операции умножения и деления реализуются программным способом.
Набор команд (табл. 2.8.2) позволяет выполнить:
?
сложение и вычитание 8–разрядных операндов с учетом и без учета переноса (команды 1–8), при этом один из операндов всегда находится в аккумуляторе, а второй — в одном из регистров общего назначения (ячейке памяти М) или является вторым байтом команды. Команды, учитывающие значение сигнала переноса С регистра прививков, используются при сложении и вычитании многобайтных чисел. Для этой же цели можно использовать команду 9 сложения содержимого пары регистров Н
L
с 16–разрядным адресуемым регистром;
?
арифметическое сравнение содержимого аккумулятора А с содержимым одного из регистров общего назначения
Rn
(ячейкой памяти М) или вторым байтом В2 (команды 10–11). При этом выполняется вычитание А –
Rn
или А – В2. Результат сравнения определяется по сигналам триггеров регистра признаков: если
Z
=
1, то А =
Rn
или А = В2; если
S
=1, то А >
Rn
или А > В2. Содержимое аккумулятора не изменяется;
? увеличение
и уменьшение на 1 (инкремент и декремент) содержимого регистров и регистровых пар. При программировании часто возникает необходимость увеличения или уменьшения на единицу значения операнда. Для этого можно использовать операции сложения А + В2 или вычитания А – В2, записав в программе В2 = 1. Однако в системе команд предусмотрены специальные команды (12–15) инкремента и декремента 8– и 16–разрядных операндов;
? десятичную коррекцию
содержимого аккумулятора после выполнения арифметических операций в двоично–десятичном коде 8421 (команда 16). При этом содержимое аккумулятора представляется в виде двух полубайтов, каждый из которых соответствует десятичной цифре. Коррекция производится блоком десятичной коррекции по правилам.
Команды логических операций (табл. 2.8.3). Команды этой группы позволяют реализовать:
?
двуместные логические операции умножения (И), сложения (ИЛИ) и исключающее ИЛИ над 8–разрядными операндами (команды 1–6). Логические операции являются поразрядными и выполняются независимо для каждого из восьми бит операндов. Неадресуемый операнд находится в аккумуляторе, туда же поступает результат операции. Вторым операндом является содержимое одного из регистров общего назначения (ячейки памяти М) или второй байт команды;
? инвертирование
содержимого аккумулятора А (команда 7);
?
флаговые команды (8, 9) инвертирования и установки бита С триггера переноса регистра признаков;
?
два вида циклических сдвигов содержимого аккумулятора влево и вправо (команды 10–13). Первый вид сдвигов (сдвиги без переноса) реализуется путем замыкания в кольцо всех триггеров аккумулятора, при втором виде сдвигов (сдвиги с переносом, или расширенные сдвиги) в кольцо дополнительно вводится триггер переноса С регистра признаков. Отсутствующие в системе команд логические и арифметические сдвиги в обе стороны можно реализовать предварительной установкой бита С в 0 или 1 совместно с расширенным сдвигом.
Команды передачи управления.
При передаче управления нарушается последовательный ход выборки содержимого ячеек памяти и процессор адресуется в другую область памяти. Следует выделить три вида команд передачи управления: команды перехода по заданному адресу (
JMP
), вызова подпрограммы (
CALL
) и возврата из подпрограммы
(RET).
К ним относятся безусловные и условные команды. Условные команды осуществляют переход, вызов подпрограммы и возврат из подпрограммы в зависимости от состояния флага, задаваемого значением сигнала одного из четырех триггеров
Z,
С,
S,
Р регистра признаков (или состояния).
В процессоре 8080 используются оба состояния (1 и 0) четырех флагов
(Z,
С, Р,
S),
позволяющих получить 8 вариантов каждой команды (табл. 2.8.4). Обозначение признака (условия) указывается в мнемонике условных команд
J**,
С**,
R**
вместо звездочек (**). Например, признаку
NC,
для которого условия перехода считаются выполненными при С = 0, соответствует команда
JNC.
В операциях как условного, так и безусловного перехода и вызова подпрограмм используется полный прямой 16–разрядный адрес, обеспечивающий передачу управления в любую точку 64К–байтовой области пространства памяти.
Рассмотрим особенности команд, представленных в табл. 2.8.5.
С помощью трехбайтной команды
JMP
реализуется безусловная передача управления. При этом второй и третий байты команды (адрес
addr
продолжения программы) заносятся в счетчик команд РС (содержимое ВЗ в старшие разряды, В2 — в младшие).
Команды условной передачи управления
J
** реализуют разветвление вычислительного процесса в зависимости от условия. При выполнении условия (ДА) в счетчик РС заносится второй и третий байты команды, в противном случае (НЕТ) содержимое счетчика увеличивается на 3 единицы. Продолжение программы осуществляется по адресу, находящемуся в счетчике команд, т. е. со следующей команды.
Команды безусловного (СА
LL
) и условного (С**) вызовов используются для обращения к подпрограммам, хранящимся в другой части основной памяти. Эти команды всегда предусматривают возможность возврата в прерванную основную программу путем сохранения в стеке содержимого программного счетчика РС, для чего используется предекрементный способ адресации. После этой операции:
? при безусловном вызове или выполнении условия второй и третий байты команды заносятся в программный счетчик РС;
? при невыполнении условия содержимое программного счетчика увеличивается на 3 единицы.
Продолжение программы осуществляется по адресу, находящемуся в счетчике команд РС.
В наборе имеются команды, позволяющие реализовать безусловную (
RET
) и условную (
R
**) передачу управления для возврата в прерванную программу. При выполнении этих команд адрес возврата переписывается из стека в программный счетчик РС, для чего используется постинкрементный способ адресации. При невыполнении условия возврата (для команды с условием) осуществляется переход к очередной команде путем увеличения на единицу содержимого программного счетчика РС.
Команды возврата являются однобайтными, так как в указателе стека
S
Р хранится адрес ячейки стека с адресом возврата в прерванную программу.
Команда РСН
L
, загружает в программный счетчик РС адрес, хранящийся в регистровой паре
HL
.
Команды общего управления.
Команды этой группы (табл. 2.8.6) используются для задания режима работы микропроцессора. Команда
RST
используется для повторного пуска микропроцессора и при обслуживании прерываний. При ее выполнении:
? содержимое программного счетчика переносится в стек по адресам
S
Р – 1,
S
Р – 2, формируемым в указателе стека, что обеспечивает возврат к основной программе;
? в программный счетчик засылается 16–разрядный адрес начала одной из 8 программ обслуживания прерывания.
Команда разрешения прерывания
EI
устанавливает триггер
INTE
разрешения прерываний в единичное состояние, при этом микропроцессор реагирует на запросы прерываний. Команда запрещения прерываний
DI
устанавливает триггер
INTE
в нулевое состояние. Пустая команда
NOP
используется в циклах программируемой задержки. Команда останова
HLT
вызывает прекращение выполнения программы.