- •1. Система команд мікроконтролерів сімейства mcs51.
- •1.1. Загальна характеристика команд.
- •1.2. Команди пересилки даних мікроконтролера mcs51.
- •1.3. Команди логічних операцій мікроконтролера mcs51.
- •1.4. Команди операцій над бітовими змінними мікроконтролера mcs51.
- •1.5. Команди передачі керування мікроконтролера mcs51.
1.2. Команди пересилки даних мікроконтролера mcs51.
Ця група представлена 28 командами, їх короткий опис приведено в табл. 2, де також вказані тип команди (Т) у відповідності з табл. 1, її довжина в байтах (Б) та час виконання команди в машинних циклах (Ц).
Табл. 2. Команди передачі даних
Назва команди |
Мнемокод |
КОП |
Т |
Б |
Ц |
Операция |
Пересилка даних з регістру Rn (n=0÷7) в аккумулятор A |
MOV A, Rn |
11101rrr |
1 |
1 |
1 |
(A) (Rn) |
Пересилка даних з байту ad, що прямо адресується в аккумулятор А |
MOV A, ad |
11100101 |
3 |
2 |
1 |
(A) (ad) |
Пересилка даних з РПД @Ri (i=0,1) в аккумулятор А |
MOV A, @Ri |
1110011i |
1 |
1 |
1 |
(A) ((Ri)) |
Завантаження в аккумулятор константи |
MOV A, #d |
01110100 |
2 |
2 |
1 |
(A) #d |
Пересилка даних з акумулятора в регістр |
MOV Rn, A |
11111rrr |
1 |
1 |
1 |
(Rn) (A) |
Пересилка даних з байту ad, що прямо адресується в регистр Rn (n=0÷7) |
MOV Rn, ad |
10101rrr |
3 |
2 |
2 |
(Rn) (ad) |
Завантаження в регістр Rn (n=0÷7) константи |
MOV Rn, #d |
01111rrr |
2 |
2 |
1 |
(Rn) #d |
Пересилка даних з акумулятора А в байт ad, що прямо адресується |
MOV ad, A |
11110101 |
3 |
2 |
1 |
(ad) (A) |
Пересилка даних з регістру Rn (n=0÷7) в байт ad, що прямо адресується |
MOV ad, Rn |
10001rrr |
3 |
2 |
2 |
(ad) (Rn) |
Пересилка даних з байту ads в байт add |
MOV add, ads |
10000101 |
9 |
3 |
2 |
(add) (ads) |
Пересилка даних з РПД @Ri (i=0,1) в байт ad, що прямо адресується |
MOV ad, @Ri |
1000011i |
3 |
2 |
2 |
(ad) ((Ri)) |
Пересилка константи в байт ad, що прямо адресується |
MOV ad, #d |
01110101 |
7 |
3 |
2 |
(ad) #d |
Пересилка даних з аккумулятора А в РПД @Ri (i=0,1) |
MOV @Ri, A |
1111011i |
1 |
1 |
1 |
((Ri)) (A) |
Пересилка даних з байту ad, що прямо адресується в РПД @Ri (i=0,1) |
MOV @Ri, ad |
0110011i |
3 |
2 |
2 |
((Ri)) (ad) |
Пересилка константи в РПД @Ri (i=0,1) |
MOV @Ri, #d |
0111011i |
2 |
2 |
1 |
((Ri)) #d |
Завантаження даних в вказівник даних DPTR |
MOV DPTR, #d16 |
10010000 |
13 |
3 |
2 |
(DPTR) #d16 |
Пересилка даних з ПП в аккумулятор А |
MOVC A, @A + DPTR |
10010011 |
1 |
1 |
2 |
(А) ((A) +(DPTR)) |
Пересилка даних з ПП в аккумулятор А |
MOVC A, @A + PC |
10000011 |
1 |
1 |
2 |
(PC) (PC)+1, (A) ((A)+(PC)) |
Пересилка даних з ВПД @Ri (i=0,1) в аккумулятор А |
MOVX A, @Ri |
1110001i |
1 |
1 |
2 |
(A) ((Ri)) |
Пересилка даних з ВПД @Ri (i=0,1) в аккумулятор А |
MOVX A, @DPTR |
11100000 |
1 |
1 |
2 |
(A) ((DPTR)) |
Пересилка в ВПД з аккумулятора |
MOVX @Ri, A |
1111001i |
1 |
1 |
2 |
((Ri)) (A) |
Пересилка даних з аккумулятора А в ВПД @Ri (i=0,1) |
MOVX @DPTR, A |
11110000 |
1 |
1 |
2 |
((DPTR)) (A) |
Завантаження даних в стек |
PUSH ad |
11000000 |
3 |
2 |
2 |
(SP) (SP) + 1, ((SP)) (ad) |
Витягнення даних з стеку |
POP ad |
11010000 |
3 |
2 |
2 |
(ad) (SP), (SP) (SP) - 1 |
Обмін вмістимого аккумулятора А з регістром Rn (n=0÷7) |
XCH A, Rn |
11001rrr |
1 |
1 |
1 |
(A) ↔ (Rn) |
Обмін аккумулятора А з байтом ad, що прямо адресується |
XCH A, ad |
11000101 |
3 |
2 |
1 |
(A) ↔ (ad) |
Обмін аккумулятора А з байтом з РПД @Ri (i=0,1) |
XCH A, @Ri |
1100011i |
1 |
1 |
1 |
(A) ↔ ((Ri)) |
Обмін молодших тетрад аккумулятора А та байту РПД @Ri (i=0,1) |
XCHD A, @Ri |
1101011i |
1 |
1 |
1 |
(A0…3) ↔((Ri)0…3) |
Більшість команд, приведених в табл. 2, можна представити у вигляді:
MOV “байт-приймач”, “байт-джерело”.
Команда пересилає дані з байту-джерела в байт-приймач. Вмістиме байту-джерела не змінюється. Ця команда не впливає на прапорці та інші регістри. Команда “MOV” допускає 15 комбінацій адресації байту-джерела та байту–приймача. Нижче наведено приклади цих комбінацій:
1) (A)=DCH, (R4)=54H,
MOV A, R4,
(A)=54H, (R4)=54H.
Вмістиме регістру R4 пересилається в аккумулятор А.
2) (A)=BFH, (40H)=15H
MOV A, 40H
(A)=15H, (40H)=15H
Вмістиме комірки ОЗП 40H пересилається в акумулятор А.
3) (R0)=3AH, (3AH)=1FH, (A)=24H,
MOV A, @R0,
(A)=1FH, (R0)=3AH, `(3AH)=1FH.
Вмістиме комірки ОЗП 3АН, яка адресується регістром R0, пересилається в аккумулятор А.
4) (A)=A5H=1010 0101B,
MOV A, #49H,
(A)=49H=0100 1001B.
Константа 49Н заноситься в аккумулятор А.
5) (А)=2DH, (R7)=5BH,
MOV R7, A,
(A)=2DH, (R7)=2DH.
Вмістиме регістру R7 пересилається в аккумулятор А.
6) (R2)=6DH, (P2)=CCH,
MOV R2, P2,
(R2)=CCH, (P2)=CCH.
Вмістиме порта P2 пересилається в регістр R2.
7) (R3)=FDH,
MOV R3, #49H
(R3)=49H.
Константа 49Н заноситься в регістр R3.
8) (A)=3CH, (P1)=BBH,
MOV P1, A,
(P1)=3CH, (A)=3CH.
Вмістиме аккумулятора А пересилається в порт Р1.
9) (R5)=57H, (30H)=9FH,
MOV 30H, R5,
(30H)=57H, (R5)=57H.
Вмістиме регістра R5 пересилається в комірку ОЗП 30Н.
10) (33H)=45H, (38H)=50H,
MOV 38H, 33H,
(38H)=45H, (33H)=45H.
Вмістиме комірки 33Н пересилається в комірку 38Н.
11) (R0)=25H, (52H)=DFH, (25H)=CCH
MOV 52H, @R0,
(52H)=CCH, (25H)=CCH, (R0)=25H.
Вмістиме комірки ОЗП 25Н, що адресується регістром R0, пересилається в комірку ОЗП 52Н.
12) (4FH)=8DH,
MOV 4FH, #13H
(4FH)=13H.
Константа 13Н заноситься в комірку ОЗП 4FH.
13) (R0)=40H, (40H)=6DH, (A)=88H,
MOV @R0, A,
(40H)=88H, (A)=88H, (R0)=40H.
Вмістиме аккумулятора А пересилається в комірку ОЗП 40Н, що адресується регістром R0.
14) (R1)=37H, (37H)=F5H, (P2)=8CH,
MOV @R1, P2,
(37H)=8CH, (P2)=8CH, (R1)=37H.
Вмістиме порта Р2 пересилається в комірку ОЗП 37Н, що адресується регістром R1.
15) (R0)=40H, (40H)=76H,
MOV @R0, #AAH,
(R0)=40H, (40H)=AAH.
В комірку 40Н, що адресується регістром R0, засилається константа ААН.
16) (DPTR)=35ACH,
MOV DPTR, #1456H,
(DPTR)=1456H, (DPH)=14H, (DPL)=56H.
В регістр DPTR (вказівник даних) завантажується 16-бітна константа 1456Н, вказана в другому та третьому байтах команди. Другий байт команди завантажується в старший байт вказівника даних (DPH), а третій байт – в молодший байт вказівника даних (DPL). Ця команда на прапорці не впливає і є єдиною командою, яка одночасно завантажує 16 біт даних.
17) MOVC A, @A+DPTR
18) MOVC A, @A+PC
Ці команди завантажують в аккумулятор байтом коду чи константою з ПП. Адрес цього байту обчислюється як сума 8-бітного вихідного вмістимого аккумулятора без знаку та вмістимого 16-бітного регістру. В якості 16-бітного регістру може бути як вказівник даних DPTR так і програмний лічильник PC. У випадку, коли використовується PC, програмний лічильник збільшується до адресу наступної команди, перед тим як його вмістиме додається з вмістимим аккумулятора. 16-бітне додавання виконується так, що перенос з молодших восьми біт може поширюватися через старші біти. Ця команда на прапорці не впливає.
(A)=1BH, (DPTR)=1020H, ПП(103BH)=48H, ОЗП(103BН)=88Н,
MOVС A, @A+DPTR
(A)=48H, (DPTR)=1020H.
(A)=FAH, (PC)=0289H, ПП(0384Н)=9BH,
MOVC A, @A+PC
(A)=9BH, (PC)=028AH.
19) MOVX A, @Ri.
20) MOVX A, @DPTR.
Ці команди пересилають дані з ЗПД (зовнішньої пам’яті даних) в аккумулятор. Вони відрізняються тим, що забезпечують 8-бітну або 16-бітну непряму адресацію до ЗПД. В першому випадку, вмістиме R0 або R1 вибраного банку регістрів забезпечує 8-бітний адрес, який мультиплексується з даними порта P0. Якщо використовуються ОЗП ненабагато більші, ніж 256 байт, то для фіксації старших байтів адресу можна використовувати будь-які інші виходи портів, які переключаються командою, розміщеною перед командою MOVX. В другому випадку, при виконанні команди MOVX, вказівник даних генерує 16-бітний адрес. Порт P2 виводить старші 8 біт адресу (DPH), а порт P0 мультиплексує молодші 8 біт (DPL) з даними. Остання команда є більш швидкою та ефективною при доступі до великих масивів даних (до 64K байт), так як для встановлення портів виводу не потрібно додаткових команд.
21) MOVX @Ri, A.
22) MOVX @DPTR, A.
Ці команди пересилають дані з аккумулятора в ЗПД.
(A)=95H, (R1)=FDH, ЗПД(FDH)=00H,
MOVX @R1, A,
(A)=95H, (R1)=FDH, ЗПД(FDH)=95H.
(A)=97H, (DPTR)=1FFFH, ЗПД(1FFFH)=00H,
MOVX @DPTR, A,
(A)=97H, (DPTR)=1FFFH, ЗПД(1FFFH)=97H.
23) PUSH ad
Команда “запису в стек” збільшує вказівник стеку SP на одиницю, і після цього, вмістиме вказаної змінної, що прямо адресується, копіюється в комірку ВПД, що адресується з допомогою вказівника стеку. На прапорці ця команда не впливає і використовується для запису проміжних даних в стек.
(SP)=09H, (DPTR)=4567H
PUSH DPH
PUSH DPL
(SP)=0BH, ВПД(0AH)=45H, ВПД(0BH)=67H, (DPTR)=4567H.
24) POP ad
Команда “читання з стеку” зчитує вмістиме комірки ВПД, яка адресується з допомогою вказівника стеку в комірку ВПД, що прямо адресується, при цьому, вказівник стеку зменшується на одиницю. Ця команда не впливає на прапорці і використовується для читання з стеку проміжних даних.
(SP)=32H, ВПД(32H)=12H, ВПД(31H)=56H,
(DPH)=01H, (DPL)=ABH, ВПД(30H)=20H,
POP DPH
POP DPL
(SP)=30H, (DPH)=12H, (DPL)=56H,
ВПД(32H)=12H ВПД(31H)=56H.
25) XCH A, Rn
26) XCH A, ad
27) XCH A, @Ri
Останні команди здійснюють обмін між вмістимим аккумулятора та вмістимим джерела, вказаного в команді. Операнд джерела може використовувати такі режими адресації: регістрову, пряму та непряму.
(A)=3CH, (R4)=15H,
XCH A, R4,
(A)=15H, (R4)=3CH.
(A)=FFH, (P3)=DAH,
XCH A, P3
(A)=DAH, (P3)=FEH.
(R1)=39H, ВПД(39H)=44H, (A)=BCH,
XCH A, @R1
ВПД(39H)=BCH, (A)=44H.
28) XCHD A, @Ri
Команда “обмін тетрадою” виконує обмін молодшої тетради (біти 3...0) акумулятора А з вмістимим тетради комірки ВПД, непряма адресація до якої здійснюється з допомогою вказаного регістру. На старші біти (біти 7...4) ця команда не впливає.
(R0)=55H, (A)=89H, ВПД(55Н)=А2Н,
XCHD A, @R0,
(A)=82H, ВПД(55H)=A9H.
1.2. Команди арифметичних операцій мікроконтролера 8051.
До даної групи відносяться 24 команди, короткий опис яких наведено в табл. 3. З неї випливає, що мікроконтролери сімейства MCS-51 виконують достатньо широкий набір команд для організації обробки даних цілого типу, включаючи команди множення та ділення. В табл. 3 також приведені типи команд (Т) у відповідності з табл. 1, їх довжина в байтах (Б) та час виконання в машинних циклах (Ц).
Табл. 3. Арифметичні операції
Назва команди |
Мнемокод |
КОП |
Т |
Б |
Ц |
Операция |
Додавання вмістимого аккумулятора з регістром Rn, (n=0÷7) |
ADD A, Rn |
00l01rrr |
1 |
1 |
1 |
(A) (A) + (Rn) |
Додавання вмістимого аккумулятора з адресом, що прямо адресується |
ADD A, ad |
00100101 |
3 |
2 |
1 |
(A) (A) + (ad) |
Додавання вмістимого аккумулятора з байтом з РПД @Ri, (i=0,1) |
ADD A, @Ri |
0010011i |
1 |
1 |
1 |
(A) (A) + ((Ri)) |
Додавання аккумулятора з константою |
ADD A, #d |
00100100 |
2 |
2 |
1 |
(A) (A) + #d |
Додавання аккумулятора з регістром та переносом |
ADDC A, Rn |
00111rrr |
1 |
1 |
1 |
(A) (A) + (Rn) + (C) |
Додавання аккумулятора з адресом, що прямо адресується та переносом |
ADDC A, ad |
00110101 |
3 |
2 |
1 |
(A) (A) + (ad) + (C) |
Додавання аккумулятора з байтом з РПД та переносом |
ADDC A, @Ri |
0011011i |
1 |
1 |
1 |
(A) (A) + ((Ri)) + (C) |
Додавання аккумулятора з константою та переносом |
ADDC A, #d |
00110100 |
2 |
2 |
1 |
(A) (A) + # d + (C) |
Десяткова корекція аккумулятора |
DA A |
11010100 |
1 |
1 |
1 |
Якщо (А0…3)>9 або ((AC)=1), то (А0…3) (А0…З) + 6. Якщо (А4…7) >9 або ((С)=1), то (А4…7) (А4…7) + 6 |
Віднімання від вмістимого аккумулятора регістру та позички |
SUBB A, Rn |
10011rrr |
1 |
1 |
1 |
(A) (A) - (C) - (Rn) |
Віднімання від вмістимого аккумулятора адресу, що прямо адресується, та позички |
SUBB A, ad |
10010101 |
3 |
2 |
1 |
(A) (A) - (C) - ((ad)) |
Віднімання від вмістимого аккумулятора байту, що прямо адресується, та позички |
SUBB А, @Ri |
1001011i |
1 |
1 |
1 |
(A) (A) - (C) - ((Ri)) |
Віднімання від вмістимого аккумулятора константи та позички |
SUBB А, d |
10010100 |
2 |
2 |
1 |
(A) (A) - (C) - #d |
Інкремент аккумулятора |
INC А |
00000100 |
1 |
1 |
1 |
(A) (A) + 1 |
Інкремент регістру |
INC Rn |
00001rrr |
1 |
1 |
1 |
(Rn) (Rn) +1 |
Інкремент байту, що прямо адресується |
INC ad |
00000101 |
3 |
2 |
1 |
(ad) (ad) + 1 |
Інкремент байту в РПД |
INC @Ri |
0000011i |
1 |
1 |
1 |
((Ri)) ((Ri)) + 1 |
Інкремент вказівника даних |
INC DPTR |
10100011 |
1 |
1 |
2 |
(DPTR)(DPTR) + 1 |
Декремент аккумулятора |
DEC A |
00010100 |
1 |
1 |
1 |
(A) (A) – 1 |
Декремент регістру |
DEC Rn |
00011rrr |
1 |
1 |
1 |
(Rn) (Rn) – 1 |
Декремент байту, що прямо адресується |
DEC ad |
00010101 |
3 |
2 |
1 |
(ad) (ad) – 1 |
Декремент байту в РПД |
DEC @Ri |
0001011i |
1 |
1 |
1 |
((Ri)) ((Ri)) – 1 |
Множення вмістимого аккумулятора на вмістиме регістру В |
MUL AB |
10100100 |
1 |
1 |
4 |
(B)(A) (A)*(В) |
Ділення вмістимого аккумулятора на регістр В |
DIV AB |
10000100 |
1 |
1 |
4 |
(B).(A) (A)/(В) |
При виконанні команд ADD, ADDC, SUBB, MUL, DIV встановлюються прапорці регістру PSW. Прапорець С встановлюється при переносі з розряду D7, тобто у випадку, коли результат не вміщується в вісім розрядів. Прапорець АС встановлюється при переносі з розряду D3 в командах додавання та віднімання і використовується при реалізації десяткової арифметики. Цей прапорець використовується командою DA A. Прапорець 0V встановлюється при переносі з розряду D6, тобто, якщо результат не вміщується в сім розрядів і восьмий може бути інтерпретований як знаковий. Цей прапорець використовується при організації обробки чисел зі знаком. Прапорець P встановлюється та скидається апаратно. Якщо число одиничних біт в акумуляторі непарне, то P=1, в іншому випадку P=0.
29) ADD A, Rn
Ця команда (“додавання”) додає вмістиме аккумулятора А з вмістимим байта-джерела, залишаючи результат в аккумуляторі. При виникненні переносів з байтів 7 та 3 встановлюються прапорці переносу (С) та додаткового переносу (AC) відповідно. В іншому випадку ці прапорці скидаються. При додаванні цілих чисел без знаку прапорець переносу “С” вказує на появу переповнення. Прапорець переповнення (0V) встановлюється, якщо є перенос з 6-го біту і немає з біту 7, або є перенос з біту 7 та немає з біту 6. В іншому випадку 0V скидається. При додаванні цілих чисел зі знаком 0V вказує на від’ємну величину, одержану при додаванні двох додатних операндів або на додатну суму для двох від’ємних операндів.
(A)=C3H, (R6)=AAH
ADD A, R6
(A)=6DH, (R6)=AAH, (AC)=0, (C)=1, (0V)=1.
30) ADD A, @Ri
(A)=95H, (R1)=31H, (31H)=4CH
ADD A, @R1
(A)=E1H, (31H)=4CH, (C)=0, (AC)=1, (0V)=0.
31) ADD A, ad
(A)=77H, (90H)=FFH
ADD A, 90H
(A)=76H, (90H)=FFH, (C)=1, (0V)=0, (AC)=1.
32) ADD A, #d
(A)=09H
ADD A, #D3H
(A)=DCH, (C)=0, (0V)=0, (AC)=0.
33) ADDC A, Rn
Ця команда (“додавання з переносом” одночасно додає вмістиме байта-джерела, прапорець переносу та вмістиме аккумулятора А, залишаючи результат в аккумуляторі. При цьому прапорці переносу та додаткового переносу встановлюються, якщо є перенос з біту 7 або біту 3, і скидаються в іншому випадку. При додаванні цілих без знаку, прапорець переповнення вказує на переповнення. Прапорець переповнення (0V) встановлюється, якщо є перенос з біту 6 і немає переносу з 7 біту, або є перенос з біту 7 і немає з біту 6, в іншому випадку прапорець 0V скидається. При додаванні цілих зі знаком, 0V вказує на від’ємну величину, одержану при додаванні двох додатних операндів або на додатну суму від двох від’ємних операндів.
(A)=B2H, (R3)=99, (C)=1
ADDC A, R3
(A)=4CH, (R3)=99H, (C0=1, (AC)=0, (0V)=1.
34) ADDC A, @Ri
(A)=D5H, (R0)=3AH, (3AH)=1AH, (C)=1
ADDC A, @R0
(A)=F0H, (3AH)=1AH, (C)=0, (AC)=1, (0V)=0.
35) ADDC A, ad
(A)=11H, (80H)=DFH, (C)=1,
ADDC A, 80H,
(A)=F1H, (C)=0, (AC)=1, (0V)=0.
36) ADDC A, #d
(A)=55H, (C)=0
ADDC A, #55H
(A)=AAH, (C)=0, (AC)=0, (0V)=1.
37) DA A
Команда “десяткової корекції аккумулятора при додаванні” впорядковує 8-бітну величину аккумулятора після попередньо виконаної команди додавання двох змінних (кожна з них в двійково-десятковому форматі). Для виконання додавання може використовуватись будь-яка з типів команд ADD або ADDC. Якщо значення бітів 3-0 аккумулятора перевищує 9 (XXXX 1010 … XXXX1111) або якщо прапорець AC рівний “1”, то до вмістимого (A) додається 06, одержуючи відповідну двійково-десяткову цифру в молодшому півбайті. Це внутрішнє побітне додавання встановлює прапорець переносу, якщо перенос з поля молодших чотирьох біт поширюється через всі старші біти. В іншому випадку прапорець переносу не не змінюється. Якщо після цього прапорець переносу рівний “1”, або якщо значення чотирьох старших біт (7-4) перевищує 9 (1010 ХХХХ ... 1111 ХХХХ), значення цих старших біт збільшується на 6, створюючи відповідну двійково-десяткову цифру в старшому півбайті. І знову при цьому прапорець переносу встановлюється, якщо перенос одержується з старших біт, але не змінюється в іншому випадку. Таким чином, прапорець переносу вказує на те, що сума двох вихідних двійково-десяткових змінних більше ніж 100. Ця команда виконує десяткове перетворення з допомогою додавання 06, 60, 66 з вмістимим аккумулятора в залежності від початкового стану аккумулятора та слову стану програми (PSW). Команда DA A не може просто перетворити шістнадцяткове значення в аккумуляторі в двійково-десяткове представлення і не використовується для десяткового віднімання.
(A)=56H, (R3)=67H, (C)=1
ADDC A, R3
DA A
(A)=24H, (R3)=67H, (C)=1
(A)=30H, (C)=0
ADD A, #99H
DA A
(A)=29H, (C)=1
38) SUBB A, Rn
Команда “віднімання з позичкою” віднімає вказану змінну разом з прапорцем переносу від вмістимого аккумулятора, результат заноситься в аккумулятор. Ця команда встановлює прапорець переносу (позички), якщо при відніманні для біту 7 необхідна позичка, в іншому випадку прапорець переносу скидається. Якщо прапорець переносу встановлений перед виконанням цієї команди, то це вказує на те, що позичка потрібна при виконанні з збільшеною точністю на попередньому кроці, - тому прапорець переносу віднімається від вмістимого аккумулятора разом з операндом джерела. Прапорець АС встановлюється, якщо позичка необхідна для біту 3 і скидається в іншому випадку. Прапорець переповнення (0V) встановлюється, якщо позичка необхідна для біту 6, але немає його для біту 7, або є для біту 7, але немає для біту 6. При відніманні цілих зі знаком прапорець 0V вказує на від’ємне число, яке одержується при відніманні від’ємної величини від додатної, або додатне число, яке отримується при відніманні додатного числа від від’ємного. Операнд джерела допускає чотири режими адресації, які розглянемо на прикладах.
(A)=C9H, (R2)=54H, (C)=1,
SUBB A, R2,
(A)=74H, (R2)=54H, (C)=0, (0V)=1.
39) SUBB A, @Ri,
(A)=49H, (33H)=68H, (C)=1, (R0)=33H,
SUBB A, @R0,
(A)=E1H, (C)=1, (AC)=0, (0V)=0.
40) SUBB A, ad
(A)=97H, (B)=25H, (AC)=0, (0V)=1,
SUBB A, B,
(A)=72H, (B)=25H, (C)=0, (AC)=0, (0V)=1.
41) SUBB A, #d
(A)=BEH, (C)=0,
SUBB A, #3FH
(A)=7FH, (C)=0, (0V)=1.
42) INC A
Команда “інкремент” виконує додавання “1” до вказаної змінної і не впливає на прапорці. Ця команда допускає чотири режими адресації.
(A)=1FH, (AC)=0,
INC A,
(A)=20H, (AC)=0.
43) INC Rn,
(R4)=FFH, (C)=0, (AC)=0.
INC R4,
(R4)=00H, (C)=0, (AC)=0.
44) INC ad
(43H)=22H,
INC 43H,
(43H)=23H.
45) INC @Ri
(41H)=4FH, (R1)=41H, (AC)=0,
INC @R1,
(R1)=41H, (41H)=50H, (AC)=0.
46) INC DPTR
Команда “інкремент вказівника даних” виконує інкремент (додавання “1”) 16-бітного вказівника даних. Додавання “1” здійснюється до 16-ти бітів. Якщо виникає переповнення молодшого байту вказівника даних (DPL) з FFH в 00H, то це приводить до інкременту старшого байту (DPH). На прапорці ця команда не впливає.
(DPH)=12H, (DPL)=FFH,
INC DPTR,
(DPH)=13H, (DPL)=00H.
47) DEC A
Команда “декремент” проводить віднімання “1”від вказаного операнду. Команда DEC не впливає на прапорці. Ця команда допускає чотири режими адресації операнду.
(A)=11H, (C)=1, (AC)=1,
DEC A
(A)=10H, (C)=1, (AC)=1.
48) DEC @Ri
(R1)=7FH, (7EH)=40H, (7FH)=00H,
DEC @R1
DEC R1
DEC @R1
(R1)=7FH, (7EH)=3FH, (7FH)=FFH.
49) DEC Rn
(R4)=5CH,
DEC R4,
(R4)=5BH.
50) DEC ad
(SCON)=A0H, (C)=1, (AC)=1,
DEC SCON,
(SCON)=9FH, (C)=1, (AC)=1.
51) MUL AB
Команда ”множення”, множить 8-бітні цілі числа без знаку з аккумулятора та регістру В. Старший байт 16-бітного добутку заноситься в регістр В, а молодший в аккумулятор А. Якщо результат добутку більший ніж FFH (255), то встановлюється прапорець переповнення (0V), в іншому випадку він скидається. Прапорець переносу завжди скидається.
(A)=50H, (B)=A0H, (C)=1, (0V)=0,
MUL AB
(A)=20H, (B)=03H, (C)=0, (0V0=1.
52) DIV AB
Команда “ділення” ділить 8-бітне ціле число без знаку з акумулятора А на 8-бітне ціле без знаку з регістру В. В аккумулятор заноситься ціла частина частки, а в регістр В – остача. Прапорці переносу (С) та переповнення (0V) скидаються. Якщо (A)<(B), то прапорець додаткового переносу (AC) не скидається. Прапорець переносу скидається в будь-якому випадку.
(A)=FBH, (B0=12H, (C)=1,
DIV AB
(A)=0DH, (B)=11H, (C)=0.
Якщо регістр В містить 00, то після виконання команди DIV вмістиме аккумулятора А та регістру В будуть невизначені. Прапорець переносу скидається, а прапорець переповнення встановлюється в “1”.