Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kharakhnin / ПОСОБИЕ_Харахнин.doc
Скачиваний:
278
Добавлен:
08.03.2016
Размер:
17.89 Mб
Скачать

2.2. Команды мк

Рассмотрим мнемонику и назначение команд, представленных в табл. 15.

Таблица 15

Мнемоника

Код

Кол – во байт

Кол – во циклов

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

Продолжение табл. 15

Мнемоника

КОД

Кол-байт

Кол-во циклов

ADD A, RØ

28

1

1

A,R1

29

1

1

A,R2

2A

1

1

A,R3

2B

1

1

A,R4

2C

1

1

A,R5

2D

1

1

A,R6

2E

1

1

A,R7

2F

1

1

ADD A, #data

24

2

1

ADD A, direct

25

2

1

ADD A,@RØ

26

1

1

A,@R1

27

1

1

ADDC A, RØ

38

1

1

A, R1

39

1

1

A, R2

3A

1

1

A, R3

3B

1

1

A, R4

3C

1

1

A, R5

3D

1

1

A, R6

3E

1

1

A, R7

3F

1

1

ADDC A, #data

34

2

1

ADDC A, direct

35

2

1

ADDC A,@RØ

36

1

1

A,@R1

37

1

1

AJMP addr 11

Ø1

2

2

 

21

2

2

 

41

2

2

 

61

2

2

 

81

2

2

 

A1

2

2

 

C1

2

2

 

E1

2

2

ANL A, RØ

58

1

1

A, R1

59

1

1

A, R2

5A

1

1

A, R3

5B

1

1

A, R4

5C

1

1

A, R5

5D

1

1

A, R6

5E

1

1

A, R7

5F

1

1

ANL A, #data

54

2

1

ANL A, direct

55

2

1

ANL A, @RØ

56

1

1

A, @R1

57

1

1

ANL direct,A

52

1

1

ANL direct, #data

53

3

2

ANL C, bit

82

2

2

ANL C, /bit

2

2

CJNE A, # data, addr

B4

3

2

Продолжение табл. 15

Мемоника

КОД

Кол-байт

Кол-во циклов

CJNE A, direct, addr

B5

3

2

CJNE RØ, # data, addr

B8

3

2

R1, # data, addr

B9

3

2

R2, # data, addr

BA

3

2

R3, # data, addr

BB

3

2

R4, # data, addr

BC

3

2

R5, # data, addr

BD

3

2

R6, # data, addr

BE

3

2

R7, # data, addr

BF

3

2

CJNE @RØ, # data, addr

B6

3

2

@RØ, # data, addr

B7

3

2

CLR A

E4

1

1

CLR bit

C2

2

1

CLR C

C3

1

1

CPL A

F4

1

1

CPL bit

B2

2

1

CPL C

B3

1

1

DA A

D4

1

1

DEC A

14

1

1

DEC direct

15

2

1

DEC RØ

18

1

1

R1

19

1

1

R2

1A

1

1

R3

1B

1

1

R4

1C

1

1

R5

1D

1

1

R6

1E

1

1

R7

1F

1

1

DEC @RØ

16

1

1

@R1

17

1

1

DIV AB

84

1

4

DJNZ RØ, addr

D8

2

2

R1, addr

D9

2

2

R2, addr

DA

2

2

R3, addr

DB

2

2

R4, addr

DC

2

2

R5, addr

DD

2

2

R6, addr

DE

2

2

R7, addr

DF

2

2

DJNZ direct, addr

D5

3

2

INC A

Ø4

1

1

INC direct

Ø5

2

1

INC DPTR

A3

1

2

INC RØ

Ø8

1

1

R1

Ø9

1

1

R2

ØA

1

1

R3

ØB

1

1

R4

ØC

1

1

R5

ØD

1

1

Продолжение табл. 15

Мемоника

КОД

Кол-байт

Кол-во циклов

INC R6

ØE

1

1

R7

ØF

1

1

INC @RØ

Ø6

1

1

@R1

Ø7

1

1

JB bit, addr

3

2

JBC bit, addr

3

2

JC addr

2

2

JMP @A+DPTR

73

1

2

JNB bit, addr

3

2

JNC addr

2

2

JNZ addr

2

2

JZ addr

2

2

LCALL addr16

12

3

2

LJMP addr 16

Ø2

3

2

MOV A, direct

E5

2

1

MOV A, RØ

E8

1

1

A,R1

E9

1

1

A,R2

EA

1

1

A,R3

EB

1

1

A,R4

EC

1

1

A,R5

ED

1

1

A,R6

EE

1

1

A,R7

EF

1

1

MOV A, @RØ

E6

1

1

A, @ R1

E7

1

1

MOV A, #data

74

2

2

MOV bit, C

92

2

1

M0V C, bit

A2

2

1

MOV direct, A

F5

2

2

MOV direct, #data

75

3

2

MOV direct, direct

85

3

2

MOV direct, RØ

88

2

2

direct, R1

89

2

2

direct, R2

8A

2

2

direct, R3

8B

2

2

direct, R4

8C

2

2

direct, R5

8D

2

2

direct, R6

8E

2

2

direct, R7

8F

2

2

MOV direct, @RØ

86

2

2

direct, @R1

87

2

2

MOV DPTR, #data 16

3

1

MOV RØ, A

F8

1

1

R1, A

F9

1

1

R2, A

FA

1

1

R3, A

FB

1

1

R4, A

FC

1

1

R5, A

FD

1

1

R6, A

FE

1

1

R7, A

FF

1

1

