Читайте также:
|
|
Всякий МП представляет собой программно-управляемое устройство, которое способно выполнять определенный набор действий (операций), задаваемый соответствующим набором команд. При рассмотрении системы команд МП большую помощь может оказать так называемая программная модель, которая содержит все доступные программисту компоненты МП без указания внутренних связей между ними. Функции этих компонентов обеспечиваются соответствующими командами МП. На рисунке 23 изображена программная модель 8-разрядного ОМП КР580ВМ80. На ней представлен 8-разрядный накапливающий регистр (аккумулятор) А, содержимое которого в качестве источника или (и) приемника информации участвует в большинстве команд. Рядом с ним находится регистр признаков F, в соответствующих его разрядах показаны все используемые признаки. Размещение регистров А и F в программной модели рядом вызвано тем, что их содержимое (обозначаемое PSW) записывается в стек одной командой. Регистры общего назначения В, С, D, Е, Н, L могут быть использова-
ны отдельно либо парами, что определяет их расположение в програм-
мной модели. В стек записывается одной командой содержимое пары РОН. Указатель стека SP и счетчик команд PC всегда оперируют 16-разрядными числами. Триггер Tint предназначен для хранения запрета прерываний.
Каждая команда МП имеет определенную структуру (формат), в которой можно выделить часть (поле) кода операции (КОП) и поле операнда, определяющее числа (операнды), участвующие в операции в соответствии с КОП. Способ определения операнда на основе структуры команды называется режимом адресации. Использование нескольких режимов адресации расширяет возможности при составлении программы. Наиболее широко применяются следующие способы адресации:
- неявная адресация, когда место расположения операнда подразумевается и его адрес отдельно ни в какой части команды не задается;
- прямая адресация, предусматривающая запись в поле операнда адреса ячейки памяти с операндом;
- непосредственная адресация, когда в поле операнда находится сам операнд;
- регистровая адресация, когда в поле операнда указывается номер РОН с операндом;
- косвенная адресация, предусматривающая запись в отдельных разрядах КОП номеров РОН, в которых находится адрес ячейки памяти с операндом.
Рисунок 23 – Программная модель 8-разрядного МП КР580ВМ80
Именно эти способы адресации применяются в большинстве МП, причем в одной и той же команде может одновременно использоваться несколько способов. Например, в командах для обработки двух чисел один операнд может быть задан регистровой адресацией, а другой – непосредственной. Чаще всего один из операндов подразумевается находящимся в аккумуляторе, туда же помещается и результат выполнения операции.
При обработке информации в МП каждая команда представляет собой двоичный код. Однако при подготовке программ пользователю обычно удобнее применять символические обозначения (мнемокоды) команд. Чаще всего в качестве мнемокодов используются сокращения от английских наименований соответствующих операций. Например, LDA – load direct accumulator (прямая загрузка аккумулятора). Иногда мнемокоды представляют собой слова, определяющие суть выполняемых операций. Например, PUSH – затолкнуть, POP – вытолкнуть. В структуре команд в символическом виде могут приводиться сведения об операндах и адресах, по которым расположены операнды (это могут быть регистры МП, регистровые пары, ячейки памяти М, 8- или 16-разрядные числа, 8- или 16-разрядные адреса).
В большинстве МП применяются команды длиной в 1…3 байт. Во всех командах разряды КОП располагаются в первом байте.
Система команд микроконтроллера стандарта MCS-51 представлена в таблице 1.
Таблица 1 – Система команд микроконтроллера стандарта MCS-51
Мнемоника | Описание | Длина, байт | Кол-во пери-одов гене-ратора | |
Арифметические команды | ||||
ADD | A, Rn | Прибавляет регистр к Аккумулятору | ||
ADD | A, direct | Прибавляет содержимое ячейки внутренней памяти данных, адрес которой задан в команде, к Аккумулятору | ||
ADD | A, @Ri | Прибавляет содержимое ячейки внутренней памяти данных, адрес которой задан в регистре R0 или R1, к Аккумулятору | ||
ADD | A, #data | Прибавляет к Аккумулятору число #data | ||
ADDC | A, Rn | Прибавляет регистр и флаг переноса к Аккумулятору | ||
ADDC | A, direct | Прибавляет содержимое ячейки внутренней памяти данных, ад-рес которой задан в команде, и флаг переноса к Аккумулятору | ||
ADDC | A, @Ri | Прибавляет содержимое ячейки внутренней памяти данных, адрес которой задан в регистре R0 или R1, и флаг переноса к Аккумулятору | ||
ADDC | A, #data | Прибавляет к Аккумулятору число #data и флаг переноса |
Продолжение таблицы 1
SUBB | A, Rn | Вычитает регистр из Аккумулятора | ||
SUBB | A, direct | Вычитает содержимое ячейки внутренней памяти данных, адрес которой задан в команде, из Аккумулятора | ||
SUBB | A, @Ri | Вычитает содержимое ячейки внутренней памяти данных, адрес которой задан в регистре R0 или R1, из Аккумулятора | ||
SUBB | A, #data | Вычитает число #data из Аккумулятора | ||
INC | A | Инкрементирует Аккумулятор | ||
INC | Rn | Инкрементирует регистр | ||
INC | direct | Инкрементирует содержимое ячейки внутренней памяти данных, адрес которой задан в команде | ||
INC | @Ri | Инкрементирует содержимое ячейки внутренней памяти данных, адрес которой задан в регистре R0 или R1 | ||
DEC | A | Декрементирует Аккумулятор | ||
DEC | Rn | Декрементирует регистр | ||
DEC | direct | Декрементирует содержимое ячейки внутренней памяти данных, адрес которой задан в команде | ||
DEC | @Ri | Декрементирует содержимое ячейки внутренней памяти данных, адрес которой задан в регистре R0 или R1 | ||
INC | DPTR | Инкрементирует регистровую пару DPTR |
Продолжение таблицы 1
MUL | AB | Перемножает Аккумулятор и регистр В | ||
DIV | AB | Делит Аккумулятор на регистр В | ||
DA | A | Выполняет десятичную коррек-цию Аккумулятора | ||
Логические команды | ||||
ANL | A, Rn | Выполняет логическое И Аккумулятора и регистра | ||
ANL | A, direct | Выполняет логическое И Акку-мулятора и содержимого ячейки внутренней памяти данных, адрес которой задан в команде | ||
ANL | A, @Ri | Выполняет логическое И Аккумулятора и содержимого ячейки внутренней памяти данных, адрес которой задан в регистре R0 или R1 | ||
ANL | A, #data | Выполняет логическое И Аккумулятора и числа #data | ||
ANL | direct, A | Выполняет логическое И содержимого ячейки внутренней памяти данных, адрес которой задан в команде, и Аккумулятора | ||
ANL | direct, #data | Выполняет логическое И содержимого ячейки внутренней памяти данных, адрес которой задан в команде, и числа #data | ||
ORL | A, Rn | Выполняет логическое ИЛИ Аккумулятора и регистра |
Продолжение таблицы 1
ORL | A, direct | Выполняет логическое ИЛИ Аккумулятора и содержимого ячейки внутренней памяти данных, адрес которой задан в команде | ||
ORL | A, @Ri | Выполняет логическое ИЛИ Аккумулятора и содержимого ячейки внутренней памяти данных, адрес которой задан в регистре R0 или R1 | ||
ORL | A, #data | Выполняет логическое ИЛИ Аккумулятора и числа #data | ||
ORL | direct, A | Выполняет логическое ИЛИ содержимого ячейки внутрен-ней памяти данных, адрес которой задан в команде, и Аккумулятора | ||
ORL | direct, #data | Выполняет логическое ИЛИ содержимого ячейки внутрен-ней памяти данных, адрес которой задан в команде, и числа #data | ||
XRL | A, Rn | Выполняет логическое ИСК-ЛЮЧАЮЩЕЕ ИЛИ Акку-мулятора и регистра | ||
XRL | A, direct | Выполняет логическое ИСКЛЮЧАЮЩЕЕ ИЛИ Акку-мулятора и содержимого ячейки внутренней памяти данных, адрес которой задан в команде |
Продолжение таблицы 1
XRL | A, @Ri | Выполняет логическое ИСК-ЛЮЧАЮЩЕЕ ИЛИ Аккуму-лятора и содержимого ячейки внутренней памяти данных, адрес которой задан в регистре R0 или R1 | ||
XRL | A, #data | Выполняет логическое ИСК-ЛЮЧАЮЩЕЕ ИЛИ Аккуму-лятора и числа #data | ||
XRL | direct, A | Выполняет логическое ИСКЛЮЧАЮЩЕЕ ИЛИ содер-жимого ячейки внутренней памяти данных, адрес которой задан в команде, и Аккуму-лятора | ||
XRL | direct, #data | Выполняет логическое ИСКЛЮЧАЮЩЕЕ ИЛИ содер-жимого ячейки внутренней памяти данных, адрес которой задан в команде, и числа #data | ||
CLR | A | Обнуляет Аккумулятор | ||
CPL | A | Комплементирует Аккумулятор | ||
RL | A | Ротирует Аккумулятор влево | ||
RLC | A | Ротирует Аккумулятор влево с использованием флага переноса | ||
RR | A | Ротирует Аккумулятор вправо | ||
RRC | A | Ротирует Аккумулятор вправо с использованием флага переноса | ||
SWAP | A | Обменивает полубайты в Аккумуляторе |
Продолжение таблицы 1
Команды пересылки | ||||
MOV | A, Rn | Пересылает регистр в Аккумулятор | ||
MOV | A, direct | Пересылает содержимое ячейки внутренней памяти данных, адрес которой задан в команде, в Акку-мулятор | ||
MOV | A, @Ri | Пересылает содержимое ячейки внутренней памяти данных, адрес которой задан в регистре R0 или R1, в Аккумулятор | ||
MOV | A, #data | Пересылает данные #data в Аккумулятор | ||
MOV | Rn, A | Пересылает Аккумулятор в регистр | ||
MOV | Rn, direct | Пересылает содержимое ячейки внутренней памяти данных, адрес которой задан в команде, в регистр | ||
MOV | Rn, #data | Пересылает данные #data в регистр | ||
MOV | direct, A | Пересылает Аккумулятор в ячейку внутренней памяти данных, адрес которой задан в команде | ||
MOV | direct, Rn | Пересылает регистр в ячейку внутренней памяти данных, адрес которой задан в команде | ||
MOV | direct, direct | Пересылает ячейку внутренней памяти данных, адрес которой задан в команде, в ячейку внутренней памяти данных, адрес которой задан в команде |
Продолжение таблицы 1
MOV | direct, @Ri | Пересылает ячейку внутрен-ней памяти данных, адрес которой задан в регистре R0 или R1, в ячейку внутренней памяти данных, адрес которой задан в команде | ||
MOV | direct, #data | Пересылает данные #data в ячейку внутренней памяти данных, адрес которой задан в команде | ||
MOV | @Ri, A | Пересылает Аккумулятор в ячейку внутренней памяти данных, адрес которой задан в регистре R0 или R1 | ||
MOV | @Ri, direct | Пересылает ячейку внутренней памяти данных, адрес которой задан в команде в ячейку внутренней памяти данных, адрес которой задан в регистре R0 или R1 | ||
MOV | @Ri, #data | Пересылает данные #data в ячейку внутренней памяти данных, адрес которой задан в регистре R0 или R1 | ||
MOV | DPTR, #data16 | Загружает регистровую пару DPTR числом #data 16 | ||
MOVC | A, @A+DPTR | Загружает Аккумулятор со-держимым ячейки памяти программ, адрес которой вычисляется как сумма содержимого регистровой пары DPTR и Аккумулятора | ||
MOVC | A, @A+PC | Загружает Аккумулятор содержимым ячейки памяти программ, адрес которой вычисляется как сумма содержимого счётчика команд PC и Аккумулятора |
Продолжение таблицы 1
MOVX | A, @Ri | Загружает Аккумулятор содержимым ячейки внеш-ней памяти данных, адрес которой задан в регистре R0 или R1 | ||
MOVX | A, @DPTR | Загружает Аккумулятор содержимым ячейки внеш-ней памяти данных, адрес которой задан в регис-тровой паре DPTR | ||
MOVX | @Ri, A | Загружает ячейку внешней памяти данных, адрес которой задан в регистре R0 или R1, Аккумулятором | ||
MOVX | @DPTR, A | Загружает Аккумулятором ячейку внешней памяти данных, адрес которой задан в регистровой паре DPTR | ||
PUSH | direct | Записывает ячейку внут-ренней памяти данных, адрес которой задан в команде, в стек | ||
POP | direct | Считывает в ячейку внутренней памяти данных, адрес которой задан в команде, из стека | ||
XCH | A, Rn | Обменивает содержимое Аккумулятора и регистра | ||
XCH | A, direct | Обменивает содержимое Аккумулятора и ячейки внутренней памяти дан-ных, адрес которой задан в команде |
Продолжение таблицы 1
XCH | A, direct | Обменивает содержимое Аккумулятора и ячейки внутренней памяти дан-ных, адрес которой задан в команде | ||
XCH | A, @Ri | Обменивает содержимое Аккумулятора и ячейки внутренней памяти дан-ных, адрес которой задан в регистре R0 или R1 | ||
XCHD | A, @Ri | Обменивает содержимое 4-х младших бит Аккуму-лятора и ячейки внутрен-ней памяти данных, адрес которой задан в регистре R0 или R1 | ||
Команды работы с битами | ||||
CLR | C | Сбрасывает в 0 флаг переноса | ||
CLR | bit | Сбрасывает в 0 бит | ||
SETB | C | Устанавливает в 1 флаг переноса | ||
SETB | bit | Устанавливает в 1 бит | ||
CPL | C | Инвертирует флаг переноса | ||
CPL | bit | Инвертирует бит | ||
ANL | C, bit | Логическое И флага переноса и бита | ||
ANL | C, /bit | Логическое И флага переноса и инверсии бита | ||
ORL | C, bit | Логическое ИЛИ флага переноса и бита | ||
ORL | C, /bit | Логическое ИЛИ флага переноса и инверсии бита | ||
MOV | C, bit | Загрузить флаг переноса из бита |
Продолжение таблицы 1
MOV | bit, C | Загрузить бит из флага переноса | ||
Команды ветвления | ||||
JC | rel | Переход, если флаг переноса равен 1 | ||
JNC | rel | Переход, если флаг переноса равен 0 | ||
JB | bit, rel | Переход, если бит равен 1 | ||
JNB | bit, rel | Переход, если бит равен 0 | ||
JBC | bit, rel | Переход, если бит равен 1 и сброс бита в 0 | ||
ACALL | addr11 | Вызов подпрограммы по абсолютному адресу | ||
LCALL | addr16 | Вызов подпрограммы по длинному абсолютному адресу | ||
RET | Возврат из подпрограммы | |||
RETI | Возврат из прерывания | |||
AJMP | addr11 | Безусловный переход по абсолютному адресу | ||
LJMP | addr16 | Безусловный переход по длинному абсолютному адресу | ||
SJMP | rel | Безусловный переход по относительному адресу | ||
JMP | @A+DPTR | Безусловный переход по адресу, равному сумме содержимого DPTR и Аккумулятора | ||
JZ | rel | Переход, если Аккуму-лятор равен 0 | ||
JNZ | rel | Переход, если Аккуму-лятор не равен 0 |
Продолжение таблицы 1
CJNE | A, direct, rel | Сравнивает Аккумулятор и ячейку внутренней памяти данных, адрес которой задан в команде, и переходит по относительному адресу, если они не равны | ||
CJNE | A, #data, rel | Сравнивает Аккумулятор и данные #data и переходит по относительному адресу, если они не равны | ||
CJNE | Rn, #data, rel | Сравнивает регистр и дан-ные #data и переходит по относительному адресу, если они не равны | ||
CJNE | @Ri, #data, rel | Сравнивает ячейку внут-ренней памяти данных, адрес которой задан в регистре R0 или R1, и данные #data и переходит по относительному адресу, если они не равны | ||
DJNZ | Rn, rel | Декрементирует регистр и переходит по относитель-ному адресу, если регистр не равен 0 | ||
DJNZ | direct, rel | Декрементирует ячейку внутренней памяти дан-ных, адрес которой задан в команде, и переходит по относительному адресу, если она не равна 0 | ||
NOP | Нет операции |
В системе команд обычно выделяется пять групп команд: пересылка кодов; выполнение арифметических операций; выполнение логических операций; передача управления; команды ввода-вывода и специальные.
Команды пересылки кодов предусматривают передачу 8-разрядного кода из регистра в регистр, из регистра в ячейку памяти и обратно, загрузку содержимого второго байта команды в регистр или ячейку памяти. В ряде команд обеспечивается передача 16-разрядного кода из двух ячеек памяти в регистровую пару и обратно, в том числе с использованием области памяти, отведенной под стек. Предусмотрены загрузка регистровой пары содержимым второго и третьего байтов команды и обмен данными между регистровыми парами, а также регистровой парой и ячейками стековой памяти.
Команды выполнения арифметических операций обеспечивают сложение и вычитание 8-разрядных чисел, одно из которых находится в аккумуляторе, с помещением результата в аккумулятор. Второе число, участвующее в этих операциях, может задаваться различными режимами адресации (регистровой, косвенной, непосредственной). При выполнении некоторых команд сложения и вычитания предусмотрена возможность учета переноса C, что позволяет организовать обработку многобайтовых чисел отдельными частями. Все команды сложения и вычитания 8-разрядных чисел формируют полный набор признаков результата.
Имеется возможность выполнения сложения 16-разрядных чисел с использованием регистровых пар. В этом случае результат фиксируется в регистровой паре и формируется только признак переноса C. Ряд команд позволяет изменить на единицу в сторону увеличения или уменьшения содержимое регистра, регистровой пары, ячейки памяти М. В результате выполнения этих команд признаков переноса не формируется, а остальные признаки формируются только в операциях с 8-разрядными числами. В этой группе команд особое место занимает команда десятичной коррекции, предусматривающая преобразование содержимого аккумулятора. В связи с тем, что это преобразование основано на выполнении арифметических операций над содержимым полубайтов аккумулятора, то команда отнесена к данной группе.
Команды выполнения логических операций предусматривают реализацию наиболее распространенных логических операций над двумя 8-разрядными кодами, один из которых расположен в аккумуляторе, другой задается различными режимами адресации с помещением результата в аккумулятор. Среди этих операций – логическое умножение, логическое сложение, сложение по модулю 2. Имеется команда инвертирования содержимого аккумулятора без формирования признаков результата. В эту же группу команд отнесены команды инвертирования признака переноса и запись в качестве этого признака единич-ного значения, а также команды поразрядного сдвига содержимого аккумулятора влево и вправо на один разряд (с двумя вариантами формирования признака переноса C).
Группа команд передачи управления обеспечивает возможность изменения порядка выполнения команд в программе. Среди них команда JMP addr передает управление по адресу, задаваемому вторым и третьим байтами команды. Команда вызова подпрограммы CALL addr также передает управление по адресу, заданному вторым и третьим байтами, но с одновременной записью в стековую память текущего значения PC, что дает возможность возвратиться к прерванной программе. Этот возврат может быть произведен с помощью команды RET, восстанавливающей содержимое PC считыванием его из стековой памяти. Имеются команды, которые выполняют передачу управления, вызов подпрограммы или возврат из нее только в случае выполнения условия (cond), задаваемого соответствующим признаком.
В последней группе команд имеются две команды, обеспечивающие ввод-вывод информации через аккумулятор. Второй байт этих команд позволяет адресовать до 256 (или более) устройств ввода и столько же устройств вывода. В этой группе имеется также несколько специальных команд. Команды, управляющие состоянием триггера Tint, обеспечивают программное разрешение или запрет режима прерывания. Команда NOP не задает выполнение операции, она позволяет перейти к очередной команде с задержкой на несколько тактов. Данная группа команд также не влияет на признаки.
Дата добавления: 2015-08-10; просмотров: 87 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Арифметико-логические устройства | | | Периферийные устройства микропроцессорных систем |