Общие сведения о системе команд
МИКРОКОНТРОЛЛЕРА 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 |