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

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

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

не влияет. Команда MOV допускает 15 комбинаций адресации байта-источника и байта-назначения.

1. MOV A,Ri , где Ri - один из регистров R0 - R7, (A) (Ri).

Пример: ;До выполнения команды: (A)=EEH, (R5) = 3FH. MOV A,R5 ;

;После выполнения команды: (A)=3FH, (R5) = 3FH.

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

(A)<direct>.

Примеры: ;До выполнения команд: (Р1)=0FFH, (ОЗУ[2EH])=5BH, (PSW)=01H. MOV A,P1 ;пересылка состояния порта Р1 в аккумулятор, (A) =0FFH. MOV A,2EH ; переслать в А содержимое 2ЕН ячейки ОЗУ, (A)=5BH.

MOV A,PSW;переслать в А содержимое регистра состояния PSW, (A)=01H.

;После выполнения команд:(A)=01H, (Р1)=0FFH,(ОЗУ[2EH])=5BH, (PSW)=01H.

3.

MOV A,@Ri , где Ri – один из регистров R0 или R1, (A) ((Ri)).

Пример: ;До выполнения команд: (ОЗУ[20H])=01H, (ОЗУ[21H])=02H, (R0)=20H,

(R1) = 21H.

 

 

MOV A,@R0 ;

(А) = 01Н.

 

MOV A,@R1 ;

(А) = 02Н.

 

;После выполнения команд: (А)=02Н, : (ОЗУ[20H])=01H, (ОЗУ[21H])=02H.

4.

MOV A,#<data> , (А) <data>.

Пример: ; До выполнения команды: (А)=0ААН.

MOV A,#11H ;

;После выполнения команды: (А) =11Н.

5.MOV Ri,A , где Ri - один из регистров R0 - R7, (Ri) (A).

Пример: ; До выполнения команды: (А)=5EH, (R7)= 34H. MOV R7,A ;

;После выполнения команды: (А)=5ЕН, (R7) =5EH.

6.

MOV Ri ,<direct> ,

(Ri) <direct>.

Пример:

;До выполнения команды: (Р3) =0FH, (R3) =0AAH.

 

MOV R3,P3 ;

 

 

 

; После выполнения команды: (Р3)=0FH, (R3)=0FH.

7.

MOV Ri ,#<data> ,

(Ri) <data>.

Пример:

;До выполнения команды: (R6) = 00H

 

MOV R6,#45H ;

 

 

 

;После выполнения команды: (R6) =45H.

8.

MOV <direct>, A ,

<direct> (A).

21

Пример: ; До выполнения команды: (А)=12Н, (Р2) = 0FFH. MOV P2,A ;

;После выполнения команды: (А)=12Н, (Р2) = 12H.

9. MOV <direct>,Ri ,

<direct> (Ri).

Пример:

; До выполнения команды: (TLO)=61H, (R5)=0AEH.

 

MOV TLO,R5 ;

 

 

; После выполнения команды: (TLO)=0АЕH, (R5)=0AEH.

10. MOV <direct>, <direct>,

<direct> <direct>.

Пример:

; До выполнения команды: (P2)=00H, (P1)= 22H.

 

MOV P2,P1 ;

 

;После выполнения команды: (P2)=22H, (P1)= 22H.

11.MOV <direct>,@Ri , <direct> ((Ri)).

Пример: ;До выполнения команды: (ОЗУ[70H])=5AH, (R1)=70H, (TH0)=23H. MOV TH0,@R1 ;

;После выполнения команды: (ОЗУ[70H])=5AH, (R1)=70H, (TH0)=5AH.

12. MOV <direct>,#<data>, <direct> <data>.

Пример: ;До выполнения команды: (P0) =55H. MOV P0,#0F0H ;

; После выполнения команды: (Р0)=0F0H.

13. MOV @Ri ,A , ((Ri)) A.

Пример: ;До выполнения команды: (A)=19H, (R0)=40H, (ОЗУ[40H])=99H. MOV @R0,A ;

