ОБЩИЕ СВЕДЕНИЯ О СИСТЕМЕ КОМАНД
МИКРОКОНТРОЛЛЕРА MSC 51
Система команд микроконтроллера MSC 51 содержит 111 базовых команд, которые по функциональному признаку разделяются на пять групп: команды передачи данных, арифметических операций, логических операций, передачи управления и операций с битами. Большинство команд (94) имеет формат один или два байта и выполняются за один или два машинных цикла (при тактовой частоте 12 МГц длительность машинного цикла составляет 1 мкс).
Команды передачи данныхпредставлены в табл. 9.
Таблица 9
| НАЗВАНИЕ КОМАНДЫ | МНЕМОНИКА | ОПЕРАЦИЯ |
| Пересылка в аккумулятор из регистра (n=0...7) | MOV А,Rn | (А) ← (Rn) |
| Пересылка в аккумулятор прямоадресуемого байта | MOV A,ad | (А) ← (ad) |
| Пересылка в аккумулятор байта из внут. ОЗУ (i=0, 1) | MOV A,@Ri | (A) ← (( Ri )) |
| Загрузка в аккумулятор константы | MOV A,#data8 | (А) ← #data8 |
| Пересылка в регистр из аккумулятора | MOV Rn,А | (Rn) ← (А) |
| Пересылка в регистр прямоадресуемого байта | MOV Rn,аd | (Rn) ← (ad) |
| Загрузка в регистр константы | MOV Rn,#dаtа8 | (Rn) ← #data8 |
| Пересылка по прямому адресу аккумулятора | MOV ad,A | (ad) ← (А) |
| Пересылка по прямому адресу регистра | MOV аd,Rn | (ad) ← (Rn) |
| Пересылка прямоадресуемого байта по прямому адресу | MOV add,ads | (add) ← (ads) |
| Пересылка байта из внут. ОЗУ по прямому адресу | MOV ad,@Ri | (ad) ← (( Ri )) |
| Пересылка по прямому адресу константы | MOV ad,#data8 | (ad) ← #data8 |
| Пересылка во внут. ОЗУ из аккумулятора | MOV @Ri,A | (( Ri )) ← (А) |
| Пересылка во внут. ОЗУ прямоадресуемого байта | MOV @Ri,ad | (( Ri )) ← (ad) |
| Пересылка во внут. ОЗУ константы | MOV @Ri,#data8 | (( Ri )) ← #data8 |
| Загрузка указателя данных | MOV DPТR,#data16 | (DPТR) ← #data16 |
| Пересылка в аккумулятор байта из памяти программ | MOVC A,@A+DPТR | (А) ← ((А) + (DPТR)) |
| Пересылка в аккумулятор байта из памяти программ | MOVC А,@А+РС | (РС)←(РС) + 1; (А)←((А) +(РС)) |
| Пересылка в аккумулятор байта из внеш. ОЗУ | MOVX A,@Ri | (А) ← (( Ri )) |
| Пересылка в аккумулятор байта из расширенного внеш.ОЗУ | MOVX A,@DPТR | (А) ← ((DPТR)) |
| Пересылка во внеш. ОЗУ из аккумулятора | MOVX @Ri,A | (( Ri )) ← (А) |
| Пересылка в расширенное внеш. ОЗУ из аккумулятора | MOVX @DPТR,A | ((DPТR)) ← (А) |
| Загрузка в стек | PUSH ad | (SP) ← (SP) + 1; ((SP)) ← (ad) |
| Извлечение из стека | РОР ad | (ad) ← ((SP)); (SP) ← (SP) - 1 |
| Обмен аккумулятора с регистром | ХСН A,Rn | (А) ↔ (Rn) |
| Обмен аккумулятора с прямоадресуемым байтом | ХСН ,ad | (А) ↔ (ad) |
| Обмен аккумулятора с байтом из внут. ОЗУ | ХСН A,@Ri | (А) ↔ (( Ri )) |
| Обмен мл. тетрады аккумулятора с мл. тетрадой байта внут. ОЗУ | ХСНD A,@Ri | (А0...3) ↔ ((Ri0...3)) |
В табл.9 используются следующие обозначения:
А – аккумулятор;
Ri – адресный регистр текущего банка (i = 0 или 1);
Rn – регистр общего назначения (РОН) текущего банка; n = 0 ÷ 7;
PC – счетчик команд;
DPTR – регистр-указатель данных;
ad – адрес или мнемоническое обозначение 8-битного операнда (ячейка ОЗУ, регистры специальных функций);
add – адрес или мнемоническое обозначение 8-битного операнда-приемника данных (ячейка ОЗУ, регистры специальных функций);
ads – адрес или мнемоническое обозначении 8-битного операнда-источника данных (ячейка ОЗУ, регистры специальных функций);
#data8 – 8-битное число (константа);
#data16 – 16-битное число (константа);
SP – указатель стека;
@ – префикс косвенной адресации;
Примечание к табл. 9. Регистры специальных функций (в том числе и порты ввода-вывода) адресуются только прямым способом. Байты памяти (ОЗУ и ПЗУ) адресуются также и косвенным способом через адресные регистры R0, R1, DPTR и PC.
В табл. 9 не приведены сведения о кодах операций, количестве байтов и циклов каждой команды.
Символическое описание выполняемой команды приведено в 3 столбце табл.9. Обозначение операнда в одинарных скобках указывает на содержимое ячейки, адрес которой указан в скобках, а стрелка – направление пересылки данных. Обозначение операнда в двойных скобках указывает на ячейку, в которой в свою очередь содержится адрес ячейки с данными, подлежащими пересылке (косвенная адресация).
Арифметические команды представлены в табл. 10.
Таблица 10
| НАЗВАНИЕ КОМАНДЫ | МНЕМОНИКА | ОПЕРАЦИЯ |
| Сложение аккумулятора с регистром (n=0...7) | АDD A,Rn | (А) ← (А) +(Rn) |
| Сложение аккумулятора с прямо адресуемым байтом | АDD A,ad | (А) ← (А) +(ad) |
| Сложение аккумулятора с байтом из внут. ОЗУ (i = 0, 1) | АDD A,@Ri | (А) ← (А) + (( Ri )) |
| Сложение аккумулятора с константой | АDD A,#data8 | (А) ← (А) + #data8 |
| Сложение аккумулятора с регистром и переносом | АDDC A,Rn | (А) ← (А) +(Rn) + (C) |
| Сложение аккумулятора с прямоадресуемым байтом и переносом | АDDC A,ad | (А) ← (А) +(ad) + (C) |
| Сложение аккумулятора с байтом из внут. ОЗУ и переносом | АDDC A,@Ri | (А) ← (А) + (( Ri ))+ (C) |
| Сложение аккумулятора с константой и переносом | АDDC A,#data8 | (А) ← (А) + #data8+ (C) |
| Десятичная коррекция аккумулятора | DА А | Если (А0 -3)>9 V ((C) = 1), то (А0-3) ← (А0-3)+6. Затем если (А4-7)>9 V ((C) = 1), то (А4-7) ← (А4-7)+6 |
| Вычитание из аккумулятора регистра и заёма | SUBB A,Rn | (А) ← (А) -(Rn) - (C) |
| Вычитание из аккумулятора прямоадресуемого байта и заёма | SUBB A,ad | (А) ← (А) -(ad) - (C) |
| Вычитание из аккумулятора байта из внут. ОЗУ и заёма | SUBB A,@Ri | (А) ← (А) - (( Ri ))- (C) |
| Вычитание из аккумулятора константы и заёма | SUBB A,#data8 | (А) ← (А) - #data8- (C) |
| Инкремент аккумулятора | INC А | (А) ← (А) +1 |
| Инкремент регистра | INC Rn | (Rn) ←(Rn) + 1 |
| Инкремент прямоадресуемого байта | INC ad | (ad) ←(ad) + 1 |
| Инкремент байта из внут. ОЗУ | INC @Ri | (( Ri )) ← (( Ri )) + 1 |
| Инкремент указателя данных | INC DPTR | (DPTR) ← (DPTR) + 1 |
| Декремент аккумулятора | DЕС А | (А) ← (А) -1 |
| Декремент регистра | DЕС Rn | (Rn) ←(Rn) - 1 |
| Декремент прямоадресуемого байта | DЕС ad | (ad) ←(ad) - 1 |
| Декремент байта из внут. ОЗУ | DЕС @Ri | (( Ri )) ← (( Ri )) - 1 |
| Умножение аккумулятора и регистра В | MUL AB | (В)(А) ← (А) * (В) |
| Деление аккумулятора на регистр В | DIV AB | (А),(В) ← (А)/ (В) |
Обозначения в табл.10: V – логическое ИЛИ.
Приведенные команды не требуют пояснения за исключением одной – команды десятичной коррекции аккумулятора (DА А). Эта команда используется только при сложении двух двоично-десятичных[ чисел, хранящихся в аккумуляторе и другой ячейке памяти. Команда корректирует предшествующую ей операцию сложения ADD или ADDC.
Логические команды представлены в табл. 11.
Таблица 11
| НАЗВАНИЕ КОМАНДЫ | МНЕМОНИКА | ОПЕРАЦИЯ |
| Логическое И аккумулятора и регистра (n=0...7) | ANL A,Rn | (А) ← (А) ^ (Rn) |
| Логическое И аккумулятора и прямоадресуемого байта | ANL A,ad | (А) ← (А) ^ (ad) |
| Логическое И аккумулятора c байтoм из внут. ОЗУ (i = 0,1) | ANL A,@Ri | (А) ← (А) ^ (( Ri )) |
| Логическое И аккумулятора и константы | ANL A,#data8 | (А) ← (А) ^ #data8 |
| Логическое И прямоадресуемого байта и аккумулятора | ANL ad,A | (ad) ← (ad) ^ (А) |
| Логическое И прямоадресуемого байта и константы | ANL ad,#data8 | (ad) ← (ad) ^ #data8 |
| Логическое ИЛИ аккумулятора и регистра (n = 0...7) | ORL A,Rn | (А) ← (А) V (Rn) |
| Логическое ИЛИ аккумулятора и прямоадресуемого байта | ORL A,ad | (А) ← (А) V. (ad) |
| Логическое ИЛИ аккумулятора с байтом из внут. ОЗУ (i = 0, 1) | ORL A,@Ri | (А) ← (А) V. (( Ri )) |
| Логическое ИЛИ аккумулятора и константы | ORL A,#data8 | (А) ← (А) V #data8 |
| Логическое ИЛИ прямоадресуемого байта и аккумулятора | ORL ad,A | (ad) ← (ad) V (А) |
| Логическое ИЛИ прямоадресуемого байта и константы | ORL ad,#data8 | (ad) ← (ad) V #data8 |
| Исключающее ИЛИ аккумулятора и регистра (n = 0...7) | XRL A,Rn | (А) ← (А) ИЛИ искл. (Rn) |
| Исключающее ИЛИ аккумулятора и прямоадресуемого байта | XRL A,ad | (А) ← (А) ИЛИ искл. (ad) |
| Исключающее ИЛИ аккумулятoра c байтoм из внут. ОЗУ (i = 0,1) | XRL A,@Ri | (А) ← (А) ИЛИ искл. (( Ri )) |
| Исключающее ИЛИ аккумулятора и константы | XRL A,#data8 | (А) ← (А) ИЛИ искл. #data8 |
| Исключающее ИЛИ прямоадресуемого байта и аккумулятора | XRL ad,A | (ad) ← (ad) ИЛИ искл. (А) |
| Исключающее ИЛИ прямоадресуемого байта и константы | XRL ad,#data8 | (ad) ← (ad) ИЛИ искл. #data8 |
| Сброс аккумулятoра | CLR A | (А) ← 0 |
| Инверсия аккумулятора | CPL A | (А) ← (инв. А) |
| Сдвиг аккумулятора влево циклический | RL A | (А.n+1) ← (А.n), n=0-6; (А.0) ← (А.7) |
| Сдвиг аккумулятора влево через перенос | RLC A | (А.n+1)← (А.n), n=0-6; (А.0)←(С); (С)←(А.7) |
| Сдвиг аккумулятора вправо циклический | RR A | (А.n) ← (А.n+1), n=0-6; (А.7) ← (А.0) |
| Сдвиг аккумулятора вправо через перенос | RRC A | (А.n)←(А.n+1), n=0-6; (А.7)←(С); (С) ←(А.0) |
| Обмен местами тетрад в аккумуляторе | SWAP A | (А.1, А.1, А.2, А.З) ↔ (А.4, А.5, А:6, А.7) |
Обозначения в табл.11: V – логическое ИЛИ; ^ – логическое И;
Команды с битами представлены в табл. 12
Таблица 12
| НАЗВАНИЕ КОМАНДЫ | МНЕМОНИКА | ОПЕРАЦИЯ |
| Сброс переноса | CLR C | (С) ← 0 |
| Сброс бита | CLR bit | (bit) ← 0 |
| Установка переноса | SEТВ С | (С) ← 1 |
| Установка бита | SEТВ bit | (bit) ← 1 |
| Инверсия переноса | CPL C | (С) ← инв. (С) |
| Инверсия бита | CPL bit | (bit) ←инв. (bit) |
| Логическое И бита и переноса | ANL C,bit | (С) ← (С) ^ (bit) |
| Логическое И инверсии бита и переноса | ANL C,/bit | (С) ← (С) ^ инв.(bit) |
| Логическое ИЛИ бита и переноса | ORL C,bit | (С) ← (С) V (bit) |
| Логическое ИЛИ инверсии бита и переноса | ORL C,/bit | (С) ← (С) Vинв.(bit) |
| Пересылка бита в перенос | MOV C,bit | (С) ← (bit) |
| Пересылка переноса в бит | MOV bit,С | (bit) ← (С) |
Примечание к табл. 12. Если в качестве операнда bit используется бит аккумулятора, то его мнемоническое обозначение следует представлять в виде ACC.n (n=0÷7).
Группа команд передачи управления указана в табл. 13
Таблица 13
| НАЗВАНИЕ КОМАНДЫ | МНЕМОНИКА | ОПЕРАЦИЯ |
| Длинный абсолютный переход в полном объеме памяти программ | LJMP ad16 | (РС) ← ad16 |
| Абсолютный переход внутри двухкилобайтной страницы | АJMP ad11 | (РС) ← (РС)+2, затем (РС 0-10) ← ad11 |
| короткий относительный переход внутри страницы 256 байт | SJMP rel | (РС) ← (РС)+2, затем (РС) ← (РС)+геl |
| Косвенный относительный переход | JMP @A+DPТR | (РС) ← (A)+(DP1R) |
| Переход, если аккумулятор равен 0 | JZ rel | (РС) ← (РС)+2, затем если (А)=0, то (РС)←(РС)+геl |
| Переход, если аккумулятор не равен 0 | JNZ rel | (РС)← (РС)+2,затем если (А)<>0,то (РС)←(РС)+rеl |
| Переход, если перенос равен единице | JC rel | (РС)← (РС)+2, затем если (C)=1,то (РС)←(РС)+rеl |
| Переход, если перенос равен нулю | JNC rel | (РС)← (РС)+2, затем если (C)=0,то (РС)←(РС)+rеl |
| Переход, если бит равен единице | JB bit,rel | (РС)← (РС)+3, затем если bit=1,то (РС)←(РС)+rеl |
| Переход, если бит равен нулю | JNB bit,rel | (РС)← (РС)+3, затем если bit=0,то (РС)←(РС)+rеl |
| Переход, если бит установлен, с последующим сбросом бита | JBC bit,rel | (РС)← (РС)+3, затем если bit=1, то (РС)←(РС)+rеl, (bit) ← 0 |
| Декремент регистра и переход, если не нуль | DJNZ Rn,rel | (РС) ← (РС)+2, (Rn) ← (Rn) -1, затем если (Rn)<>0, то (РС) ← (РС)+геl |
| Декремент прямоадресуемого байта и переход, если не нуль | DJNZ ad,rel | (РС) ← (РС)+2, (ad) ← (ad) -1, затем если (ad)<>0, то (РС) ← (РС)+геl |
| Сравнение аккумулятора с прямоадресуемым байтом и переход, если не равно | CJNE A,ad,rel | (РС) ← (РС)+3, если (А)<> (ad), то (РС) ← (PC)+rel, при этом если (A) < (ad), то (С) ← 1, иначе (С) ← 0 |
| Сравнение аккумулятора с константой и переход, если не равно | CJNE A,#data8,rel | (РС)←(РС)+З, если (A)<>#data8, то (РС) ←(PC)+rel,при этом если (A)<#data8. то (С) ← 1, иначе (С) ←0 |
| Сравнение регистра с константой и переход, если не равно | CJNE Rn,#dаtа8,геl | (РС)←(РС)+З, если (Rn)<>#data8, то (РС) ←(PC)+rel, при этом если (Rn)<#data8. то (С) ← 1, иначе (С) ←0 |
| Сравнение байта во внутреннем ОЗУ с константой и переход, если не равно | CJNE @Ri,#data8,rel | (РС)←(РС)+З, если ((Ri))<>#data8, то (РС) ←(PC)+rel, при этом если ((Ri))<#data8. то (С) ← 1, иначе (С) ←0 |
| Длинный абсолютный вызов подпрограммы | LCALL ad16 | (РС) ← (РС)+3; (SP) ← (SP)+1 и ((SP)) ← (РС 0-7); затем (SP) ← (SP)+1 и ((SP)) ← (РС 8-15); затем (РС) ← ad16 |
| Абсолютный вызов подпрограммы внутри двухкилобайтной страницы | ACALL ad11 | (РС) ← (РС)+3; (SP) ← (SP)+1 и ((SP)) ← (РС 0-7);затем (SP) ← (SP)+1 и ((SP)) ← (РС 8-15); затем (РС 0-10) ← ad11 |
| Возврат из подпрограммы | RET | (РС 8-15) ← ((SP)); (SP) ← (SP)-1; затем (РС 0-7) ← ((SP)); (SP) ← (SP)-1 |
| Возврат из подпрограммы обработки прерывания | RETI | (РС 8-15) ← ((SP)); (SP) ← (SP)-1; затем (РС 0-7) ← ((SP)); (SP) ← (SP)-1 |
| Холостая команда | NOP | (PC) ← (PC)+1 |
Примечание к табл. 13. Под символическим обозначением операнда ad16, ad11, rel в командах прикладной программы, как правило, используется имя метки. Некоторые ассемблеры MCS 51 позволяют использовать вместо команд безусловных переходов LJMP, AJMP, SJMP обобщенную команду JMP. В противном случае можно для все случаев рекомендовать к применению команду LJMP.
Команды, модифицирующие флаги результата.
Регистр состояния микроконтроллера PSW содержит 4 флага:CY – переноса, АС – вспомогательного переноса, ОV – переполнения, и Р – флаг паритета.
Флаг АС устанавливается в случае, если при выполнении операций сложения или вычитания между тетрадами байта аккумулятора возник перенос или заем.
Флаг CY устанавливается, если перенос или заем возникает в старшем бите результата. При выполнении операций умножения и деления флаг CY сбрасывается.
Флаг OV устанавливается, если результат операции сложения или вычитания не укладывается в семи младших битах аккумулятора, и содержимое старшего бита изменяется в сравнении с исходным. Флаг устанавливается также если результат умножения больше 255 или в случае деления на 0. Если делитель не равен нулю, то независимо от результата деления флаг OV сбрасывается.
Флаг паритета Р зависит от текущего значения аккумулятора. Если число единичных бит аккумулятора нечетное, то флаг Р устанавливается в 1, а если нечетное – то сбрасывается.
В табл. 14 перечислены команды, при выполнении которых происходит модификация перечисленных флагов. Следует отметить, что отсутствующий в табл. 14 флаг паритета модифицируют все команды, изменяющие состояние аккумулятора. В табл. 14 также не приведены:
– команды, в которых местом назначения результата является регистр состояния PSW или его отдельные биты;
– команды операций над битами регистра PSW.
Таблица 14
| КОМАНДЫ | МОДИФИЦИРУЕМЫЕ ФЛАГИ |
| ADD | CY,OV,AC |
| ADDC | CY,OV,AC |
| SUBB | CY,OV,AC |
| MUL | CY=0, OV |
| DIV | CY=0, OV |
| DA A | CY |
| RRC | CY |
| RLC | CY |
| SETB C | CY=1 |
| CLR C | CY=0 |
| CPL C | CY = /CY |
| ANL C,bit | CY |
| ANL C,/bit | CY |
| ORL C,bit | CY |
| ORL C,/bit | CY |
| MOV C,bit | CY |
| CJNE | CY |