Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Техника двоичной переработки информации.doc
Скачиваний:
16
Добавлен:
27.11.2019
Размер:
3.49 Mб
Скачать

4.5 Система команд однокристального микропроцессора

Всякий МП представляет собой программно-управляемое устройство, которое способно выполнять определенный набор действий (операций), задаваемый соответствующим набором команд. При рассмотрении системы команд МП большую помощь может оказать так называемая программная модель, которая содержит все доступные программисту компоненты МП без указания внутренних связей между ними. Функции этих компонентов обеспечиваются соответствующими командами МП. На рисунке 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

Мнемоника

Описание

Длина, байт

Кол-во пери-одов гене-ратора

1

2

3

4

Арифметические команды

ADD

A, Rn

Прибавляет регистр к Аккумулятору

1

12

ADD

A, direct

Прибавляет содержимое ячейки внутренней памяти данных, адрес которой задан в команде, к Аккумулятору

2

ADD

A, @Ri

Прибавляет содержимое ячейки внутренней памяти данных, адрес которой задан в регистре R0 или R1, к Аккумулятору

1

ADD

A, #data

Прибавляет к Аккумулятору число #data

2

ADDC

A, Rn

Прибавляет регистр и флаг переноса к Аккумулятору

1

ADDC

A, direct

Прибавляет содержимое ячейки внутренней памяти данных, ад-рес которой задан в команде, и флаг переноса к Аккумулятору

2

12

ADDC

A, @Ri

Прибавляет содержимое ячейки внутренней памяти данных, адрес которой задан в регистре R0 или R1, и флаг переноса к Аккумулятору

1

ADDC

A, #data

Прибавляет к Аккумулятору число #data и флаг переноса

2

Продолжение таблицы 1

1

2

3

4

SUBB

A, Rn

Вычитает регистр из Аккумулятора

1

12

SUBB

A, direct

Вычитает содержимое ячейки внутренней памяти данных, адрес которой задан в команде, из Аккумулятора

2

SUBB

A, @Ri

Вычитает содержимое ячейки внутренней памяти данных, адрес которой задан в регистре R0 или R1, из Аккумулятора

1

12

SUBB

A, #data

Вычитает число #data из Аккумулятора

2

INC

A

Инкрементирует Аккумулятор

1

INC

Rn

Инкрементирует регистр

INC

direct

Инкрементирует содержимое ячейки внутренней памяти данных, адрес которой задан в команде

2

INC

@Ri

Инкрементирует содержимое ячейки внутренней памяти данных, адрес которой задан в регистре R0 или R1

1

DEC

A

Декрементирует Аккумулятор

1

12

DEC

Rn

Декрементирует регистр

DEC

direct

Декрементирует содержимое ячейки внутренней памяти данных, адрес которой задан в команде

2

DEC

@Ri

Декрементирует содержимое ячейки внутренней памяти данных, адрес которой задан в регистре R0 или R1

1

INC

DPTR

Инкрементирует регистровую пару DPTR

24

Продолжение таблицы 1

1

2

3

4

MUL

AB

Перемножает Аккумулятор и регистр В

1

48

DIV

AB

Делит Аккумулятор на регистр В

DA

A

Выполняет десятичную коррек-цию Аккумулятора

12

Логические команды

ANL

A, Rn

Выполняет логическое И Аккумулятора и регистра

1

12

ANL

A, direct

Выполняет логическое И Акку-мулятора и содержимого ячейки внутренней памяти данных, адрес которой задан в команде

2

ANL

A, @Ri

Выполняет логическое И Аккумулятора и содержимого ячейки внутренней памяти данных, адрес которой задан в регистре R0 или R1

1

24

ANL

A, #data

Выполняет логическое И Аккумулятора и числа #data

2

ANL

direct, A

Выполняет логическое И содержимого ячейки внутренней памяти данных, адрес которой задан в команде, и Аккумулятора

2

24

ANL

direct, #data

Выполняет логическое И содержимого ячейки внутренней памяти данных, адрес которой задан в команде, и числа #data

3

ORL

A, Rn

Выполняет логическое ИЛИ Аккумулятора и регистра

1

12

Продолжение таблицы 1

1

2

3

4

ORL

A, direct

Выполняет логическое ИЛИ Аккумулятора и содержимого ячейки внутренней памяти данных, адрес которой задан в команде

2

12

ORL

A, @Ri

