Общая характеристика системы команд
2.7.1. Все микроконтроллеры семейства MCS-51 имеют единую систему команд, общее количество которых равно 111.
2.7.2. Команды имеют различные форматы: 1 байт (49 команд), 2 байта (46 команд), 3 байта (16 команд). Первый байт команды любого формата содержит код операции, второй и третий байты – адреса операндов или непосредственные операнды.
2.7.3. Данные (операнды и результаты выполнения операций) могут иметь следующие форматы: бит, 4-битное слово, байт, 16-битное слово.
2.7.4. Команды могут выполняться в течение 1-го машинного цикла (64 команды), 2-х машинных циклов (45 команд) или 4 машинных циклов (2 команды). Машинный цикл имеет фиксированную длительность, равную 12-ти периодам тактового генератора (см. подраздел 2.9).
2.7.5. Команды могут быть объединены в следующие группы:
1) команды передачи данных,
2) команды операций с аккумулятором,
3) команды операций с битами,
4) команды передачи управления,
5) команды арифметических операций,
6) команды логических операций.
2.7.6. Мнемонические обозначения всех команд МК семейства MCS-51 на языке ассемблера приведены в табл. 2.4, где:
addr – прямой адрес байта (число или символическое имя),
bit – прямой адрес бита (число или символическое имя),
data – значение константы (число),
rel – 8-битный относительный адрес (метка),
addr11 – 11-битный абсолютный адрес (метка),
addr16 – 16-битный абсолютный адрес (метка),
A – аккумулятор,
PC – программный счетчик,
(A), (addr), (Rn)– содержимое аккумулятора, ячейки памяти, регистра.
Таблица 2.4
СИСТЕМА КОМАНД МИКРОКОНТРОЛЛЕРОВ СЕМЕЙСТВА MCS-51
| Мнемокод | Наименование команды | Операция |
| КОМАНДЫ ПЕРЕДАЧИ ДАННЫХ | ||
| MOV A,Rn | Пересылка в аккумулятор из регистра (n = 0 ¸ 7) | (A) (Rn) |
| MOV A,addr | Пересылка в аккумулятор прямоадресуемого байта | (A) (addr) |
| MOV A,@Ri | Пересылка в аккумулятор косвенноадресуемого байта (i = 0, 1) | (A) ((Ri)) |
| MOV A,#data | Пересылка в аккумулятор константы | (A) data |
| MOV Rn,A | Пересылка в регистр из аккумулятора (i = 0 ¸ 7) | (Rn) (A) |
| MOV Rn,addr | Пересылка в регистр прямоадресуемого байта (i = 0 ¸ 7) | (Rn) (addr) |
| MOV Rn,#data | Пересылка в регистр константы (i = 0 ¸ 7) | (Rn) data |
| MOV addr,A | Пересылка аккумулятора по прямому адресу | (addr) (A) |
| MOV addr,Rn | Пересылка регистра по прямому адресу (i = 0 ¸ 7) | (addr) (Rn) |
| MOV addrD,addrS | Пересылка прямоадресуемого байта по прямому адресу | (addrD) (addrS) |
| MOV addr,@Ri | Пересылка косвенноадресуемого байта по прямому адресу (i = 0, 1) | (addr) ((Ri)) |
| MOV addr,#data | Пересылка константы по прямому адресу | (addr) data |
| MOV @Ri,A | Пересылка аккумулятора по косвенному адресу (i = 0, 1) | ((Ri)) (A) |
| MOV @Ri,addr | Пересылка прямоадресуемого байта по косвенному адресу (i = 0, 1) | ((Ri)) (addr) |
| MOV @Ri,#data | Пересылка константы по косвенному адресу (i = 0, 1) | ((Ri)) data |
| MOV DPTR,#data16 | Загрузка указателя данных | (DPTR) data16 |
| MOVC A,@A+DPTR | Пересылка косвенноадресуемого байта из памяти программ в аккумулятор | (A) ((A)+(DPTR)) |
| MOVC A,@A+PC | Пересылка косвенноадресуемого байта из памяти программ в аккумулятор | (PC) (PC)+1 (A) ((A)+(PC)) |
Таблица 2.4 (продолжение)
| Мнемокод | Наименование команды | Операция |
| MOVX A,@Ri | Пересылка косвенноадресуемого байта из внешней памяти данных в аккумулятор (8-бит. адрес, i = 0, 1) | (A) ((Ri)) |
| MOVX A,@DPTR | Пересылка косвенноадресуемого байта из внешней памяти данных в аккумулятор (16-бит. адрес) | (A) ((DPTR)) |
| MOVX @Ri,A | Пересылка аккумулятора во внешнюю память данных по косвенному адресу (8-бит. адрес, i = 0, 1) | ((Ri)) (A) |
| MOVX @DPTR,A | Пересылка аккумулятора во внешнюю память данных по косвенному адресу (16-бит. адрес) | ((DPTR) (A) |
| PUSH addr | Загрузка в стек | (SP) (SP)+1 ((SP)) (addr) |
| POP addr | Извлечение из стека | (addr) ((SP)) (SP) (SP)-1 |
| XCH A,Rn | Обмен аккумулятора с регистром (i = 0 ¸ 7) | (A) « (Rn) |
| XCH A,addr | Обмен аккумулятора с прямоадресуемым байтом | (A) « (addr) |
| XCH A,@Ri | Обмен аккумулятора с косвенноадресуемым байтом (i = 0, 1) | (A) « ((Ri)) |
| XCHD A,@Ri | Обмен младшей тетрады аккумулятора с младшей тетрадой косвенноадресуемого байта (i = 0, 1) | (A0-3) « ((Ri)0-3) |
| КОМАНДЫ ОПЕРАЦИЙ С АККУМУЛЯТОРОМ | ||
| CLR A | Очистка аккумулятора | (A) 0 |
| CPL A | Инверсия аккумулятора | (A) not (A) |
| INC A | Инкремент аккумулятора | (A) (A)+1 |
| DEC A | Декремент аккумулятора | (A) (A) -1 |
| RL A | Циклический сдвиг аккумулятора влево | (An+1) (An), n=0¸6 (A0) (A7) |
| RLC A | Сдвиг аккумулятора влево через перенос | (An+1) (An), n=0¸6 (A0) (C) (C) (A7) |
| RR A | Циклический сдвиг аккумулятора вправо | (An) (An+1), n=0¸6 (A7) (A0) |
Таблица 2.4 (продолжение)
| Мнемокод | Наименование команды | Операция |
| RRC A | Сдвиг аккумулятора вправо через перенос | (An) (An+1), n=0¸6 (A7) (C) (C) (A0) |
| SWAP A | Перестановка тетрад в аккумуляторе | (A0-3) « (A4-7) |
| DA A | Десятичная коррекция аккумулятора | Если (AC)=1 или А0-3 >9, то (A0-3) (A0-3)+6, затем, если (C)=1 или А4-7 >9, то (A4-7) (A4-7)+6 |
| MUL AB | Умножение аккумулятора на регистр В | (B)(A) (A) × (B) |
| DIV AB | Деление аккумулятора на регистр В | (A).(B) (A) / (B) |
| КОМАНДЫ ОПЕРАЦИЙ С БИТАМИ | ||
| CLR C | Сброс переноса | (C) 0 |
| CLR bit | Сброс бита | (bit) 0 |
| SETB C | Установка переноса | (C) 1 |
| SETB bit | Установка бита | (bit) 1 |
| CPL C | Инверсия переноса | (C) not (C) |
| CPL bit | Инверсия бита | (bit) not (bit) |
| ANL C,bit | Логическое И переноса и бита | (C) (C) & (bit) |
| ANL C,/bit | Логическое И переноса с инверсией бита | (C) (C) & not(bit) |
| ORL C,bit | Логическое ИЛИ переноса и бита | (C) (C) V (bit) |
| ORL C,/bit | Логическое ИЛИ переноса с инверсией бита | (C) (C) V not(bit) |
| MOV C,bit | Пересылка бита в перенос | (C) (bit) |
| MOV bit,C | Пересылка переноса в бит | (bit) (C) |
| КОМАНДЫ ПЕРЕДАЧИ УПРАВЛЕНИЯ | ||
| LJMP addr16 | Длинный переход в полном адресном пространстве памяти программ | (PC) addr16 |
| AJMP addr11 | Абсолютный переход в пределах страницы размером 2К байт | (PC) (PC)+2 (PC0-10) addr11 |
| SJMP rel | Относительный переход внутри страницы размером 256 байт | (PC) (PC)+2 (PC) (PC)+rel |
| JMP @A+DPTR | Косвенный относительный переход | (PC) (A)+(DPTR) |
Таблица 2.4 (продолжение)
| Мнемокод | Наименование команды | Операция |
| JNB bit,rel | Переход, если бит не установлен | (PC) (PC)+3, если (bit)=0, то (PC) (PC)+rel |
| JBC bit,rel | Переход, если бит установлен, с последующим сбросом бита | (PC) (PC)+3, если (bit)=1, то (bit) 0 и (PC) (PC)+rel |
| DJNZ Rn,rel | Декремент регистра и переход, если содержимое не равно нулю | (PC) (PC)+2, (Rn) (Rn) -1, если (Rn)¹0, то (PC) (PC)+rel |
| DJNZ addr,rel | Декремент прямо адресуемого байта и переход, если содержимое не равно нулю | (PC) (PC)+2, (addr) (addr) -1, если (addr) ¹ 0, то (PC) (PC)+rel |
| CJNE A,addr,rel | Переход, если аккумулятор не равен прямоадресуемому байту | (PC) (PC)+3, если (A) ¹ (addr), то (PC) (PC)+rel, если (A) < (addr), то (C) 1, иначе (C) 0 |
| CJNE A,#data,rel | Переход, если аккумулятор не равен константе | (PC) (PC)+3, если (A) ¹ data, то (PC) (PC)+rel, если (A) < (addr), то (C) 1, иначе (C) 0 |
| CJNE Rn,#data,rel | Переход, если регистр не равен константе | (PC) (PC)+3, если (Rn) ¹ data, то (PC) (PC)+rel, если (Rn) < (data), то (C) 1, иначе (C) 0 |
| CJNE @Ri,#data,rel | Переход, если косвенноадресуемый байт не равен константе (i = 0, 1) | (PC) (PC)+3, если ((Ri)) ¹ data, то (PC) (PC)+rel, если ((Ri)) < (data), то (C) 1, иначе (C) 0 |
Таблица 2.4 (продолжение)
| Мнемокод | Наименование команды | Операция |
| JZ rel | Переход, если аккумулятор равен нулю | (PC) (PC)+2, если (A)=0, то (PC) (PC)+rel |
| JNZ rel | Переход, если аккумулятор не равен нулю | (PC) (PC)+2, если (A)¹0, то (PC) (PC)+rel |
| JC rel | Переход, если бит переноса установлен | (PC) (PC)+2, если (С)=1, то (PC) (PC)+rel |
| JNC rel | Переход, если бит переноса не установлен | (PC) (PC)+2, если (С)=0, то (PC) (PC)+rel |
| JB bit,rel | Переход, если бит установлен | (PC) (PC)+3, если (bit)=1, то (PC) (PC)+rel |
| LCALL addr16 | Длинный вызов подпрограммы | (PC) (PC)+3, (SP) (SP) + 1, ((SP)) (PC0-7), (SP) (SP) + 1, ((SP)) (PC8-15), (PC) addr16 |
| ACALL addr11 | Абсолютный вызов подпрограммы в пределах страницы размером 2К байт | (PC) (PC)+3, (SP) (SP) + 1, ((SP)) (PC0-7), (SP) (SP) + 1, ((SP)) (PC8-15), (PC0-10) addr11 |
| RET | Возврат из подпрограммы | (PC8-15) ((SP)), (SP) (SP) - 1 (PC0-7) ((SP)), (SP) (SP) - 1 |
| RETI | Возврат из подпрограммы обработки прерывания | (PC8-15) ((SP)), (SP) (SP) - 1 (PC0-7) ((SP)), (SP) (SP) - 1, |
| NOP | Холостая операция | (PC) (PC)+1 |
Таблица 2.4 (продолжение)
| Мнемокод | Наименование команды | Операция |
| КОМАНДЫ АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙ | ||
| ADD A,Rn | Сложение аккумулятора с регистром (n= 0 ¸ 7) | (A) (A)+(Rn) |
| ADD A,addr | Сложение аккумулятора с прямоадресуемым байтом | (A) (A)+(addr) |
| ADD A,@Ri | Сложение аккумулятора с косвенноадресуемым байтом (i = 0, 1) | (A) (A)+((Ri)) |
| ADD A,#data | Сложение аккумулятора с константой | (A) (A)+data |
| ADDC A,Rn | Сложение аккумулятора с регистром и переносом | (A) (A)+(Rn)+(C) |
| ADDC A,addr | Сложение аккумулятора с прямоадресуемым байтом и переносом | (A) (A)+ + (addr)+(C) |
| ADDC A,@Ri | Сложение аккумулятора с косвенно-адресуемым байтом и переносом (i = 0, 1) | (A) (A)+((Ri))+(C) |
| ADDC A,#data | Сложение аккумулятора с константой и переносом | (A) (A)+data+(C) |
| SUBB A,Rn | Вычитание из аккумулятора регистра и заема (i = 0 ¸ 7) | (A) (A)-(Rn)-(C) |
| SUBB A,addr | Вычитание из аккумулятора прямоадресуемого байта и заема | (A) (A)-(addr)-(C) |
| SUBB A,@Ri | Вычитание из аккумулятора косвенноадресуемого байта и заема (i = 0, 1) | (A) (A)-((Ri))-(C) |
| SUBB A,#data | Вычитание из аккумулятора константы и заема | (A) (A)-data-(C) |
| INC A | Инкремент аккумулятора | (A) (A)+1 |
| INC Rn | Инкремент регистра (i = 0 ¸ 7) | (Rn) (Rn)+1 |
| INC addr | Инкремент прямоадресуемого байта | (addr) (addr)+1 |
| INC @Ri | Инкремент косвенноадресуемого байта (i = 0, 1) | ((Ri)) ((Ri))+1 |
| INC DPTR | Инкремент указателя данных | (DPTR) (DPTR)+1 |
| DEC A | Декремент аккумулятора | (A) (A) -1 |
| DEC Rn | Декремент регистра (i = 0 ¸ 7) | (Rn) (Rn) -1 |
Таблица 2.4 (продолжение)
| Мнемокод | Наименование команды | Операция |
| DEC addr | Декремент прямоадресуемого байта | (addr) (addr) -1 |
| DEC @Ri | Декремент косвенноадресуемого байта (i = 0, 1) | ((Ri)) ((Ri)) -1 |
| MUL AB | Умножение аккумулятора на регистр В | (B)(A) (A) × (B) |
| DIV AB | Деление аккумулятора на регистр В | (A).(B) (A) / (B) |
| DA A | Десятичная коррекция аккумулятора | Если (AC)=1 или А0-3 >9, то (A0-3) (A0-3)+6, затем, если (C)=1 или А4-7 >9, то (A4-7) (A4-7)+6 |
| КОМАНДЫ ЛОГИЧЕСКИХ ОПЕРАЦИЙ | ||
| ANL A,Rn | Логическое И аккумулятора и регистра (i = 0 ¸ 7) | (A) (A) & (Rn) |
| ANL A,addr | Логическое И аккумулятора и прямоадресуемого байта | (A) (A) & (addr) |
| ANL A,@Ri | Логическое И аккумулятора и косвенноадресуемого байта (i = 0, 1) | (A) (A) & ((Ri)) |
| ANL A,#data | Логическое И аккумулятора и константы | (A) (A) & data |
| ANL addr,A | Логическое И прямоадресуемого байта и аккумулятора | (addr) (addr) & A |
| ANL addr,#data | Логическое И прямоадресуемого байта и константы | (addr) (addr) & & data |
| ORL A,Rn | Логическое ИЛИ аккумулятора регистра (i = 0 ¸ 7) | (A) (A) V (Rn) |
| ORL A,addr | Логическое ИЛИ аккумулятора и прямоадресуемого байта | (A) (A) V (addr) |
| ORL A,@Ri | Логическое ИЛИ аккумулятора и косвенноадресуемого байта (i = 0, 1) | (A) (A) V ((Ri)) |
| ORL A,#data | Логическое ИЛИ аккумулятора и константы | (A) (A) V data |
| ORL addr,A | Логическое ИЛИ прямоадресуемого байта и аккумулятора | (A) (addr) V (A) |
| ORL addr,#data | Логическое ИЛИ прямоадресуемого байта и константы | (A) (addr) V data |
Таблица 2.4 (окончание)
| Мнемокод | Наименование команды | Операция |
| XRL A,Rn | Исключающее ИЛИ аккумулятора регистра (i = 0 ¸ 7) | (A) (A) Å (Rn) |
| XRL A,addr | Исключающее ИЛИ аккумулятора и прямоадресуемого байта | (A) (A) Å (addr) |
| XRL A,@Ri | Исключающее ИЛИ аккумулятора и косвенноадресуемого байта (i = 0, 1) | (A) (A) Å ((Ri)) |
| XRL A,#data | Исключающее ИЛИ аккумулятора и константы | (A) (A) Å data |
| XRL addr,A | Исключающее ИЛИ прямоадресуемого байта и аккумулятора- | (A) (addr) Å (A) |
| XRL addr,#data | Исключающее ИЛИ прямоадресуемого байта и константы | (A) (addr) Å data |
2.7.7. Перечень команд, при выполнении которых изменяются флаги слова состояния программы, приведен в табл. 2.5.
Машинные коды всех операций, форматы команд (количество байтов) и времена их выполнения (количество циклов) приведены в прил. 1.
Таблица 2.5