Команди арифметичних операцій мікроконтролера 8051.
До даної групи відносяться 24 команди, короткий опис яких наведено в табл. 3. З неї випливає, що мікроконтролери сімейства MCS-51 виконують достатньо широкий набір команд для організації обробки даних цілого типу, включаючи команди множення та ділення. В табл. 3 також приведені типи команд (Т) у відповідності з табл. 1, їх довжина в байтах (Б) та час виконання в машинних циклах (Ц). Табл. 3. Арифметичні операції
При виконанні команд 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”.
Читайте также: II -приравненное к нотариальному (глав.врач больницы, командиры воинских частей) Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|