Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Kharakhnin / Система команд миконтроллера

.pdf
Скачиваний:
38
Добавлен:
08.03.2016
Размер:
1.36 Mб
Скачать

Команда 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