Команди арифметичних операцій

У раніше розглянутих командах обробки інформації кодування вмісту окремих бітів байта не мало значення. В арифметичних операціях потрібно дотримуватись строго визначених правил запису даних відповідно до порядкових номерів розрядів двійкового коду. У зв'язку з обмеженими ресурсами мікроконтролера в ньому використовуються тільки чотири арифметичних операції з цілими числами. Відступ від правил кодування призводить до неправильного виконання арифметичних операцій.

В одному байті може бути закодовано 256 значень цілого числа. При роботі з позитивними числами це відповідає значенням від 0 до 255. Усі команди арифметичних операцій призначені для роботи з позитивними цілими числами байтового формату, хоча команди додавання і віднімання у випадку відсутності переповнення забезпечують одержання коректного результату при спеціальному способі кодування негативних чисел. При необхідності роботи з числами, що не можуть бути представлені в байтовому форматі, необхідно розробляти відповідні підпрограми. Виконання операцій множення і ділення з числами, що мають довільний знак, можливо при їхньому представленні через знак і модуль та при використанні відповідних підпрограм. Це можуть бути власні розробки чи запозичені з добре перевірених бібліотек інших розроблювачів.

Команда додавання працює з даними байтового формату, притім як приймач завжди використовується тільки нагромаджувач:

ADD A, #src

ADD A, Rn

ADD A, @Ri

ADD A, src

Мнемоніка цієї команди відповідає слову ADDition (додавання).

Для роботи з числами, що не можуть бути представлені одним байтом, використовується команда додавання, що враховує перенос, отриманий при додаванні попередньої пари байтів:

ADDC A, #src

ADDC A, Rn

ADDC A, @Ri

ADDC A, src

Додавання літери С до позначення команди вказує на використання біта переносу (ADDition with Carrier).

Існує також команда додавання, за допомогою якої виробляється збільшення заданого операнда на одиницю (INCrement):

INC A

INC Rn

INC @Ri

INC src

Така ж команда є і для роботи з двома байтами вмісту регістра покажчика даних:

INC DPTR

За допомогою цієї команди можна змінювати вміст покажчика для читання послідовності байтів із ПЗП.

При додаванні чисел, представлених двійково-десятковими кодами, після операції додавання потрібно використовувати команду десяткової корекції суми

DA A

Двійково-десяткове кодування має дуже обмежене застосування і тому далі не розглядається.

Набір команд для віднімання набагато менше. Команда обчислення різниці існує тільки у варіанті з відніманням умісту біта переносу (не вистачило кодів команд!):

SUBB A, #src

SUBB A, Rn

SUBB A, @Ri

SUBB A, src

Мнемоніка цієї команди відповідає словам SUBtraction with Borrow (тобто віднімання з урахуванням позики, тому що при відніманні утворюється позика, а не перенос). З цієї причини перед обчисленням різниці молодших байтів потрібно обов'язково очищати біт переносу, якщо немає впевненості в його вмісті. При обчисленні різниці старших байтів цього робити не потрібно.

Існує також команда віднімання, за допомогою якої виробляється зменшення заданого операнда на одиницю (DECrement):

DEC A

DEC Rn

DEC src

DEC @Ri

Команди зменшення для роботи з двобайтовим форматом даних немає.

Результати виконання команд додавання і віднімання впливають на вміст бітів переносу, додаткового переносу і переповнення в слові стану програми. Результати виконання команд додавання і віднімання не впливають на вміст слова стану програми.

Команди множення (MULliplication) і ділення (Division) працюють при записі операндів у нагромаджувач і регістр В. Для команди множення порядок запису співмножників у ці регістри не важливий.

 

MUL AB

 

Добуток має двохбайтовий формат. Молодший байт добутку записується в нагромаджувач, а старший — у регістр В.

Для команди ділення ділене повинне бути записане в нагромаджувач, а дільник — у регістр В:

DIV AB

 

Після виконання команди в нагромаджувачі знаходиться частка, а в регістрі В — залишок. Після виконання команд множення і ділення в біт переносу заноситься 0. Якщо старший байт добутку не дорівнює нулю, то в байт переповнення заноситься 1. При діленні на 0 у байт переповнення також заноситься 1.

Група команд арифметичних операцій наведена в табл. 8.4

 

Таблиця 8.4

Група команд арифметичних операцій

Назва команди Мнемокод КОП Т Б Ц Операція
Додавання акумул. до регістра (n = 0¸7) ADD A,Rn 00101rrr (A)¬(A)+(Rn)
Додавання акумул. до байта, що адресується прямо ADD A,ad (A)¬(A)+(ad)
Додавання акумулятора до байта із РПД (і = 0,1) ADD A,@Ri 0010011i (A)¬(A)+((Ri))
Додавання акумулятора до незмінної ADD A,#d (A)¬(A)+ #d
Додавання акумулятора до регістра з переносом ADDC A,Rn 00111rrr (A)¬(A)+(Rn)+(C)
Закінчення табл.8.4
Назва команди Мнемокод КОП Т Б Ц Операція
Додавання акумулятора до байта, що адресується прямо, з переносом ADDC A,ad (A)¬(A)+(ad)+(C)
Додавання акумулятора до байта із РПД (і = 0,1) з переносом ADDC A,@Ri 0011011i (A)¬(A)+((Ri))+(C)
Додавання акумулятора до незмінної з переносом ADDC A,#d (A)¬(A)+#d+(C)
Десяткова корекція акумулятора DA A Якщо (А0-3) >9 Ú((AC)=1), то (А0-3) ¬ (А0-3)+6, потім, якщо (А4-7) >9 Ú ((C)=1), то (А4-7)¬ (А4-7)+6
Віднімання з акумулятора регістра і позики SUBB A,Rn 10011rrr (A)¬(A)-(Rn)-(C)
Віднімання з акумулятора байта, що адресується прямо, та позики SUBB A,ad (A)¬(A)-(ad)-(C)
Віднімання з акумулятора байта РПД та позики SUBB A,@Ri 1001011i (A)¬(A)-((Ri))-(C)
Віднімання з акумулятора незмінної та позики SUBB A,#d (A)¬(A)- #d -(C)
Інкремент акумулятора INC A (A)¬(A)+1
Інкремент регістра INC Rn 00001rrr (Rn)¬(Rn)+1
Інкремент байта, що адресується прямо INC ad (ad)¬(ad)+1
Інкремент байта в РПД INC @Ri 0000011i ((Ri))¬((Ri))+1
Інкремент покажчика даних INC DPTR (DPTR)¬(DPTR)+1
Декремент акумулятора DEC A (A)¬(A) -1
Декремент регістра DEC Rn 00011rrr (Rn)¬(Rn) -1
Декремент байта, що адресується прямо DEC ad (ad)¬(ad) -1
Декремент байта в РПД DEC @Ri 0001011i ((Ri))¬((Ri)) -1
Множення акумулятора на РгВ MUL AB (B)(A)¬(A)*(B)
Ділення акумулятора на РгВ DIV AB (A).(B)¬ (A)/(B)