Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kharakhnin / Система команд миконтроллера.doc
Скачиваний:
43
Добавлен:
08.03.2016
Размер:
1.04 Mб
Скачать

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,#0D

; 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).

  1. 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

  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).

Рассмотрим имеющиеся команды:

  1. DJNZ Ri, <addr>, где Ri - один из регистров R0 или R1.

(Ri) (Ri) – 1, если (Ri) 0, то (PC) = (addr).

  1. DJNZ <direct>, <addr>, где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н - 7FH) или регистром специальных функций.

<direct> <direct> - 1, если <direct> 0, то (РС) = <addr>.

Пример: ; До выполнения команд (R5) = 08H

AGAIN: CPL P3.2 ;