Выполняет логическое ИЛИ Аккумулятора и содержимого ячейки внутренней памяти данных, адрес которой задан в регистре R0 или R1

1

ORL

A, #data

Выполняет логическое ИЛИ Аккумулятора и числа #data

2

ORL

direct, A

Выполняет логическое ИЛИ содержимого ячейки внутрен-ней памяти данных, адрес которой задан в команде, и Аккумулятора

ORL

direct, #data

Выполняет логическое ИЛИ содержимого ячейки внутрен-ней памяти данных, адрес которой задан в команде, и числа #data

3

24

XRL

A, Rn

Выполняет логическое ИСК-ЛЮЧАЮЩЕЕ ИЛИ Акку-мулятора и регистра

1

12

XRL

A, direct

Выполняет логическое ИСКЛЮЧАЮЩЕЕ ИЛИ Акку-мулятора и содержимого ячейки внутренней памяти данных, адрес которой задан в команде

2

Продолжение таблицы 1

1

2

3

4

XRL

A, @Ri

Выполняет логическое ИСК-ЛЮЧАЮЩЕЕ ИЛИ Аккуму-лятора и содержимого ячейки внутренней памяти данных, адрес которой задан в регистре R0 или R1

1

12

XRL

A, #data

Выполняет логическое ИСК-ЛЮЧАЮЩЕЕ ИЛИ Аккуму-лятора и числа #data

2

XRL

direct, A

Выполняет логическое ИСКЛЮЧАЮЩЕЕ ИЛИ содер-жимого ячейки внутренней памяти данных, адрес которой задан в команде, и Аккуму-лятора

XRL

direct, #data

Выполняет логическое ИСКЛЮЧАЮЩЕЕ ИЛИ содер-жимого ячейки внутренней памяти данных, адрес которой задан в команде, и числа #data

3

24

CLR

A

Обнуляет Аккумулятор

1

12

CPL

A

Комплементирует Аккумулятор

RL

A

Ротирует Аккумулятор влево

RLC

A

Ротирует Аккумулятор влево с использованием флага переноса

RR

A

Ротирует Аккумулятор вправо

RRC

A

Ротирует Аккумулятор вправо с использованием флага переноса

SWAP

A

Обменивает полубайты в Аккумуляторе

Продолжение таблицы 1

1

2

3

4

Команды пересылки

MOV

A, Rn

Пересылает регистр в Аккумулятор

1

12

MOV

A, direct

Пересылает содержимое ячейки внутренней памяти данных, адрес которой задан в команде, в Акку-мулятор

2

MOV

A, @Ri

Пересылает содержимое ячейки внутренней памяти данных, адрес которой задан в регистре R0 или R1, в Аккумулятор

1

12

MOV

A, #data

Пересылает данные #data в Аккумулятор

2

MOV

Rn, A

Пересылает Аккумулятор в регистр

1

MOV

Rn, direct

Пересылает содержимое ячейки внутренней памяти данных, адрес которой задан в команде, в регистр

2

24

MOV

Rn, #data

Пересылает данные #data в регистр

12

MOV

direct, A

Пересылает Аккумулятор в ячейку внутренней памяти данных, адрес которой задан в команде

2

12

MOV

direct, Rn

Пересылает регистр в ячейку внутренней памяти данных, адрес которой задан в команде

2

24

MOV

direct, direct

Пересылает ячейку внутренней памяти данных, адрес которой задан в команде, в ячейку внутренней памяти данных, адрес которой задан в команде

3

24

Продолжение таблицы 1

1

2

3

4

MOV

direct, @Ri

Пересылает ячейку внутрен-ней памяти данных, адрес которой задан в регистре R0 или R1, в ячейку внутренней памяти данных, адрес которой задан в команде

2

24

MOV

direct, #data

Пересылает данные #data в ячейку внутренней памяти данных, адрес которой задан в команде

3

MOV

@Ri, A

Пересылает Аккумулятор в ячейку внутренней памяти данных, адрес которой задан в регистре R0 или R1

1

12

MOV

@Ri, direct

Пересылает ячейку внутренней памяти данных, адрес которой задан в команде в ячейку внутренней памяти данных, адрес которой задан в регистре R0 или R1

2

24

MOV

@Ri, #data

Пересылает данные #data в ячейку внутренней памяти данных, адрес которой задан в регистре R0 или R1

12

MOV

DPTR, #data16

Загружает регистровую пару DPTR числом #data 16

3

24