;После выполнения команды: (A)=19H, (R0)=40H, (ОЗУ[40H])=19H.

14. MOV

@Ri ,<direct> ,

((Ri)) <direct>.

Пример: ; До выполнения команды: (TL1)=0B1H, (ОЗУ[19H])=02H, (R1)=19H.

MOV @R1,TL1 ;

 

;После выполнения команды: (TL1)=0B1H, (ОЗУ[19H])=0B1H, (R1)=19H.

15. MOV @Ri , #<data> ,

((Ri)) <data>.

Пример: ;До выполнения команды: (ОЗУ[7AH]) = 13H, (R0)=7AH.

MOV @R0,#0EEH ;

 

;После выполнения команды: (ОЗУ[7AH]) = 0EEH, (R0)=7AH.

Команда

MOV С, <bit >.

 

Команда

“ переслать бит данных” пересылает значение прямоадресуемого

бита в разряд переноса С, который указан в первом операнде.

Алгоритм:

(С) (bit).

 

Команда

MOV <bit>, C.

 

22

Команда

“ переслать бит данных” пересылает значение бита переноса С в

прямоадресуемый бит, который указан в первом операнде.

Алгоритм:

(bit) (C).

 

 

Пример: ;До выполнения команд:(P3.0)=0, (ACC.5)=0, (ОЗУ[2CH.3])=0,(С)=1.

 

 

MOV

P3.0,C

;

 

 

 

MOV

ACC.5,C ;

 

 

 

MOV

2CH.3,C ;

 

; После выполнения команд: (P3.0)=1, (ACC.5)=1,(ОЗУ[2CH.3])=1,(С)=1.

Команда MOV DPTR,#<data>.

 

Команда

“загрузить указатель данных 16 -

битовой константой” загружает

указатель регистр DPTR шестнадцатиразрядной

константой, указанной в 2 и 3

байтах команды.

 

 

 

Алгоритм:

(DPTR) (data), (DPL) (data[7-0]), (DPH) (data[15-8]).

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

 

MOV DPTR,#0300H ;

 

 

 

; После выполнения команды: (DPTR) = 0300H.

Команда

MOVC A,@A+DPTR.

 

Команда

“переслать байт

из памяти программ ” загружает в аккумулятор

байт кода или константу из ПЗУ. Адрес считываемого байта вычисляется как сумма восьмибитного содержимого аккумулятора и шестнадцатиразрядного содержимого DPTR. На флаги команда не влияет.

Алгоритм: (A) ((A) + (DPTR)).

Пример: ;До выполн. команды: (A) = 0BH, (DPTR) = 0300H, (ПЗУ[030BH]) = 23H. MOVC A,@A+DPTR ;

;После выполнения команды: (A) = 23H, (DPL)=0BH, (DPH)=03H.

Команда MOVC A,@A + PC.

Команда “переслать байт из памяти программ ” загружает в аккумулятор байт кода или константу из ПЗУ. Адрес считываемого байта вычисляется как сумма восьмибитного содержимого аккумулятора и шестнадцатиразрядного содержимого счетчика команд. На флаги команда не влияет.

Алгоритм: (A) ((A) + (PC)).

Команда MOVX <байт приемника>,<байт источника>.

Команда “переслать во внешнюю память ( из внешней памяти ) данных (ОЗУ) ” пересылает данные между аккумулятором и байтом внешней памяти данных. Имеются два типа команд, которые обеспечивают восьмибитовый или шестнадцатибитовый косвенный адрес при обращении к ячейке внешнего ОЗУ. В первом случае адрес указывается в регистрах указателях R0 или R1, адрес выставляется в мультиплексном порте Р0, микросхема внешнего ОЗУ должна иметь информационную емкость не более 256 байт. Во втором случае адрес внешней ячейки памяти данных указывается в DPTR и выставляется в двух пор-

23