Продолжение табл. 15

Мемоника

КОД

Кол-байт

Кол-во циклов

MOV @RØ,A

F6

1

1

@R1,A

F7

1

1

MOV RØ, #data

78

2

1

R1, #data

79

2

1

R2, #data

7A

2

1

R3, #data

7B

2

1

R4, #data

7C

2

1

R5, #data

7D

2

1

R6, #data

7E

2

1

R7, #data

7F

2

1

MOV @RØ, #data

76

2

1

@R1, #data

77

2

1

MOV RØ, direct

A8

2

2

R1, direct

A9

2

2

R2, direct

AA

2

2

R3, direct

AB

2

2

R4, direct

AC

2

2

R5, direct

AD

2

2

R6, direct

AE

2

2

R7, direct

AF

2

2

MOV @RØ, direct

A6

2

2

@R1, direct

A7

2

2

MOVC A, @A+DPTR

93

1

2

MOVC A, @A+PC

83

1

2

MOVX A, @DPTR

1

2

MOVX A, @RØ

E2

1

2

A, @R1

E3

1

2

MOVX @DPTR, A

1

2

MOVX @RØ, A

F2

1

2

@R1, A

F3

1

2

MUL AB

A4

1

4

NOP

ØØ

1

1

ORL A, RØ

48

1

1

A, R1

49

1

1

A, R2

4A

1

1

A, R3

4B

1

1

A, R4

4C

1

1

A, R5

4D

1

1

A, R6

4E

1

1

A, R7

4F

1

1

ORL A, direct

45

2

1

ORL A, #data

44

2

1

ORL A,@RØ

46

1

1

A,@R1

47

1

1

ORL C, bit

72

2

2

ORL C, /bit

2

2

ORL direct, A

42

2

1

ORL direct, #data

43

2

2

POP direct

2

2

PUSH direct

2

2

Окончание табл. 15

Мемоника

КОД

Кол-байт

Кол-во циклов

RET

22

1

2

RETI

32

1

2

RL A

23

1

1

RLC A

33

1

1

RR A

03

1

1

RRC A

13

1

1

SETB bit

D2

2

1

SETB C

D3

1

1

SJMP addr

80

2

2

SUBB A,R0

98

1

1

A,R1

99

1

1

A,R2

9A

1

1

A,R3

9B

1

1

A,R4

9C

1

1

A,R5

9D

1

1

A,R6

9E

1

1

A,R7

9F

1

1

SUBB A,#data

94

2

1

SUBB A,direct

95

2

1

SUBB A,@R0

96

1

1

A,@R1

97

1

1

SWAP A

C4

1

1

XCH A,R0

C8

1

1

A,R1

C9

1

1

A,R2

CA

1

1

A,R3

CB

1

1

A,R4

CC

1

1

A,R5

CD

1

1

A,R6

CE

1

1

A,R7

CF

1

1

XCH A,direct

C5

2

1

XCH A,@R0

C6

1

1

A,@R1

C7

1

1

XCHD A,@R0

D6

1

1

A,@R1

D7

1

1

XRL A,R0

68

1

1

A,R1

69

1

1

A,R2

6A

1

1

A,R3

6B

1

1

A,R4

6C

1

1

A,R5

6D

1

1

A,R6

6E

1

1

A,R7

6F

1

1

XRL A,direct

65

1

1

XRL A,#data

64

2

1

XRL A,@R0

66

1

1

XRL A,@R1

67

1

1

XRL direct,A

62

2

1

XRL direct,#data

63

3

2

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

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

; (А) = 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 ;

DJNZ R5,AGAIN ;

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

; На выходе разряда P3.2 будет сформирована серия из четырех прямоугольных импульсов.

Команда INC <байт>.

Команда “инкремент” выполняет добавление единицы к указанной переменной и не влияет на флаги. При значении 0FFH осуществляется переход в 00Н.

Алгоритм: <байт> <байт> + 1.

Рассмотрим команды:

  1. 1. INC A, (A) (A) + 1.

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

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

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

Команда 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. Содержимое А при этом не изменяется. Команда на флаги не влияет.

Алгоритм: Если (А) 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 <байт-назначения>,<байт-источника>.

Команда "переслать переменную-байт" пересылает переменную-байт, указанную во втором операнде, в ячейку, указанную в первом операнде. Содержимое байта источника не изменяется. Эта команда на флаги и другие регистры не влияет. Команда 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.

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

Пример: ; До выполнения команды: (А)=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.

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

Алгоритм: (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 и выставляется в двух портах в Р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

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

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

Алгоритм: (С) (С) /(<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.

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

Алгоритм: (PC[15 - 8]) ((SP)),

(SP) (SP) – 1,

(PC[7 - 0]) ((SP)),

(SP) (SP) – 1.

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

RR A ;

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

Команда RRC A.

Команда “ сдвиг содержимого аккумулятора вправо через флаг переноса ” сдвигает восемь бит аккумулятора и флаг переноса на один бит вправо. Бит 0 перемещается в флаг переноса С, а содержимое флага С помещается в бит 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.

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

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

Пример: ;До выполнения команд: (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.

XRL A,#0F5H;

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

5. XRL <direct>,A <direct> <direct> (A).

Пример: ; До выполнения команды: (A)=31H, (P1)=82H.

XRL P1,A;

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

6. XRL <direct>,#<data> , <direct> <direct> <data>.

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

XRL P1,#77H;

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

В табл.2 приведены команды М, разделенные по группам: команды передачи данных; арифметические команды, логические команды; команды передачи управления, операции с битами.