MOVC

A, @A+DPTR

Загружает Аккумулятор со-держимым ячейки памяти программ, адрес которой вычисляется как сумма содержимого регистровой пары DPTR и Аккумулятора

1

24

MOVC

A, @A+PC

Загружает Аккумулятор содержимым ячейки памяти программ, адрес которой вычисляется как сумма содержимого счётчика команд PC и Аккумулятора

Продолжение таблицы 1

1

2

3

4

MOVX

A, @Ri

Загружает Аккумулятор содержимым ячейки внеш-ней памяти данных, адрес которой задан в регистре R0 или R1

1

24

MOVX

A, @DPTR

Загружает Аккумулятор содержимым ячейки внеш-ней памяти данных, адрес которой задан в регис-тровой паре DPTR

1

24

MOVX

@Ri, A

Загружает ячейку внешней памяти данных, адрес которой задан в регистре R0 или R1, Аккумулятором

1

24

MOVX

@DPTR, A

Загружает Аккумулятором ячейку внешней памяти данных, адрес которой задан в регистровой паре DPTR

PUSH

direct

Записывает ячейку внут-ренней памяти данных, адрес которой задан в команде, в стек

2

24

POP

direct

Считывает в ячейку внутренней памяти данных, адрес которой задан в команде, из стека

XCH

A, Rn

Обменивает содержимое Аккумулятора и регистра

1

12

XCH

A, direct

Обменивает содержимое Аккумулятора и ячейки внутренней памяти дан-ных, адрес которой задан в команде

2

Продолжение таблицы 1

1

2

3

4

XCH

A, direct

Обменивает содержимое Аккумулятора и ячейки внутренней памяти дан-ных, адрес которой задан в команде

2

12

XCH

A, @Ri

Обменивает содержимое Аккумулятора и ячейки внутренней памяти дан-ных, адрес которой задан в регистре R0 или R1

1

12

XCHD

A, @Ri

Обменивает содержимое 4-х младших бит Аккуму-лятора и ячейки внутрен-ней памяти данных, адрес которой задан в регистре R0 или R1

Команды работы с битами

CLR

C

Сбрасывает в 0 флаг переноса

1

12

CLR

bit

Сбрасывает в 0 бит

2

SETB

C

Устанавливает в 1 флаг переноса

1

SETB

bit

Устанавливает в 1 бит

2

CPL

C

Инвертирует флаг переноса

1

CPL

bit

Инвертирует бит

2

ANL

C, bit

Логическое И флага переноса и бита

24

ANL

C, /bit

Логическое И флага переноса и инверсии бита

ORL

C, bit

Логическое ИЛИ флага переноса и бита

ORL

C, /bit

Логическое ИЛИ флага переноса и инверсии бита

MOV

C, bit

Загрузить флаг переноса из бита

12

Продолжение таблицы 1

1

2

3

4

MOV

bit, C

Загрузить бит из флага переноса

2

24

Команды ветвления

JC

rel

Переход, если флаг переноса равен 1

2

24

JNC

rel

Переход, если флаг переноса равен 0

JB

bit, rel

Переход, если бит равен 1

3

24

JNB

bit, rel

Переход, если бит равен 0

JBC

bit, rel

Переход, если бит равен 1 и сброс бита в 0

3

24

ACALL

addr11

Вызов подпрограммы по абсолютному адресу

2

LCALL

addr16

Вызов подпрограммы по длинному абсолютному адресу

3

24

RET

Возврат из подпрограммы

1

RETI

Возврат из прерывания

AJMP

addr11

Безусловный переход по абсолютному адресу

2

LJMP

addr16

Безусловный переход по длинному абсолютному адресу

3

SJMP

rel

Безусловный переход по относительному адресу

2

JMP

@A+DPTR

Безусловный переход по адресу, равному сумме содержимого DPTR и Аккумулятора

1

JZ

rel

Переход, если Аккуму-лятор равен 0

2

JNZ

rel

Переход, если Аккуму-лятор не равен 0

2

Продолжение таблицы 1

1

2

3

4

CJNE

A, direct, rel

Сравнивает Аккумулятор и ячейку внутренней памяти данных, адрес которой задан в команде, и переходит по относительному адресу, если они не равны

3

24

CJNE

A, #data, rel

Сравнивает Аккумулятор и данные #data и переходит по относительному адресу, если они не равны

3

24

CJNE

Rn, #data, rel