тах в Р0 (младший байт) и в Р2 (старший байт). В этом случае максимальный объем адресуемой памяти может быть 64 кБайта.

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

1. MOVX

A,@Ri , где Ri или R0 или R1 (A) (внешнее RAM((Ri))).

2.

MOVX

A,@DPTR ,

(A) (внешнее RAM ((DPTR))).

3.

MOVX

@Ri ,A ,

(внешнее RAM((Ri))) (A).

4.

MOVX

@DPTR,A ,

(внешнее RAM((DPTR))) (A).

Примеры:

;До выполнения команды:

; (DPTR)=0300H, (внешнее RAM(0300H))=4CH, (A) =00. MOVX A,@DPTR ;

;После выполнения команды:

;(A) = 4CH.

Команда MUL AB.

Команда “умножение” умножает восьмибитное целое без знака в аккумуляторе на восьмибитное целое без знака в регистре В. Старший байт 16-битного произведения помещается в регистр В, а младший байт в аккумулятор. Если результат произведения больше 255, то устанавливается флаг переполнения OV, в противном случае OV = 0. Флаг переноса С сбрасывается всегда.

Алгоритм: (А[7-0]) (A) *(B), (B[15-8]) (A) * (B).

Пример: ; До выполнения команды:(А)=14H(20DEC), (B)=32H(50DEC). MUL AB ;

;После выполнения команды:(A)=0E8H, (B)=03H. ; (03E8H) = (1000DEC).

Команда NOP.

Команда “нет операции” не выполняет никаких операций, не влияет на флаги. Команда используется для создания задержек, NOP выполняется за 1 мкс ( при fBQ=12 МГц).

Алгоритм: (PC) (PC) + 1.

Команда ORL <байт назначения>,< байт источника>.

Команда “ логическое ИЛИ ” для переменных байтов выполняет операцию логического “ИЛИ” над битами указанных переменных байтов, записывая результат в байт назначения. Команда не влияет на флаги.

Имеются следующие команды:

1. ORL A,Ri; (A) (A) (Ri), где Ri – один из регистров R0 – R7.

Пример: ; До выполнения команды

; (A) = 0FEH, (R6) = 0C5H. ORL A,R6 ;

;После выполнения команды

;(A) = 0FFH, (R6) =0C5H

24

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

Пример: ; До выполнения команды

; (A) = 0A3H, (P1) = 86H. ORL A,P1 ;

;После выполнения команды

;(A) = 0A7H, (R6) =86H

3. ORL <direct>,A ; (<direct>) (<direct>) (A).

Пример: ; До выполнения команды

; (A) = 0FEH, (P1) = 0C5H. ORL P1,A ;

;После выполнения команды

;(A) = 0FEH, (P1) =0C5H

4. ORL <direct>,#<data>; (<direct>) (<direct>) (<data>), где data –

байтовое непосредственное данное, входящее в код операции (КОП). Пример: ; До выполнения команды

; (P1) = 0F0H. ORL P1,#73H ;

;После выполнения команды

;(P1) = 0F3H.

5. ORL A,#<data>; (A) (A) (<data>).

Пример: ; До выполнения команды

; (A) = 00H. ORL A,#0DDH ;

;После выполнения команды

;(A) = 0DDH.

6. ORL A,@Ri ;

(A) (A) ((Ri)).

 

Пример: ; До выполнения команды: (A) = 07H, (R1) =21H, (ОЗУ[21H])=0FFH.

ORL A,@R1 ;

 

;После выполнения команды: (A) = 0FFH, (R1) =21H, (ОЗУ[21H])=0FFH.

Команда

ORL C,< бит источника >.

 

Команда

“ логическое “ИЛИ” для переменных

битов” выполняет операцию

логического “ИЛИ” над указанными битами.

 

Алгоритм:

(С) (С) (<bit>), где bit – прямоадресуемый бит источни-

ка.

 

 

 

Команда ORL C,/<bit>.

 

Команда

“ логическое “ИЛИ” для переменных

битов” выполняет операцию

