- •С и с т е м а к о м а н д о д н о к р и с т а л ь н ы х м и к р о к о н т р о л л е р о в с е м е й с т в а m c s 5 1 у ч е б н о – м е т о д и ч е с к о е п о с о б и е
- •1. Способы адресации операндов
- •2. Система команд мк
- •Djnz r5,again ;
- •3. Правила написания программ на языке assembler
- •Метка операция операнд(ы) комментарии
- •3.1. Метка
- •3.2. Операция
- •3.3. Операнды
- •3.4. Комментарий
- •Директивы ассемблера
- •4.1. Директивы символических определений
- •Пример:
- •Ozu_org xdata 0800h; Адрес начала области внешнего озу.
- •4.2. Директивы резервирования и инициализации памяти
- •4.3. Директивы управления состоянием ассемблера
- •Задания для самостоятельной проработки материала
2. Система команд мк
Рассмотрим мнемонику и назначение команд, представленных в табл. 1.
Таблица 1
Мнемоника |
Код |
Кол - во байт |
Кол – во циклов |
ACALL addr11 |
11 |
2 |
2 |
|
31 |
2 |
2 |
|
51 |
2 |
2 |
|
71 |
2 |
2 |
|
91 |
2 |
2 |
|
B1 |
2 |
2 |
|
D1 |
2 |
2 |
|
F1 |
2 |
2 |
Продолжение табл. 1
Продолжение табл. 1
Продолжение табл. 1
Продолжение табл. 1
Окончание табл. 1
Команда ACALL addr11.
Команда “абсолютный вызов подпрограммы” вызывает подпрограмму, размещенную по указанному адресу в пределах двухкилобайтного адресного пространства. Счетчик команд увеличивается на 2 для получения адреса следующей команды. После этого полученное 16 – битное значение РС помещается в стек ( сначала младший байт, затем старший), содержимое SP увеличивается на 2. Адрес перехода получается с помощью конкатенации (сцепления) старших битов увеличенного содержимого счетчика команд, битов старшего и младшего байтов команды.
Алгоритм: (PC) (PC) +2
(SP) (SP) + 1
((SP)) (PC0-7)
(SP) (SP) + 1
((SP)) (PC8-15)
(PC0 -10) A10A9A8 II A7A6A5A4A3A2A1A0 II – знак конкатенации.
Пример: До выполнения команды ACALL
; (SP) = 07H
; метка DISPLAY соответствует адресу 0300Н
ACALL DISPLAY ; команда ACALL расположена по адресу 0203Р=Н
; (PC) = 0200H.
; После выполнения команды
; (SP) = 09H, (PC) = 0300H
; ОЗУ (08Н) = 05Н, ОЗУ(09Н) = 02Н
; Адрес 0205Н – адрес возврата в основную программу.
Команда ADD A, <байт - источник>.
Команда “сложение” складывает содержимое аккумулятора А с содержимым байта – источника, результат помещается в А. При возникновении переносов из разрядов 7 и 3 устанавливаются флаги переноса С и вспомогательного переноса АС соответственно, в противном случае флаги сбрасываются. Флаг переполнения OV устанавливается, если есть перенос из бита 6 и нет переноса из бита 7 или есть перенос из бита 7 и нет переноса из бита 6, в противном случае флаг OV сбрасывается.
Алгоритм: (A) (A) + (<байт-источник>).
Возможные варианты команды:
1. ADD A,Ri ; (A) (A) + (Ri),
где Ri – один из регистров R0 – R7
Пример: ; До выполнения команды ADD A,R5
; C=X, OV=X, AC=X, где Х=(0 или 1), (A)=0C3H, (R5)=0AAH
ADD A,R5 ;
;После выполнения команды
;(A)=6DH, (R5)=0AAH.
;(AC)=0, (C)=1, (OV)=1.
2. ADD A,@Ri ; (A) (A) + ((Ri)), где Ri=R0 или R1
Пример: ;До выполнения команды ADD A,@R0
; C=X, OV=X, AC=X, где Х=(0 или 1), (A)=95 H, (R0)=20H,
; (ОЗУ [20H]) = 4CH
ADD A,@R0 ;
;После выполнения команды
;(A)=0E1H, (ОЗУ[20H]) = 4CH,
; (C)=0, (AC) = 1, (OV) =0.
3. ADD A,<direct>; (A) (A) + (<direct>), где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н-7FH) или регистром специальных функций.
Пример: ;До выполнения команды ADD A,80Н
; C=X, OV=X, AC=X, где Х=(0 или 1), (A)=77 H,
; (ОЗУ [80H]) = 0FFH
ADD A,80Н ;
;После выполнения команды
;(A)=76H, (ОЗУ[80H]) = 0FFH,
; (C)=1, (AC) = 1, (OV) =0.
4. ADD A,#<data>; (A) (A) + (<data>), где data – байтовое непосредственное данное, входящее в код операции (КОП).
Пример: ;До выполнения команды ADD A,#0D3Н
; C=X, OV=X, AC=X, где Х=(0 или 1), (A)=09 H,
ADD A,#0D3Н ;
;После выполнения команды
;(A)=0DCH, (C)=0, (AC) = 0, (OV) =0.
Команда ADDC A,<байт источник>.
Команда “сложение с учетом флага переноса” одновременно складывает содержимое А, содержимое байта-источника и бита переноса С. Результат посылается в аккумулятор. При этом флаги переноса и дополнительного переноса устанавливаются, если есть перенос из бита 7 или бита 3, и сбрасываются в противном случае. Флаг переполнения OVустанавливается, если имеется перенос бита 6 и нет переноса бита 7 или есть перенос из бита 7 и нет из бита 6, в противном случаеOVсбрасывается.
Алгоритм: (A) (A) + (<байт - источник>) + (С ).
Возможные варианты команды:
1. ADDC A,Ri ; (A) (A) + (Ri) + (C), где Ri – один из регистров R0 - R7.
2. ADDC A,@Ri ; (A) (A) +((Ri)) + (C), где Ri=R0 или R1.
3. ADDC A,<direct>; (A) (A) +(<direct>) + (C), где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н-7FH) или регистром специальных функций.
4. ADDC A,#<data>; (A) (A) +(<data>) + (C), >), где data – байтовое непосредственное данное, входящее в код операции (КОП).
Рассмотрим пример выполнения одной из команд.
Пример: ;До выполнения команды ADDС A,20Н
; C=X, OV=X, AC=X, где Х=(0 или 1), (A)=11 H,
; (ОЗУ[20H]) = 0DFH, (C)=1
ADDC A,20Н ;
;После выполнения команды
;(A)=0F1H, (ОЗУ[20H]) = 0DFH,
; (C)=0, (AC) = 1, (OV) =0.
Команда AJMP addr11.
Команда “абсолютный безусловный переход” передает управление по указанному адресу, который получается при конкатенации пяти старших бит счетчика команд РС (после увеличения его содержимого на 2), 7-5 битов кода операции и второго байта команды. Адрес перехода должен находиться в пределах двухкилобайтного адресного пространства памяти программы.
Алгоритм: (PC15-0) (PC15-0) + 2.
(PC10-0) (addr11).
Пример: ; До выполнения команды
;(PC) = 0128H.
; Метке AGAIN соответствует адрес 0300Н.
AJMP AGAIN ;
; После выполнения команды
; (PC) = 0300H.
Команда ANL <байт - назначения>,< байт - источник>.
Команда “логическое “И” ” для байтов выполняет операцию логического “И” над битами указанных переменных и размещает результат в байте назначения. Операция не влияет на состояние флагов.
Имеются следующие команды:
1. ANL A,Ri; (A) (A) (Ri), где Ri – один из регистров R0 – R7.
Пример: ; До выполнения команды
; (A) = 0FEH, (R6) = 0C5H.
ANL A,R6 ;
; После выполнения команды
; (A) = 0C4H, (R6) =0C5H
2. ANL A,<direct>; (A) (A) (<direct>), где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н-7FH) или регистром специальных функций.
Пример: ; До выполнения команды
; (A) = 0A3H, (P1) = 86H.
ANL A,P1 ;
; После выполнения команды
; (A) = 82H, (R6) =86H
3. ANL <direct>,A ; (<direct>) (<direct>) (A).
Пример: ; До выполнения команды
; (A) = 0FEH, (P1) = 0C5H.
ANL P1,A ;
; После выполнения команды
; (A) = 0FEH, (P1) =0C4H
4. ANL <direct>,#<data>; (<direct>) (<direct>) (<data>), где data – байтовое непосредственное данное, входящее в код операции (КОП).
Пример: ; До выполнения команды
; (P1) = 0FFH.
ANL P1,#73H ;
; После выполнения команды
; (P1) = 73H.
5. ANL A,#<data>; (A) (A) (<data>).
Пример: ; До выполнения команды
; (A) = 36H.
ANL A,#0DDH ;
; После выполнения команды
; (A) = 14H.
6. ANL A,@Ri ; (A) (A) ((Ri)).
Пример: ; До выполнения команды: (A) = 07H, (R1) =21H, (ОЗУ[21H])=0FFH.
ANL A,@R1 ;
;После выполнения команды: (A) = 07H, (R1) =21H, (ОЗУ[21H])=0FFH.
Команда ANL C,< бит источника >.
Команда “ логическое “И” для переменных битов” выполняет операцию логического “И” над указанными битами. Если бит источника равен нулю, то происходит сброс флага переноса С, в противном случае флаг С не изменяет текущего значения.
Алгоритм: (С) (С) (<bit>), где bit – прямоадресуемый бит источника.
Пример: ; До выполнения команды (С)=1, Р3.0 = 0.
ANL C,P3.0 ;
; После выполнения команды
; (С)=0, Р3.0 =0.
Команда ANL C,/<bit>.
Команда “ логическое “И” между битом переноса и инверсией бита”. Бит источника после выполнения команды не изменяется.
Алгоритм: (C ) ( C ) (</bit>), где bit – прямоадресуемый бит источника.
Пример: ; До выполнения команды
; (С)=1, (ОЗУ[20H.1])=0.
ANL C,/20H.1 ;
;После выполнения команды
; (C)=1, (ОЗУ[20H.1])=0.
Команда CJNE <байт назначения>, <байт источник>, <addr>.
Команда “сравнение и переход, если не равно” сравнивает значения первых двух операндов и выполняет ветвление, если операнды не равны. Адрес ветвления вычисляется при помощи сложения значения (со знаком), указанного в последнем байте команды, с содержимым счетчика команд после увеличения его на три.
Флаг переноса С = 1, если значение целого без знака байта назначения меньше, чем значение целого без знака байта источника, в противном случае С = 0. Команда не оказывает влияния на операнды. Дальность действия команд ограничена 255 байтовым адресным пространством, 128 байт в сторону уменьшения адресов и 127 байт в сторону увеличения.
Рассмотрим имеющиеся команды:
1. CJNE A,<direct>,<addr>, >), где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н-7FH) или регистром специальных функций.
Алгоритм: Если (А) > (direct), то (С)=0 и (PC)=(addr),
Если (А) < (direct), то (С)=1 и (РС) =(addr).
2. CJNE A,#<data>, <addr>, где data – байтовое непосредственное данное, входящее в код операции (КОП).
Алгоритм: Если (А) > (data), то (С)=0 и (PC)=(addr),
Если (А) < (data), то (С)=1 и (РС) =(addr).
CJNE Ri, #<data>,<addr>.
Алгоритм: Если (Ri) > (data), то (С)=0 и (PC)=(addr),
Если (Ri) < (data), то (С)=1 и (РС) =(addr).
4. CJNE @Ri,#<data>,<addr>, где Ri – регистры - указатели ( R0 или R1).
Алгоритм: Если ((Ri)) > (data), то (С)=0 и (PC)=(addr),
Если ((Ri)) < (data), то (С)=1 и (РС) =(addr).
Пример: CJNE A,P3,BACK.
; До выполнения команды:
;(А) = 97Н, (Р3) = 0F0H, (C) = 0, (PC) = 0300H.
;Адрес, соответствующий метке BACK – 02F0H.
CJNE A,P3,BACK ;
; После выполнения команды:
;(А) = 97Н, (Р3) = 0F0H, (C) = 1, (PC) = 02F0H.
Команда CLR A.
Команда “обнуление аккумулятора” обнуляет содержимое А, не влияя на содержимое флагов.
Алгоритм: (A) 00.
Команда CLR <bit>.
Команда “ сброс бита” сбрасывает указанный бит в 0. Эта команда работает с флагом переноса С или с любым прямоадресуемым битом.
Алгоритм: (<bit>) 0.
Примеры: CLR C
; Сброс бита переноса (С) 0.
CLR ACC.1 ; Сброс первого бита аккумулятора, АСС.1 = 0.
CLR P2.7 ; Сброс седьмого бита порта Р2, Р2.7 =0.
CLR 21H.3 ; Сброс третьего бита в 21Н ячейке внутреннего ОЗУ, 21Н.3 = 0.
Команда CPL A.
Команда “инвертировать аккумулятор” инвертирует каждый бит аккумулятора на противоположный. Команда не влияет на содержимое флагов.
Алгоритм: (А) (/A).
Пример: CPL A
;До выполнения команды: (А) = 01Н.
CPL A ;
; После выполнения команды: (А) = 0FEH.
Команда CPL <bit>.
Команда “инвертировать бит ” инвертирует содержимое бита переноса или любого прямоадресуемого бита. На другие флаги команда не влияет.
Алгоритм: (<bit>) (/<bit>).
Примеры: CPL C ; Инвертировать бит переноса, (С) (/C).
; До выполнения команды (С) = 1.
; После выполнения команды (С) = 0.
CPL ACC.3; Инвертировать третий бит аккумулятора.
;До выполнения команды (А) = 0FFH.
; После выполнения команды (A) =0F7H.
CPL 0AH ; Инвертировать второй бит в 21Н ячейке внутреннего
; ОЗУ.
; До выполнения команды (ОЗУ[21H])=5EH.
; После выполнения команды (ОЗУ[21H]) = 5AH.
Команда DA A.
Команда “ десятичная коррекция аккумулятора для сложения” упорядочивает 8- битовую величину в аккумуляторе после выполненной ранее команды сложения двух переменных ( каждая в BCD формате ). При сложении может быть использована любая команда ADD или ADDC. Установка флага переноса С=1 указывает на то, что сумма двух исходных BCD (двоично-десятичных) чисел больше, чем 100.
Алгоритм: Если А3-0 >9 или (АС) = 1, (А3-0) = (А3-0) + 06
Если А7-4 >9 или (С) = 1, (А7-4) = (А7-4) + 60
Примеры: ; До выполнения команд:
; (А) = 56Н, (R2) = 67H, (C) = 1
ADDC A,R2 ;
DA A ; (А) = 0BEH
;После выполнения команд:
; (A) = 24H, (R2) = 67H, (C) = 1.
; C=1 говорит о том, что результат сложения больше
; чем 100, то есть результат равен 124.
2. ;До выполнения команд: (А)=30Н, (С)=0.
ADD A,#99H ;
DA A ; (А) = 0С9Н
;После выполнения команд:
; (А) = 29Н, (С) =1.
; Таким образом, результат равен 129.
Команда DEC <байт>.
Команда “декремент” производит вычитание единицы из указанного операнда. Если операнд равен 00H, то произойдет переход в 0FFH. Эта команда не влияет на флаги.
Алгоритм: <байт> <байт> - 1.
Рассмотрим команды декремента:
1. DEC A , (A) (A) - 1
2. DEC Ri , где Ri - один из регистров R0 - R7. (Ri) (Ri) -1
DEC <direct> , где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н - 7FH) или регистром специальных функций. <direct> <direct> -1
4. DEC @Ri, где Ri или R0 или R1. ((Ri)) ((Ri)) – 1.
Команда DIV AB.
Команда “ деление ” делит 8-битное целое без знака в аккумуляторе А на 8 – битное целое без знака в регистре В. В А посылается целая часть частного, а регистр В – остаток. Флаги переноса С и переполнения OV сбрасываются. Если (А) < (B), то флаг вспомогательного переноса не сбрасывается.
Алгоритм: (А) (А) / (B)[15-8],
(B) (A) / (B)[7-0].
Пример: ; До выполнения команды: (А) = 0FBH, (B) = 12H
DIV AB ;
; После выполнения команды:
; (A) = 0DH, (B) = 11H, (C) = 0, (OV) = 0.
Команда DJNZ <байт>, <addr> .
Команда “декремент и переход, если не равно нулю” выполняет вычитание единицы из содержимого указанного байта и осуществляет ветвление по вычисляемому адресу, если результат не равен нулю. На флаги эта команда не влияет.
Алгоритм: <байт> <байт> - 1,
Если <байт> 0, то (PC) = (addr).
Рассмотрим имеющиеся команды:
DJNZ Ri, <addr>, где Ri - один из регистров R0 или R1.
(Ri) (Ri) – 1, если (Ri) 0, то (PC) = (addr).
DJNZ <direct>, <addr>, где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н - 7FH) или регистром специальных функций.
<direct> <direct> - 1, если <direct> 0, то (РС) = <addr>.
Пример: ; До выполнения команд (R5) = 08H
AGAIN: CPL P3.2 ;