![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
У раніше розглянутих командах обробки інформації кодування вмісту окремих бітів байта не мало значення. В арифметичних операціях потрібно дотримуватись строго визначених правил запису даних відповідно до порядкових номерів розрядів двійкового коду. У зв'язку з обмеженими ресурсами мікроконтролера в ньому використовуються тільки чотири арифметичних операції з цілими числами. Відступ від правил кодування призводить до неправильного виконання арифметичних операцій.
В одному байті може бути закодовано 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) |
Дата публикования: 2014-12-08; Прочитано: 1078 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!