Kharakhnin / Система команд миконтроллера
.pdfКоманда 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.
11
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 – байтовое непосредственное данное, входящее в код операции (КОП).
12
Рассмотрим пример выполнения одной из команд.
Пример: ;До выполнения команды 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
13
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 ;
14
;После выполнения команды
; (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). 3. 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>.
15
Команда “ сброс бита” сбрасывает указанный бит в 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 ;
16
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 |
3.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).
Рассмотрим имеющиеся команды:
1. DJNZ Ri, <addr>, где Ri - один из регистров R0 или R1.
17
(Ri) (Ri) – 1, если (Ri) 0, то (PC) = (addr).
2.DJNZ <direct>, <addr>, где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н - 7FH) или регистром специальных функций.
<direct> |
<direct> - 1, если <direct> 0, то (РС) = <addr>. |
|
Пример: |
; До выполнения команд (R5) = 08H |
|
AGAIN: CPL P3.2 |
; |
|
|
DJNZ R5,AGAIN ; |
|
|
; После выполнения команд: |
|
|
; На выходе разряда P3.2 будет сформирована серия из |
четырех прямоугольных импульсов.
Команда INC <байт>.
Команда “инкремент” выполняет добавление единицы к указанной переменной и не влияет на флаги. При значении 0FFH осуществляется переход в 00Н.
Алгоритм: <байт> <байт> + 1.
Рассмотрим команды:
1. INC A, (A) (A) + 1.
2. INC Ri , где Ri - один из регистров R0 – R7. (Ri) (Ri) + 1.
3. INC <direct>, где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н - 7FH) или регистром специальных функций.
<direct> <direct> + 1. |
|
4. INC @Ri, где Ri - один из регистров R0 или R1. |
((Ri)) ((Ri)) + 1. |
Пример: ;До выполнения команды: (ОЗУ [20H]) = 2EH. INC 20H ;
;После выполнения команды:
;(ОЗУ[20H]) = 2FH.
Команда INC DPTR .
Команда “ инкремент указателя адреса ячеек ” выполняет инкремент содержимого 16битного указателя DPTR. Прибавление “1” происходит к младшему байту регистра, при DPL = 0FFH происходит перенос “1” в старший байт DPH, при этом младший байт обнуляется. На флаги эта команда не влияет.
Алгоритм: (DPTR) (DPTR) + 1.
Команда не требует пояснения.
Команда JB <bit>, <addr>.
Команда “переход, если бит установлен” выполняет переход по адресу ветвления, если указанный бит равен “1”, в противном случае выполняется следующая команда. Проверяемый бит не изменяется, команда на флаги не влияет.
Алгоритм: если (bit) = 1, то (РС) = (addr), иначе (РС) = (РС) +3.
Пример: ;До выполнения команды: (А) = 59Н, (LOOP)=0200H. JB ACC.3, LOOP ; Переход на метку LOOP, так как ACC.3=1.
; После выполнения команды: (PC)= (0200H).
18
Команда JBC <bit>,<addr>.
Команда “переход, если бит установлен и сброс этого бита” выполняет переход по адресу ветвления, если указанный бит равен “1”, в противном случае выполняется следующая команда, при этом анализируемый бит сбрасывается. Команда на флаги не влияет.
Алгоритм: если |
(bit) = 1, то (РС) = (addr) и (bit)=0, иначе (РС) = (РС) +3. |
Пример: |
;До выполнения команды (Р3.2)=1, (REPEAT)= 03FFH. |
JBC P3.2, REPEAT ;Переход на метку REPEAT, так как Р3.2 = 1.
;После выполнения команды:
;(Р3.2) = 0, (РС) = 03FFH.
Команда JC <addr>.
Команда “переход, если перенос установлен” выполняет ветвление по адресу, если флаг переноса С = 1, в противном случае выполняется следующая команда.
Алгоритм: |
если (С) = 1, то (РС) = (addr), иначе (РС) = (РС) +2. |
Пример: |
; До выполнения команды: (С) = 1, (М) = 07FFH. |
JC |
M ; Переход на метку М, так как (С) = 1. |
|
; После выполнения команды: (РС) = 07FFH. |
Команда JMP @A+DPTR.
Команда “косвенный переход” осуществляет переход по адресу, который получается в результате суммирования содержимого А и содержимого DPTR. При этом содержимое аккумулятора и регистра указателя адреса не меняется.
Алгоритм: (PC) (A)[7-0] + (DPTR)[15-0].
Пример: ;До выполнения команды: (РС) = 00АВН, (А) = 05Н, (DPTR)=0300H. JMP @A+DPTR ; Переход по адресу 0305Н.
; (PC) = 0305H, (A) = 05H, (DPTR) = 0300H.
Команда JNB <bit>, <addr>.
Команда “переход, если бит не установлен” выполняет переход по адресу ветвления, если указанный бит равен “0”, в противном случае выполняется следующая команда. Проверяемый бит не изменяется, команда на флаги не влияет.
Алгоритм: если (bit) = 0, то (РС) = (addr), иначе (РС) = (РС) +3.
Команда JNC <addr>.
Команда “переход, если перенос не установлен” выполняет ветвление по адресу, если флаг переноса С = 0, в противном случае выполняется следующая команда.
Алгоритм: если (С) = 0, то (РС) = (addr), иначе (РС) = (РС) +2.
Команда JNZ <addr>.
Команда “переход, если содержимое аккумулятора не равно нулю” выполняет ветвление по адресу, если содержимое аккумулятора не равно 0. Содержимое А при этом не изменяется. Команда на флаги не влияет.
19
Алгоритм: Если (А) 0, (РС) = (addr), иначе (PC) = (PC) + 2.
Команда JZ <addr>.
Команда “переход, если содержимое аккумулятора равно нулю” выполняет ветвление по адресу, если содержимое аккумулятора равно 0. Содержимое А при этом не изменяется. Команда на флаги не влияет.
Алгоритм: Если (А) = 0, (РС) = (addr), иначе (PC) = (PC) + 2.
Пример: ;До выполнения команд: (А)=01, (TEST)=0100H, (OZU)=0200H.
JZ TEST ;Нет перехода на TEST, так как (А) 0. DEC A ;
JZ OZU ; Переход по адресу 0200H.
; После выполнения: (РС)=0200Н.
Дальность действия команд JB bit, addr, JBC bit, addr, JC addr, JNB bit, addr, JNC addr, JNZ addr, JZ addr ограничена 255 - байтным адресным пространством, 128 байт по убывающим адресам и 127 байт по возрастающим адресам прикладной программы.
Команда LCALL <addr>.
Команда “длинный вызов” вызывает подпрограмму, находящуюся по указанному адресу. По этой команде к счетчику команд прибавляется 3 для получения адреса следующей команды, после чего полученный адрес сохраняется в стеке ( вначале младший байт, затем старший). Содержимое указателя стека увеличивается на 2. Подпрограмма может располагаться в любом месте 64 - килобайтного адресного пространства. На флаги эта команда не влияет.
Алгоритм: (РС)=(РС) + 3,
(SP)=(SP) +1, ((SP)) (PC[7-0]), (SP) = (SP) +1, ((SP)) (PC[15-8]), (PC) = addr[15-0].
Пример: ;До выполнения команды: (SP) = 07H, (KLAV) = 01FFH. LCALL KLAV ; Команда LCALL находится по адресу 0400Н.
;После выполнения команды:
;(SP) =09H, (PC) = 01FFH, (ОЗУ[08])= 03Н, (ОЗУ[09])=04Н.
Команда LJMP <addr>.
Команда “длинный переход” выполняет безусловный переход по указанному адресу. Адрес перехода может находиться в любом месте 64 - килобайтного пространства. На флаги команда не влияет.
Алгоритм: (PC) <addr[15-0]>.
Команда MOV <байт-назначения>,<байт-источника>.
Команда "переслать переменную-байт" пересылает переменную-байт, указанную во втором операнде, в ячейку, указанную в первом операнде. Содержимое байта источника не изменяется. Эта команда на флаги и другие регистры
20