Общие сведения. Количество способов адресации является одним их важнейших показателей эффективности (мощности) системы команд микропроцессора. Под способом адресации будем понимать возможность доступа к подлежащему обработке операнду. Большое число различных способов адресации повышает эффективность программирования и работу самих программ.
В описании каждой команды должны быть указаны адреса места расположения исходных операндов (источников), задействованных при выполнении операции, и адрес места расположения операнда результата операции (приемника). Источниками и приемниками операндов могут служить оперативная и регистровая память или порты ввода-вывода. Адрес, по которому осуществляется доступ к операнду при выполнении команды, называется исполнительным адресом. Известны различные способы формирования исполнительного адреса, позволяющие:
Þобеспечить эффективные доступ к структурированным данным (массивам, стекам, спискам, таблицам) и перемещение программ при загрузке и выполнении;
Þсократить длину программного кода и число обращений к магистрали;
Þадресоваться к большому объему памяти при малой разрядности процессора.
Для формирования исполнительного адреса используются сведения, заложенные в команде. Сведения об адресе операнда могут быть заложены в двух формах: явной и неявной. При явной форме сведения содержаться в адресном поле команды. Эта форма является более гибкой и эффективной, так как позволяет связывать с одной командой множество адресов. Однако ее использование приводит к увеличению длины кода команды. При неявной форме сведений об адресе операнда исполнительный адрес заложен в именной части команды, т. е. место расположения одного или всех операндов определяется мнемоникой команды или кодом операции (OPeration — OP). В этом случае для одной и той же операции с операндами, расположенными в другом источнике или приемнике, необходимо задавать другой код операции. Следовательно, использование неявной формы приводит к увеличению числа команд, выполняющих однотипную операцию. На практике применяются обе формы представления адресной информации. Например, в команде LDA addr МП Z80, выполняющей операцию загрузки аккумулятора содержимым ячейки памяти по указанному адресу, адрес операнда-источника addr задан в явной форме, а адрес приемника ¾ в неявной.
Способы адресации микропроцессора. В микропроцессоре используется пять различных способов адресации. Рассмотрим каждый из них, иллюстрируя на примере загрузки аккумулятора A данными D.
Прямая адресация. При прямом способе адресации младший байт адреса AМ содержится во втором байте команды B2, а старший байт адреса AС— в третьем байте команды B3. Адресный код AСAМ помещается в регистровую пару WZ и выводится на адресную шину через регистр адреса. Этот способ используется для адресации к внешней памяти и устройствам. Его недостаток — большие затраты времени, так как длина команды составляет три байта.
Команда загрузки аккумулятора Aоперандом D, хранящимся в ячейке ОЗУ с адресом AСAМ, исполняется в такой последовательности (рис. 3.1.3):
Þ первый байт команды B1, содержащий код операции КО, загружается в РК;
Þ второй B2 = AМ и третий B3 = AС байты записываются в регистры W и Z;
Þ по выставленному на ША адресу AСAМ данные D из ячейки ОЗУ переписываются в аккумулятор A.
Косвенная адресация. При необходимости многократного обращения к какой-либо ячейке памяти ее адрес удобнее хранить во внутренних регистрах микропроцессора. Для адресации к ячейке в этом случае необходимо указать номер внутреннего регистра, в котором хранится адрес. Такая адресация называется косвенной. Для хранения 16-разрядных адресов используются регистровые пары BC, DE, HL и указатель стека SP. Пары кодируются (BC ® 00, DE ® 01, HL ® 10, SP ® 11). Код регистровой пары RP размещается в адресной части однобайтных команд, которые выбираются за один машинный цикл и поэтому требуют меньше временных затрат. Исполнение той же операции загрузки аккумулятора данными D из ячейки ОЗУ с адресом AСAМ (хранящимся в регистровой паре DE) показано на рис. 3.1.4.
Непосредственная адресация. При этом способе адресации не требуется указания какого-либо адреса для обращения к памяти, так как подлежащие обработке данные размещаются во втором или втором и третьем байтах команды при составлении программы. На рис. 3.1.5 показана загрузка аккумулятора А вторым байтом B2 = D.
Регистровая и косвенно-регистровая адресация. Если подлежащие обработке данные размещены во внутренних регистрах микропроцессора, то для адресации к ним достаточно указать двоичные коды R регистров (табл. 3.1.1) в первом байте команды. К внутренним регистрам помимо РОН отнесены также аккумуляторА и ячейка внешней памяти M, адрес которой хранится в регистровой паре HL.
Таблица 3.1.1
Регистр
B
C
D
E
H
L
A
M
Код
Обращение к регистрам B, C, D, E, H, L, Aназывается регистровой адресацией, а к ячейке М — косвенно-регистровой адресацией. Использование обоих видов регистровой адресации для загрузки аккумулятораА данными D, хранящимися в регистре C и ячейке M с адресом AСAМ, проиллюстрировано на рис. 3.1.6.
Стековая адресация. При стековой адресации текущий адрес ячейки памяти хранится в указателе стека. Этот способ адресации является косвенным и отличается от ранее рассмотренных тем, что необходимость обращения к указателю стека следует непосредственно из кода операции команд работы со стеком.
Система команд микропроцессора
Общие сведения. Команда предписывает шаги по реализации микропроцессором заданной операции. Она содержит указание операции, адрес операндов и различные служебные признаки. Фиксированный набор команд конкретного микропроцессорного комплекта называют системой команд. Длина команды кратна длине слова данных, равного для рассматриваемого микропроцессора одному байту, и может составлять один, два или три байта. Назначение отдельных разрядов (битов) команды оговаривается заранее. Команды микропроцессора имеют поля, которые определяют тип команды, ее длину, подлежащую выполнению операцию, адрес внутреннего регистра или ячейки внешней памяти, где хранятся операнды.
В командах микропроцессора 580-й серии первый байт B1 содержит код операции, второй B2 и третий B3 байты — адреса или операнды. В однобайтных командах часть бит отводится под адрес. Базовая система команд микропроцессора КР580ВМ80А включает 78 команд. Команды классифицируются по функциональному признаку и сводятся в таблицу. Из таблицы можно почерпнуть следующую информацию о команде: мнемоническое обозначение, код команды, код операции (первый байт команды), словесное и символьное описание выполняемой командой операции, число байтов в команде, число циклов и тактов выполнения команды, сведения о воздействии команды на биты регистра признаков.
Состав и назначение команд. Набор команд и способов адресации позволяет выполнить разнообразные арифметические и логические операции, операции пересылки, ввода и вывода информации, организовать передачу управления внутри программы и между программами и другие операции. Набор команд по функциональному назначению можно разбить на пять групп.
К о м а н д ы п е р е с ы л к и д а н н ы х . Эти команды реализуют пересылку операндов от источника к приемнику, которыми могут служить внутренние регистры микропроцессора, внешние память и устройства.
Команды этой группы сведены в табл. 1 и позволяют осуществить:
- пересылку данных между внутренними регистрами А,B,C,D,E,H (сюда же отнесена ячейка памяти M) с помощью команды 1.Допускается любая комбинация Ri, Rj (i, j=0,1,2,...,7) за исключением R6, R6, т.е. перезагрузка ячейки памяти М не разрешается. Код команды 01RiRj, где Ri — приемник операндов, Rj—источник. Поэтому операцию пересылки записывают в виде RiRj;
- загрузку регистров A,B,C,D,E,H,L и ячейки M вторым байтом B2 (команда 2) и регистровых пар BC, DE, HL (в том числе указателя стека SP) вторым B2 и третьим B3 байтами (команда 3), причем всегда B3 загружается в старшие регистры (B, D, H) пары, B2 — в младшие регистры (C, E ,L);
- пересылку данных между аккумулятором А и внешней памятью ВП (команды 4¸7), между аккумулятором и внешним устройством (команды 8, 9). При пересылке между А и ВП адреса ячеек памяти располагаются в регистровых парах BC, DE или во втором и третьем байтах команды B3B2;
Табл. 1
- пересылку данных между парой регистров HL и памятью (команды 10, 11). При этом операнд из регистра L пересылается в ячейку с адресом B3B2, образованным из третьего и второго байта команды , а из регистра H — по адресу на единицу больше. При обратной пересылке сначала из ячейки с адресом B3B2 в регистр L загружается первый операнд, затем из ячейки с адресом B3B2+1 в регистр H — второй;
- пересылку данных между парами регистров, включая пару из аккумулятора А и регистра признаков РП, и стеком (команды 12, 13). При записи в стек содержимое указателя стека уменьшается на единицу, и по адресу SP–1 загружается первый операнд из регистра H (B, D, A), затем содержимое указателя стека снова уменьшается на единицу, и по адресу SP–2 загружается второй операнд из регистра L (E, C, РП). При выводе из стека сначала загружается регистр L (E, C, РП) операндом, хранящимся в ячейке с адресом SP указателя стека, затем содержимое увеличивается на единицу, из ячейки с адресом SP+1 второй операнд загружается в регистр H (B, D, A), и содержимое указателя стека вновь увеличивается на единицу и принимает значение SP+2.Следует отметить, что при загрузке регистрой пары А,РП (ее код RP=11) из стека изменяется состояние триггеров РП. Это единственная команда (из всех команд пересылки данных), которая влияет на признаки;
- пересылку содержимого пары регистров HL в указатель стека SP и программный счетчик PC (команды 14, 15);
- обмен данными между парами регистров HL и DE, парой регистров HL и стеком (команды 16, 17). При обмене содержимое регистровой пары HL помещается в пару DE или стек, а содержимое регистровой пары DE или стека — в пару HL. Операция обмена обозначается символом "«".
К о м а н д ы а р и ф м е т и ч е с к и х о п е р а ц и й . Вычислительные возможности микропроцессора ограничены простыми командами сложения и вычитания 8-разрядных операндов. Операции умножения и деления реализуются программным способом. Набор команд (табл. 2) позволяет выполнить:
Табл. 2
- сложение и вычитание 8-разрядных операндов с учетом и без учета переноса (команды 1¸8), при этом один из операндов всегда находится в аккумуляторе, а второй — в одном из регистров РОН или является вторым байтом команды. Команды, учитывающие значение сигнала переноса C триггера признаков, используются при сложении и вычитании многобайтных чисел. Для этой же цели можно использовать команду 9 сложения содержимого пары регистров HL с 16-разрядным адресуемым регистром;
- арифметическое сравнение содержимого аккумулятора А с содержи- мым одного из РОН Ri или вторым байтом В2 (команды 10¸11). При этом выполняется вычитание А–Ri или А–B2. Результат сравнения определяется по сигналам триггеров регистра признаков: если Z=1, то A=Ri или A=B2; если C=1, тоA<Ri или A<B2. Содержимое аккумулятора не изменяется;
- увеличение и уменьшение на 1 содержимого регистров и регистровых пар.При программировании часто возникает необходимость увеличения или уменьшения на единицу значения операнда. Для этого можно использовать операции сложения A+B2 или вычитания A–B2, записав в программе B2=1. Однако в системе команд предусмотрены специальные команды (12¸15) инкремента и декремента 8- и 16-разрядных операндов;
- десятичную коррекцию содержимого аккумулятора после выполнения арифметических операций в двоично-десятичном коде 8421. При этом содержимое аккумулятора представляется в виде двух полубайтов, каждый из которых соответствует десятичной цифре. Коррекция производится с учетом сигналов дополнительного переноса V и переноса C по правилу: если V = 1 (или значение младшего полубайта превышает 9), то к содержимому аккумулятора прибавляется двоичное число 0110 (десятичное 6); если C=1 (или значение старшего полубайта превышает 9), то 0110 добавляется к старшему полубайту.
К о м а н д ы л о г и ч е с к и х о п е р а ц и й . Команды (табл. 3) позволяют реализовать:
Табл. 3
- операции И, исключающее ИЛИ, ИЛИ над 8-разрядными операндами (команды 1¸6). Логические операции являются поразрядными и выполняются независимо для каждого из восьми бит операндов. Неадресуемый операнд находится в аккумуляторе, туда же поступает результат операции. Вторым операндом является содержимое одного из РОН или второй байт команды;
- инвертирование содержимого аккумулятора А и сигнала C триггера переноса регистра признаков (команды 11, 12);
- два вида циклических сдвигов содержимого аккумулятора влево и вправо в соответствии с рис. 1 (команды 7¸10). Первый вид сдвигов (сдвиги без переноса) реализуется путем замыкания в кольцо триггеров аккумулятора, при втором виде сдвигов (сдвиги с переносом) в кольцо дополнительно вводится триггер переноса C регистра признаков.
К о м а н д ы п е р е д а ч и у п р а в л е н и я . Следует выделить три вида передачи управления: переход по заданному адресу, вызов подпрограммы и возврат из подпрограммы. Они подразделяются на безусловные и условные. Рассмотрим особенности команд, представленных в табл. 4.
Табл. 4
С помощью трехбайтной команды JMP реализуется безусловная передача управления. При этом второй и третий байты команды, указывающие адрес продолжения программы, заносятся в счетчик команд PC (содержимое В3 в старшие разряды, В2 — в младшие).
Табл. 5
Команды условной передачи управления J** реализуют разветвление вычислительного процесса в зависимости от условия, задаваемого значением сигнала одного из четырех триггеров Z, C, S, P. Возможно 8 признаков для выполнения условия (табл. 5), каждый из которых имеет свое мнемоническое обозначение и код. Обозначение признака входит в состав мнемонического обозначения команды вместо звездочек (**). Это касается всех условных команд. Так, например, признаку NC, для которого условия перехода считаются выполненными при С=0, соответствует команда JNC. При выполнении условия в счетчик PC заносится второй и третий байты команды, в противном случае содержимое счетчика увеличивается на 3 единицы. Продолжение программы осуществляется по адресу, находящемуся в счетчике команд, т.е. со следующей команды.
Команды безусловного (CALL) и условного (С**) вызовов используются для обращения к подпрограммам, хранящимся вне рабочей зоны основной памяти. Эти команды всегда предусматривают возможность возврата в прерванную основную программу. Для этого при передаче управления вначале в стек заносится содержимое программного счетчика (при этом содержимое указателя стека уменьшается на 2 единицы), а затем:
- при выполнении условия второй и третий байты команды заносятся в программный счетчик;
- при невыполнении условия содержимое программного счетчика увеличивается на 3 единицы.
Продолжение программы осуществляется по адресу, находящемуся в счетчике команд.
В наборе имеются команды, позволяющие реализовать безусловную (RET) и условную (R**) передачу управления для возврата в прерванную программу. При выполнении этих команд адрес возврата переписывается из стека в программный счетчик, содержимое указателя стека увеличивается на 2 единицы. При невыполнении условия возврата (для команды с условием) осуществляется переход к очередной команде путем увеличения на единицу содержимого программного счетчика. Команды возврата являются однобайтными, так как в указателе стека хранится адрес ячейки стека с адресом возврата в прерванную программу.
К о м а н д ы у п р а в л е н и я м и к р о п р о ц е с с о р о м . Команды этой группы (табл. 6) используются для задания режима работы микропроцессора. Команда RST используется для повторного пуска микропроцессора и при обслуживании прерываний (см. стр. 128). При ее выполнении:
- содержимое программного счетчика переносится в стек по адресам SP–1, SP–2, формируемым в указателе стека, что обеспечивает возврат к основной программе;
- в программный счетчик засылается 16-разрядный адрес (см. табл. 6) начала одной из 8 программ обслуживания прерывания.
Табл. 6
Командой STC производится установка сигнала С=1 на выходе триггера переноса. Команда разрешения прерывания EI устанавливает триггер INTE разрешения прерываний в единичное состояние, при этом микропроцессор реагирует на запросы прерываний. Команда запрещения прерываний DI устанавливает триггер INTE в нулевое состояние. Пустая команда NOP используется в циклах программируемой задержки. Команда останова HLT вызывает прекращение выполнения программы.