ОБЩИЕ СВЕДЕНИЯ О СИСТЕМЕ КОМАНД

МИКРОКОНТРОЛЛЕРА 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