Система команд ВМ80
В МП ВМ80 применяется довольно простой формат команд, приведенный на рис. 2.3. Команды имеют длину от 1 до 3 байт. Код операции всегда размещен в первом байте команды. Второй и, если необходимо, третий байты команды отводятся под непосредственные данные, адрес порта или ячейки памяти. В командах допускается явное задание только одного адреса памяти. По этой причине систему команд МП следует отнести к классу одноадресных.
Рис. 2.3. Формат команд микропроцессора ВМ80:
а—однобайтовый; б—двухбайтовый; в—трехбайтовый
Система команд МП [11, 16] состоит из пяти групп: пересылки (14 команд, 28 операций), логической обработки (15 команд, 19 операций), арифметической обработки (14 команд, 29 операций), передачи управления (28 команд, 28 операций), управления процессором (7 команд, 7 операций). Всего в систему входят 78 базовых команд, содержащих 111 кодов операций. Их полный состав представлен в табл. 2.1—2.5. Наряду с мнемоникой и кодом операции (первый байт команды) таблицы содержат такие важнейшие для команд характеристики, как число обращений к системной магистрали и число периодов основной тактовой частоты, составляющих ее полный командный цикл. Здесь же представлена информация о влиянии команды на флажки регистра признаков F. При знаке «+» производится установка соответствующего флажка в зависимости от результата операции, знак «–» означает, что команда не влияет на него и, следовательно, оставляет без изменения. Длина команды в байтах легко определяется из ее мнемоники.
В условных командах число обращений к каналу и длительность машинного цикла в тактах зависят от выполнения условия. В таблицах указаны два значения невыполнения и выполнения условия.
Система команд МП ВМ80 в полном составе входит в систему команд МП К1821ВМ85А (ВМ85А) [65], обеспечивая их совместимость на уровне объектного кода. Они отличаются друг от друга лишь числом периодов основной тактовой частоты, необходимым для исполнения той или иной команды. По этой причине в таблицах даны два значения длительности командного цикла: одно для ВМ80, другое для ВМ85А. Кроме того, в табл. 2.5 введены две команды, не поддерживаемые архитектурой ВМ80. Это расширение системы команд ВМ85А по сравнению с ВМ80.
В мнемонике команд использованы следующие обозначения:
src 8-разрядный регистр-источник
dst 8-разрядный регистр-приемник
data 8-разрядный литерал
data16 16-разрядный литерал
addr 16-разрядный адрес памяти
port 8-разрядный адрес порта
n Цифра от 0 до 7
Поля src и dst означают один из 8-разрядных регистров А, В, С, D, Е, Н или L. Для получения правильного кода операции следует в соответствующее поле кода записать двоичный код регистра согласно правилу
Регистр B C D E H L A
Код 000 001 010 011 100 101 111
Таблица 2.1
Мнемоника | Код | Число циклов ВМ80 | Число тактов | Флажки | Содержание | |
BM80 | BM85A | C Z M P А Y С | ||||
MOV dst, src | O1DDDSSS | – – – – – | dstsrc | |||
MOV dst, M | O1DDD11O | – – – – – | dst(HL) | |||
MOV M, src | O111OSSS | – – – – – | (HL)src | |||
MVI dst, data | OODDD110 | – – – – – | dstdata | |||
MVI M, data | – – – – – | (HL)data | ||||
LDA addr | 3A | – – – – – | A(addr) | |||
STA addr | – – – – – | (addr)A | ||||
LDAX В | 0A | – – – – – | A(ВС) | |||
LDAX D | 1A | – – – – – | A(DE) | |||
STAX В | – – – – – | (ВС)A | ||||
STAX D | – – – – – | (DE)A | ||||
LXI B, data16 | – – – – – | ВСdata16 | ||||
LXI D, data16 | – – – – – | DEdata16 | ||||
LXI H, data16 | – – – – – | HLdata16 | ||||
LXI SP, data16 | – – – – – | SPdata16 | ||||
LHLD addr | 2A | – – – – – | HL(addr) | |||
SHLD addr | – – – – – | (addr)HL | ||||
SPHL | F9 | – – – – – | SPHL | |||
PUSH S | C5 | – – – – – | –(SP)ВС | |||
PUSH D | D5 | – – – – – | –(SP)DE | |||
PUSH H | E5 | – – – – – | –(SP)HL | |||
PUSH PSW | F5 | – – – – – | –(SP)PSW | |||
POP В | С1 | – – – – – | ВС(SP)+ | |||
POP D | D1 | – – – – – | DE(SP)+ | |||
POP H | Е1 | – – – – – | HL(SP)+ | |||
POP PSW | F1 | + + + + + | PSW(SP)+ | |||
XCHG | ЕВ | – – – – – | DE«HL | |||
XTHL | E3 | – – – – – | (SP)«HL |
Представленная в табл. 2.1 группа содержит команды обмена между памятью и регистрами. Это наиболее часто встречающиеся в программах команды, которые занимают около 45% их общего числа. Группа команд пересылки никакого воздействия на флажковый регистр не оказывает, за исключением тех команд, которые используют флажковый регистр в качестве приемника данных.
Основу группы составляют следующие команды:
MOV, MVI Перемещение
LDA, LDAX, LXI, LHLD Загрузка
STA, STAX, SHLD Сохранение
Эти команды оперируют как байтами MOV, MVI, LDA, STA, LDAX, STAX, так и словами LXI, LHLD, SHLD.
В командах пересылки байтов поля src и dst используются для указания 8-разрядных регистров A, B, C, D, E, H, L, а М обозначает косвенную адресацию через регистровую пару HL, которая должна содержать прямой адрес байта, участвующего в обмене. В составе команд также находятся операции загрузки аккумулятора с прямой (LDA) и косвенной (LDAX) адресацией через регистровые пары BC и DE, а также их обратные эквиваленты (STA, STAX). С учетом значимости 16-разрядного регистра Н в составе группы предусмотрены операции загрузки LHLD и хранения SHLD его содержимого по прямому адресу. Команды MVI и LXI используют непосредственную адресацию, обеспечивающую загрузку 8- и 16-разрядного регистра или байта памяти некоторой константой.
Для начальной установки регистра SP предусмотрены две команды:
LXI SP, data16 ;SPdata16
SPHL ;SPHL
Если первая команда обеспечивает прямую загрузку SP константой, то с помощью второй можно организовать установку SP в соответствии со значением некоторой переменной. Такая операция удобна при реализации нескольких стеков.
Команды PUSH и POP организуют запись в стек и выборку из нее содержимого 16-разрядных регистров B, D, H или PSW. Благодаря этим операциям создается удобный механизм сохранения и восстановления текущего контекста регистровой области или ее части для передачи параметров через стек, а также для выполнения других важных при программировании функций. Системный стек растет в сторону уменьшения адресов, а его указатель всегда адресует последний элемент стека или его вершину TOS.
В составе группы две команды обмена:
XCHG ;DE«HL
XTHL ;(SP)«HL
Они обеспечивают обмен между регистровой парой HL и регистровой парой DE или вершиной стека TOS. Первая операция позволяет использовать содержимое 16-разрядного регистра DE практически с тем же результатом, что и содержимое пары HL. Вторая поддерживает прямой доступ к TOS, что в ряде случаев очень важно. В тех ситуациях, когда TOS содержит адрес возврата, команда XTHL дает возможность доступа к нему с целью модификации. Если применяется механизм передачи параметров через линейную область, т. е. параметры следуют непосредственно за командой вызова CALL, команда XTHL обеспечивает простую настройку на область параметров, их выборку и модификацию адреса возврата в соответствии с длиной области. Важно то, что все эти операции выполняются без потери содержимого HL.
Команда XTHL используется также для получения текущего состояния PC, например при организации относительной адресации. Фрагмент такого доступа имеет вид
CALL M1 ;–(SP)M1, РСМ1
M1: XTHL ;HL«(SP)
В данном случае HL получает значение метки М1, которое далее может быть употреблено произвольно. Иногда требуется произвести обмен между вершиной стека и регистром D, осуществляемый с помощью следующей последовательности:
XCHG ;DE«HL
ХТНL ;HL«(SP)
XCHG ;DE«HL
В системе команд отсутствует важная операция загрузки литерала в стек. Однако процедуру такого рода легко выполнить в виде
LXI H, data16 ;HLdata16
PUSH Н ;–(SP)HL
Для сохранения содержимого HL можно использовать фрагмент
PUSH Н ;–(SP)HL
LXI H, data16 ;HLdata16
XTHL ;(SP)«HL
Группа команд логической обработки приведена в табл. 2.2. В ее составе четыре двухместных логических операции над байтами:
ANA, ANI Логическое И
XRA, XRI Исключающее ИЛИ
ORA, ORI Логическое ИЛИ
СМР, СРI Сравнение
Таблица 2.2
В этих командах в качестве источника одного из операндов используют аккумулятор А, который одновременно служит и приемником результата. Источником второго операнда является либо 8-разрядный регистр, кодируемый полем src, либо ячейка памяти, адресуемая парой HL, либо константа, заданная непосредственно в команде. Все команды влияют на флажки признаков результата, входящие в состав флажкового регистра. Заметим, что операция сравнения выполняется методом арифметического вычитания. По этой причине ее следовало бы отнести к группе арифметических команд.
Предусмотрена еще одна типовая логическая операция—логическое дополнение или инверсия СМА, которая работает только с неявно адресуемым аккумулятором. Особенность команды состоит в том, что она не влияет не состояние флажкового регистра.
Две команды STC и CMC дают возможность манипулировать флажком CY, устанавливая или инвертируя его. Сброс флажка может быть выполнен командой
ORA А ;АА OR А
При этом следует помнить, что состояние других флажков также изменяется.
Обычно в состав логических команд включают также и подгруппу сдвигов. В системе команд ВМ80 четыре команды сдвига: две вправо (RRC, RAR) и две влево (RLC, RAL). Определены операции циклического RRC, RLC и расширенного RAR, RAL сдвигов. В операциях участвует только флажок переноса CY, который всегда принимает значение выходного бита. Предварительная установка CY в 0 или 1 совместно с расширенным сдвигом дает возможность организовать отсутствующие в системе команд логические и арифметические сдвиги в обе стороны.
Группа команд арифметической обработки (табл. 2.3) осуществляет эффективную обработку числовой информации. В группе определены:
ADD, ADC, ADI, ACI, DAD Сложение
SUB, SBB, SUI, SBI Вычитание
INR, INX Увеличение на 1
DCR, DCX Уменьшение на 1
DAА Десятичная коррекция
Таблица 2.3
Предусмотрены операции как над байтами ADD, ADC, ADI, ACI, SUB, SBB, SUI, SBI, INR, DCR, DAA, так и над словами DAD, INX, DCX.
Во всех байтовых операциях сложения и вычитания используется аккумулятор как источник операнда и приемник результата. В качестве источника второго операнда применяется либо регистр src, либо ячейка памяти М, либо литерал data. В некоторых операциях (ADC, ACI, SBB и SBI) предусмотрен учет состояния флажка CY. В команде сложения DAD роль аккумулятора выполняет 16-разрядный регистр Н, содержимое которого складывается с содержимым одного из 16-разрядных регистров В, D, Н или SP. Эта команда очень важна при организации таблиц и списков. Следует отметить, что команда DAD оказывает влияние только на флажок CY.
Очень полезны операции увеличения и уменьшения на единицу. С их помощью довольно просто реализовать счетчики, часто необходимые в практике программирования. Операции применимы к 8- и к 16-разрядным регистрам, включая SP. Возможна также модификация байтовой ячейки памяти, адресуемой регистром HL.
Во многих МС предусмотрены специальные средства для работы с десятичными числами. Обработка числовых данных непосредственно в десятичной форме очень часто применяется в системах с десятичным ВВ, так как не требуется их промежуточного преобразования в двоичный формат и обратно. Для хранения десятичных чисел в памяти МС используется двоично-десятичный код (2/10-код) или код BCD (Binary Code Decimal). Различают два формата 2/10-кода: упакованный и распакованный.
В 2/10-коде упакованного формата каждая десятичная цифра от 0 до 9 представляется 4-разрядным двоичным эквивалентом от 0000В до 1001В соответственно, коды 1010В—1111В не используются. В одном байте удается разместить только две десятичные цифры и, следовательно, представить целое число из диапазона 0—99. Для представления многоразрядного десятичного числа отводится большее число байт (по байту на каждые две цифры). Например:
9272 = 1001 0010 0111 0010В
380 = 0011 1000 0000В
Переход от одной системы представления к другой выполняется заменой каждой десятичной цифры ее двоичным эквивалентом и наоборот.
В 2/10-коде распакованного формата для представления каждой десятичной цифры отводится один байт, младшая тетрада которого содержит двоичный код цифры, а содержимое старшей тетрады равно нулю. Приведенные выше десятичные числа в распакованном формате будут выглядеть следующим образом:
9272 = 00001001 00000010 00000111 00000010В
380 = 00000011 00001000 00000000В
Распакованный формат в сравнении с упакованным требует в 2 раза большей памяти, однако он очень хорошо согласуется с текстовым представлением десятичных цифр в коде КОИ-7. Для перевода распакованного 2/10-кода в текстовой формат достаточно в старшую тетраду каждой цифры записать код 0011В, а замена каждой старшей тетрады текстового представления десятичного числа нулями приведет к его переводу в распакованный формат 2/10-кода.
При необходимости знак десятичного числа кодируется отдельной тетрадой или байтом. В обоих случаях комбинация 0000В соответствует знаку плюс, а комбинация 1001В—знаку минус. Например, в случае упакованного формата
+921 = 0000 1001 0010 0001В
–350 = 1001 0011 0101 0000В
в распакованном формате
–350 = 00001001 00000011 00000101 00000000B
Арифметическая операция над десятичными числами выполняется в два этапа: сначала производится обычная двоичная операция над десятичными числами, затем десятичная коррекция полученного результата. При двухэтапном методе можно воспользоваться АЛУ двоичной арифметики. Для этого требуется лишь ввести в состав АЛУ специальный десятичный корректор, приводящий результат двоичной операции к десятичному виду. Каждой основной операции над десятичными числами необходим определенный корректор. Наибольшее распространение нашли следующие типы десятичной коррекции:
DAA Десятичная коррекция сложения
DAS Десятичная коррекция вычитания
ААА Коррекция сложения в коде КОИ-7
AAS Коррекция вычитания в коде КОИ-7
ААМ Коррекция умножения в коде КОИ-7
AAD Коррекция деления в коде КОИ-7
Первые два типа поддерживают десятичную арифметику в упакованном формате, остальные—в распакованном. Для архитектур с аккумулятором или вычислительным стеком команды десятичной коррекции безадресные и работают либо с аккумулятором, либо с вершиной стека соответственно. Операции десятичной коррекции обычно являются байтно ориентированными, т. е. за один командный цикл допускается коррекция либо двухразрядного десятичного числа упакованного формата, либо одной десятичной цифры распакованного формата. Рассмотрим более подробно операцию ААА.
При двоичном сложении двух десятичных цифр в 2/10-коде с дополнительным учетом состояния флажка CF может быть получено двоичное число, находящееся в диапазоне 0—13Н. Для его приведения к 2/10-коду должна быть применена операция десятичной коррекции. При попадании результата операции в диапазон 0—9 никакой коррекции не требуется. Если же результат превышает цифру 9, то его коррекция необходима. Она сводится к прибавлению числа 0F6H, благодаря чему результат становится верным. Десятичный перенос фиксируется флажком CF и может быть учтен при сложении более старших десятичных цифр. Реализовать такой десятичный корректор несложно.
По аналогии с ААА могут быть построены карты преобразований любых других коррекций для упакованного и распакованного форматов. При этом в случае упакованного формата может потребоваться дополнительный признак—перенос из младшей тетрады в старшую, который фиксируется флажком AF.
Команда десятичной коррекции для ВМ80 DAA поддерживает операцию сложения в упакованном 2/10-коде. Она используется для получения корректного результата после сложения двух байтов, представляющих собой числа в 2/10-коде. Например:
ADD В ;AA2/10 + B2/10
DAA ;A2/10Коррекция А
Представленная в табл. 2.4 группа команд передачи управления содержит три основные операции, типичные для большинства МС:
JMP Переход
CALL Вызов подпрограммы
RET Возврат из подпрограммы
Таблица 2.4
Эти операции организуют безусловный переход, нарушая процесс последовательной выборки команд. Для поддержки условной передачи управления в состав группы введены три соответствующие модификации базовых операций:
Jcc Условный переход
Ссс Условный вызов подпрограммы
Rcc Условный возврат из подпрограммы
Каждая условная операция обеспечивает проверку восьми условий, в соответствии с которыми меняется значение поля cc. Мнемоника поля и соответствующее ему условие приведены ниже:
С Carry CY = 1
NC Not Carry CY = 0
Z Zero Z = 1
NZ Not Zero Z = 0
M Minus M = 1
P Positive M = 0
PE Parity Even P = 1
PO Parity Odd P = 0
Передача управления производится только в том случае, если выполняется условие, указанное в команде. Состав условий дает возможность контролировать состояние четырех основных флажков CY, Z, M, P и не проверять пятый АС.
В операциях как условного, так и безусловного перехода и вызова подпрограмм используется полный прямой 16-разрядный адрес, обеспечивающий передачу управления в любую точку 64К-байтовой области пространства памяти. Однако во всех этих случаях манипуляция адресом как параметром затруднена.
В составе группы имеется еще одна команда, которая реализует передачу управления по содержимому регистровой пары HL:
PCHL ;РСHL
Применение данной команды решает важную проблему передачи управления по вычисляемому адресу. С ее помощью достаточно просто организовать многопутевое ветвление типа
if Y = 0 then
goto М0
else if Y = 1 then
goto M1
…;и так далее
end if
Группа команд управления процессором содержит семь кодов. В табл. 2.5 кроме этих команд включены еще две, которые действительны только для МП ВМ85А (см. § 2.7). В состав группы включены две команды ВВ с прямой адресацией портов из пространства IOSEG:
IN port ;AIOSEG (port)
OUT port ;IOSEG (port)A
Таблица 2.5
Сюда же входит ряд команд по обслуживанию системы прерываний. Команды ЕI и DI разрешают и запрещают прием запросов, сбрасывая и устанавливая маску прерывания. Предусмотрена специальная однобайтовая команда RST n, n = 0—7, представляющая собой укороченный вариант команды CALL addr при addr = 8∙n. Эта команда обеспечивает возможность программной инициализации процедур обслуживания прерываний и вызова операционной системы или ее специальных средств (см. § 2.4).
Команда HLT используется для приостановки работы МП. В состоянии останова HALT прибор сохраняет возможность приема и обслуживания запросов на прерывания при сброшенной маске. Поэтому МП может быть выведен из состояния HALT двумя путями: перезапуском и по сигналу прерывания.
Команда NOP представляет собой пустую операцию. По данной команде никаких действий МП не производит. Она может быть полезна для организации коротких пауз и установки «заплат» на объектный код при его модификации.
В целом система команд МП ВМ80—хорошо согласованный набор средств общего назначения, используемых при программировании 8-разрядных МС на его основе. Интенсивное внедрение набора программно-доступных регистров аккумуляторного типа обеспечило короткое кодирование и быстрое исполнение команд, что очень важно для экономии объема системной памяти и увеличения быстродействия МС. К серьезным недостаткам системы команд следует отнести отсутствие относительной адресации, что привело к невозможности создания перемещаемого объектного кода. Все команды МП ВМ80 оперируют абсолютными адресами, что требует настройки объектного кода перед его исполнением. Второй недостаток—отсутствие средств защиты памяти. Эти недостатки дают нам право отнести архитектуру МП ВМ80 к классу достаточно простых однопользовательских систем.
Дата добавления: 2019-02-07; просмотров: 838;