логического

“ИЛИ” над битом переноса и инверсией прямоадресуемого бита.

Сам бит источника не изменяется.

25

Алгоритм: (С) (С) /(<bit>), где bit – прямоадресуемый бит источни-

ка.

Пример: ;До выполнения команды: (С)=0, (Р3)=11111110B.

ORL C,/P3.0 ;

; После выполнения команды: (С)=1, (Р3)=11111110В.

Команда POP <direct>.

Команда “ чтение из стека ” считывает содержимое ячейки ОЗУ, которая ад-

ресуется с помощью указателя стека,

в прямоадресуемый байт, при этом указа-

тель стека уменьшается на единицу. Команда на флаги не воздействует.

Алгоритм:

<direct> ((SP)),

(SP) (SP) – 1.

Пример: ; До выполнения команд: (SP)=0BH, (TL0)=0ABH, (TH0)=0FFH. ; (ОЗУ[0BH])=55H, (ОЗУ[0AH])=0AAH.

POP TL0 ;Загрузить из стека TL0,

POP TH0 ;Загрузить из стека TH0.

;После выполнения команд: (SP)=09H, (TL0)=55H, (TH0)=0AAH.

;(ОЗУ[0BH])=55H, (ОЗУ[0AH])=0AAH.

Команда PUSH <direct>.

Команда “ запись в стек ” увеличивает указатель стека на единицу. После этого содержимое указанного байта копируется в ячейку внутреннего ОЗУ, адресуемой посредством указателя стека. На флаги команда не влияет.

Алгоритм: (SP) (SP) + 1, ((SP)) <direct>.

Пример: ; До выполнения команд: (SP)=07H, (DPTR)=030AH. PUSH DPL ;

PUSH DPH ;

;После выполнения команд: (SP)=09H, (DPTR)=030AH, ; (ОЗУ[08H])=0AH, (ОЗУ[09H])=03H.

Команда RET.

Команда “ возврат из подпрограммы ” последовательно выгружает старший и младший байты счетчика команд из стека, уменьшая указатель стека на 2. Выполнение основной программы продолжается по адресу команды, следующей за ACALL или LCALL. На флаги команда не влияет.

Алгоритм: (PC[15 - 8]) ((SP)), (SP) (SP) – 1, (PC[7 - 0]) ((SP)), (SP) (SP) – 1.

Команда RETI.

Команда “возврат из подпрограммы обслуживания прерывания” выгружает старший и младший байты счетчика команд из стека и устанавливает логику прерываний, разрешая прием других прерываний с уровнем приоритета, равным уровню приоритета только что обработанного прерывания. Указатель стека

26

(PC[15 - 8]) ((SP)), (SP) (SP) – 1, (PC[7 - 0]) ((SP)), (SP) (SP) – 1.

уменьшается на 2. PSW не восстанавливается автоматически. Выполнение основной программы продолжается с команды, следующей за командой, на которой произошел запрос на прерывание системы. Если при выполнении команды RETI обнаружено прерывание с таким же или меньшим уровнем приоритета, то одна команда основной программы успевает выполниться до обработки такого прерывания.

Алгоритм:

Команда RL A.

Команда “ сдвиг содержимого аккумулятора влево ” сдвигает 8 бит аккумулятора на один бит влево, 7 - й бит посылается на место бита 0. На флаги эта команда не влияет.

Алгоритм: (A[N+1]) (A[N]), где N =0 - 6, (A[0]) (A[7]).

Пример: ; До выполнения команды: (А) =10000001B=81H. RL A;

; После выполнения команды: (A)=00000011B=03H.

Команда RLC A.

Команда “ сдвиг содержимого аккумулятора влево через флаг переноса С ” сдвигает восемь бит аккумулятора и флаг переноса влево на один бит. Содержимое флага переноса помещается на место бита 0 аккумулятора, а содержимое бита 7 переносится в бит С. На другие флаги эта команда не влияет.