Сравнивает регистр и дан-ные #data и переходит по относительному адресу, если они не равны

CJNE

@Ri, #data, rel

Сравнивает ячейку внут-ренней памяти данных, адрес которой задан в регистре R0 или R1, и данные #data и переходит по относительному адресу, если они не равны

3

24

DJNZ

Rn, rel

Декрементирует регистр и переходит по относитель-ному адресу, если регистр не равен 0

2

DJNZ

direct, rel

Декрементирует ячейку внутренней памяти дан-ных, адрес которой задан в команде, и переходит по относительному адресу, если она не равна 0

3

NOP

Нет операции

1

12

В системе команд обычно выделяется пять групп команд: пересылка кодов; выполнение арифметических операций; выполнение логических операций; передача управления; команды ввода-вывода и специальные.

Команды пересылки кодов предусматривают передачу 8-разрядного кода из регистра в регистр, из регистра в ячейку памяти и обратно, загрузку содержимого второго байта команды в регистр или ячейку памяти. В ряде команд обеспечивается передача 16-разрядного кода из двух ячеек памяти в регистровую пару и обратно, в том числе с использованием области памяти, отведенной под стек. Предусмотрены загрузка регистровой пары содер­жимым второго и третьего байтов команды и обмен данными между регистровыми парами, а также регистровой парой и ячейками стековой памяти.

Команды выполнения арифметических операций обес­печивают сложение и вычитание 8-разрядных чисел, одно из которых находится в аккумуляторе, с помещением результата в аккумулятор. Второе число, участвующее в этих операциях, может задаваться различными режима­ми адресации (регистровой, косвенной, непосредствен­ной). При выполнении некоторых команд сложения и вычитания предусмотрена возможность учета переноса C, что позволяет организовать обработку многобайтовых чисел отдельными частями. Все команды сложения и вы­читания 8-разрядных чисел формируют полный набор признаков результата.

Имеется возможность выполнения сложения 16-раз­рядных чисел с использованием регистровых пар. В этом случае результат фиксируется в регистровой паре и формируется только признак переноса C. Ряд команд позволяет изменить на единицу в сторону увеличения или уменьшения содержимое регистра, регистровой пары, ячейки памяти М. В результате выполнения этих команд признаков переноса не формируется, а остальные при­знаки формируются только в операциях с 8-разрядными числами. В этой группе команд особое место занимает команда десятичной коррекции, предусматривающая преобразование содержимого аккумулятора. В связи с тем, что это преобразование основано на выполнении арифметических операций над содержимым полубайтов аккумулятора, то команда отнесена к данной группе.

Команды выполнения логических операций преду­сматривают реализацию наиболее распространенных ло­гических операций над двумя 8-разрядными кодами, один из которых расположен в аккумуляторе, другой задается различными режимами адресации с помещением результата в аккумулятор. Среди этих операций – логическое умножение, логическое сложение, сложение по модулю 2. Имеется команда инвертирования содержимого аккумулятора без формирования признаков результата. В эту же группу команд отнесены команды инвертирования признака переноса и запись в качестве этого признака единич-ного значения, а также команды поразрядного сдвига содержимого аккумулятора влево и вправо на один разряд (с двумя вариантами формиро­вания признака переноса C).

Группа команд передачи управления обеспечивает возможность изменения порядка выполнения команд в программе. Среди них команда JMP addr передает управление по адресу, задаваемому вторым и третьим байтами команды. Команда вызова подпрограммы CALL addr также передает управление по адресу, заданному вторым и третьим байтами, но с одновременной записью в стековую память текущего значения PC, что дает воз­можность возвратиться к прерванной программе. Этот возврат может быть произведен с помощью команды RET, восстанавливающей содержимое PC считыванием его из стековой памяти. Имеются команды, которые выполняют передачу управ­ления, вызов подпрограммы или возврат из нее только в случае выполнения условия (cond), задаваемого соот­ветствующим признаком.

В последней группе команд имеются две команды, обеспечивающие ввод-вывод информации через аккуму­лятор. Второй байт этих команд позволяет адресовать до 256 (или более) устройств ввода и столько же устройств вывода. В этой группе имеется также несколько специальных команд. Команды, управляющие состоянием триггера Tint, обеспечивают программное разрешение или запрет режима прерывания. Команда NOP не задает выполнение операции, она позволяет перейти к очередной команде с задержкой на несколько тактов. Данная группа команд также не влияет на признаки.