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