Алгоритм: (A[N+1]) (A[N]), где N = 0 – 6, (A[0]) (C),

(C) (A[7]).

Пример: ; До выполнения команды: (A)=01000111B=47H, (C)=1. RLC A ;

; После выполнения команды: (A)=10001111B=8FH, (C)=0.

Команда RR A.

Команда “сдвиг содержимого аккумулятора вправо ” сдвигает вправо на один бит все восемь бит аккумулятора. Содержимое бита 0 помещается на место бита 7. На флаги эта команда не влияет.

Алгоритм: (A[N]) (A[N+1]), где N=0 – 6. (A[7]) (A[0]).

Пример: ; До выполнения команды: (A)=11010110B=0D6H, (C)=1.

RRA ;

;После выполнения команды: (A)=01101011B=6BH, (C)=1.

Команда RRC A.

Команда “ сдвиг содержимого аккумулятора вправо через флаг переноса ” сдвигает восемь бит аккумулятора и флаг переноса на один бит вправо. Бит 0 пе-

27

ремещается в флаг переноса С, а содержимое флага С помещается в бит 7. На флаги эта команда не влияет.

Алгоритм: (A[N]) (A[N+1]), где N = 0 – 6, (A[7]) (C),

(C) (A[0]).

Пример: ; До выполнения команды: (A)=10010101B=95H, (C)=0.

RRС A ;

; После выполнения команды: (A)=01001010B=4АH, (C)=1.

Команда SETB <bit>.

Команда “установить бит” устанавливает указанный бит в “1”.

1.

SETB C,

(C) 1.

2.

SETB <bit>, где <bit> - прямоадресуемый бит, (bit) 1.

Примеры:

; До выполнения команд: (С)=0, (Р3.4)=0, (20Н.2)=0, (A)=00.

SETB ACC.1; SETB C; SETB P3.4; SETB 20H.2;

; После выполнения команд: (С)=1, (Р3.4)=1, (20Н.2)=1, (A)=02H.

Команда SJMP <addr>.

Команда “ короткий безусловный переход по адресу” выполняет ветвление в программе по указанному адресу. Адрес ветвления вычисляется сложением смещения со знаком во втором байте команды с содержимым счетчика команд после прибавления к нему 2. Таким образом, адрес перехода должен находиться в диапазоне от 128 байт, предшествующих команде, до 127 байт, следующих за ней.

Алгоритм: (PC) <addr>.

Команда SUBB A,<байт источника>.

Команда “ вычитание с заемом ” вычитает указанную переменную вместе с флагом переноса из содержимого аккумулятора. Команда устанавливает флаг С, если вычитаемое больше уменьшаемого, в противном случае флаг С = 0. Флаг вспомогательного переноса АС устанавливается, если заем необходим для бита 3, и сбрасывается в противном случае. Флаг переполнения OV необходим, если заем необходим для бита 6, но его нет для бита 7 или есть для бита 7, но нет для бита 6.

Алгоритм: (A) (A) - <байт источника> - (С).

Рассмотрим имеющиеся команды вычитания с заемом.

1. SUBB A,Ri , где Ri - один из регистров R0 – R7, (A) (A) – (Ri) – (C).

Пример: ;До выполнения команды: (А)=0C9H, (R4)=54H, (C)=1. SUBB A,R4;

;После выполнения команды: (A)=74H, (R4)=54H, (C)=0, (AC)=0, (OV)=1.

28

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

функций. (A) (A) - <direct> - (C).

Пример: ;До выполнения команды: (А)=97H, (P3)=25H, (C)=0. SUBB A,P3;

;После выполнения команды: (A)=72H, (P3)=25H, (C)=0, (AC)=0, (OV)=1.

3.SUBB A,@RI ,где Ri - один из регистров R0 или R1, (A) (A) – (Ri) – (C).

Пример: ;До выполнения команды: (А)=49H, (ОЗУ[21H])=68H, (C)=1, (R0)=21H.

SUBB A,@R0;

;После выполнения команды: (A)=0E0H, (ОЗУ[21H])=68H, (C)=1, (AC)=0, (OV)=0, (R0)=21H.

4.SUBB A,#<data> , (A) (A) - <data> (C).

Пример: ;До выполнения команды: (А)=0BEH, (C)=0. SUBB A,#3FH;

;После выполнения команды: (A)=7FH, (C)=0, (AC)=1, (OV)=1.

Команда SWAP A.

Команда “ обмен тетрадами внутри аккумулятора” осуществляет обмен между четырьмя младшими и четырьмя старшими битами аккумулятора. На флаги команда не влияет.

Алгоритм: (A[3-0]) (A[4-7]), (A[7-4]) (A[3-0]).

Пример: ;До выполнения команды: (А)=0BEH=10111110B. SWAP A;

;После выполнения команды: (A)=11101011B=0EBH.

Команда XCH A,<байт>.

Команда “обмен содержимого аккумулятора с переменным байтом ” осуществляет обмен содержимого аккумулятора с содержимым источника, указанного в команде.

Алгоритм: (A) <байт>, <байт> (А).

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

1. XCH A,Ri , где Ri - один из регистров R0 – R7, (A) (Ri).

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

3. XCH A,@Ri , где Ri - один из регистров R0 или R1. (A) ((Ri)).

29

Пример: ;До выполнения команд: (A)=05H, (P2)=0FFH, (ОЗУ[20H])=0AAH, (R0)=20H, (R5)=0CCH.

XCH A,R5; (A)=0CCH, (R5)=05H. XCH A,P2; (A)=0FFH, (P2)= 0CCH.

XCH A,@R0; (A)=0AAH, (ОЗУ[20H])=0FFH.

;После выполнения команд: (R5)=05H, (P2)=0CCH, (A)=0AAH, (ОЗУ[20H])=0FFH.

Команда XCHD A,@Ri .

Команда “ обмен тетрадой ” выполняет обмен младшей тетрады аккумулятора с содержимым младшей тетрады ячейки внутреннего ОЗУ, косвенная адресация к которой производится с помощью указанного регистра. На старшие биты [7- 4] эта команда не влияет.

Алгоритм: XCHD A,@Ri , где Ri – один из регистров R0 или R1, (A[3-0]) ((Ri[3-0])),

((Ri[3-0])) (A[3-0]).

Пример: ;До выполнения команды: (A)=89H, (R0)=20H, (ОЗУ[20H])=0FEH. XCHD A,@R0;

;После выполнения команды: (A)=8EH, (R0)=20H, ,(ОЗУ[20H])=0F9H.

Команда XRL <байт назначения>, <байт источника>.

Команда “логическое “ИЛИ ИСКЛЮЧАЮЩЕЕ” для переменных байтов” выполняет операцию “ ИЛИ ИСКЛЮЧАЮЩЕЕ ” над битами указанных переменных, записывая результат в байт назначения. На флаги команда не влияет.

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

1.XRL A,Ri , где Ri - один из регистров R0 – R7, (A) (A) (Ri).

Пример: ; До выполнения команды: (A)=0C3H, (R7)=0AAH. XRL A,R7;

;После выполнения команды: : (A)=69H, (R7)=0AAH.

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

функций. (A) (A) <direct>.

Пример: ; До выполнения команды: (A)=0FH, (P2)=0A6H. XRL A,Р2;

;После выполнения команды: : (A)=0A9H, (P2)=0A6H.

3.XRL A,@Ri , где Ri – один из регистров R0 или R1, (A) (A) ((Ri)).

Пример: ; До выполнения команды: (A)=55H, (R0)=77H, (ОЗУ[77])=5AH. XRL A,@R0;

;После выполнения команды: (A)=0FH, (R0)=77H, (ОЗУ[77])=5AH.

4.XRL A, #<data>, (A) (A) <data>.

Пример: ; До выполнения команды: (A)=0C3H.

30