- •1 Пояснювальна записка
- •1.1 Ділення цілих без знакових чисел
- •1.2 Десяткової корекції для мікро контролера ріс
- •1.2.1 Додавання у bcd – форматі
- •1.2.2 Віднімання у bcd – форматі
- •2 Склад і вміст комплексного контрольного завдання №1 Завдання №1
- •Приклад виконання варіанту №30
- •Завдання №2
- •2.1 Десяткова корекція після додавання чисел у bcd форматі
- •2.2 Десяткова корекція після віднімання чисел у bcd форматі
- •Приклад виконання варіанту №30
1.2 Десяткової корекції для мікро контролера ріс
Сучасні мікропроцесори та мікро контролери припускають два представлення десяткових чисел: упакований BCD – формат та не упакований ASCII - формат. У BCD – форматі байт містить дві десяткові цифри (по одній у кожній тетраді), які представлені у коді 8421.
1.2.1 Додавання у bcd – форматі
Додавання у BCD – форматі виконується у два етапи: спочатку байти операндів додаються як звичайні двійкові числа, за правилами двійкової арифметики, а потім здійснюється корекція результату.
Слід зазначити, що на відміну від мікроконтролерів РІС фірми Microchip у мікроконтролерах MCS-51, MCS-96,196,296 фірми Intel та AVR фірми Atmel у системі команд є інструкція DAA, яка на апартному рівні виконує корекція результату після додавання у BCD – форматі, що значно спрощує обробку двійково – десяткових чисел. Для мікроконтролерів РІС програміст змушений програмно реалізовувати алгоритм десяткової корекції.
Аналіз двійкового додавання BCD – чисел показує, що неправильний BCD – результат з’являється у двох ситуаціях:
отримана не припустима тетрада, тобто тетрада, в якій двійковий еквивалент більше 9;
отримана припустима тетрада, але при додаванні із неї виникло двійкове перенесення з вагою 16, в той час як правильна вага одиниці перенесення повинна бути 10;
Слід зазначити, що перенесення із молодшої тетради фіксується прапорцем DC, а із старшої тетради – прапорцем С. Алгоритм корекції після додавання складається з двох кроків:
якщо DC=1 або молодша тетрада регістру W містить заборонену комбінацію (у діапазоні чисел 10-15), до вмісту W додається 06 h і прапорець DC встановлюється в одиницю;
якщо C=1 або старша тетрада регістру W містить заборонену комбінацію (у діапазоні чисел 10-15), до вмісту W додається 60 h і прапорець C встановлюється в одиницю;
Рисунок 1 - Спрощений алгоритм десяткової корекції після додавання у BCD – форматі
1.2.2 Віднімання у bcd – форматі
Спрощений алгоритм корекції після віднімання складається з двох кроків:
якщо DC=0 або молодша тетрада регістру W містить заборонену комбінацію, із вмісту W віднімається 06 h і прапорець DC скидається у нуль;
я
кщо
C=0 або
старша тетрада регістру W
містить заборонену комбінацію , із
вмісту W
віднімається 06 h
і прапорець C
скидається у нуль;
Рисунок 2 - Спрощений алгоритм десяткової корекції після віднімання у BCD – форматі
;---------------------------------------------------------------------------------------------------------
w equ 0; приймач інформації регістр W
f equ 1; приймач інформації регістр R
;---------------------------------------------------------------------------------------------------------
r0 equ 0c; сума
r1 equ 0d; доданок 1/різниця
r2 equ 0e; доданок 1
r3 equ 0f; доданок 2
r4 equ 10; доданок 2
r5 equ 11; temp register
port_b equ 06;
;---------------------------------------------------------------------------------------------------------
status equ 03; визначення прапорців
carry equ 0; carry,
digit_carry equ 1; digit_carry
zero equ 2; та zero у регістрі status
;---------------------------------------------------------------------------------------------------------
summand_1 equ 87;
summand_2 equ 98;
;---------------------------------------------------------------------------------------------------------
minuend equ 87;
subtrahend equ 98;
;---------------------------------------------------------------------------------------------------------
DAA_DAS_flag equ 0; 0 – DAA, 1 - DAS
;---------------------------------------------------------------------------------------------------------
movlw DAA_DAS_flag;
andlw 1;
btfss status, zero;
goto DAS;
movlw summand_1;
andlw 0f;
movwf r1;
movlw summand_1;
andlw 0f0;
movwf r2;
movlw summand_2;
andlw 0f;
movwf r3;
movlw summand_2;
andlw 0f0;
movwf r4;
bcf status, carry;
movf r3,w;
addwf r1,w;
btfsc status,digit_carry;
goto add_06;
goto verify_9;
back movf r2,w;
addwf r4,w;
btfsc status,carry;
goto add_60;
goto verify_9f;
back_1 movlw 0;
tris port_b;
movf r0,w;
movwf port_b;
goto finish;
add_06 addlw 06;
movwf r0;
bsf status,digit_carry;
goto back;
add_60 addlw 60;
addwf r0,f;
bsf status,carry;
goto back_1;
verify_9 movwf r5;
sublw 9;
btfss status, carry;
goto recovery_w;
movf r5,w;
movwf r0;
goto back;
recovery_w movf r5,w;
goto add_06;
verify_9f movwf r5;
sublw 9f;
btfss status, carry;
goto recovery_w1;
movf r5,w;
addwf r0;
goto back_1;
recovery_w1 movf r5,w;
goto add_60;
;---------------------------------------------------------------------------------------------------------
DAS movlw subtrahend;
sublw minuend;
movwf r1;
movf status,w; збереження вмісту
movwf r2; регістру прапорців у регістрі r2
btfss status,digit_carry;
goto sub_06;
goto verify_9s;
backs movf r2,w;
movwf status;
btfss status,carry;
goto sub_60;
goto verify_9fs;
back_1s movlw 0;
tris port_b;
movf r1,w;
movwf port_b;
goto finish;
sub_06 movlw 06;
subwf r1;
bsf status,digit_carry;
goto backs;
verify_9s movf r1,w;
andlw 0f;
sublw 9;
btfss status,carry;
goto sub_06;
goto backs;
sub_60 movlw 60;
subwf r1;
bsf status,carry;
goto back_1s;
verify_9fs movf r1,w;
sublw 9f;
btfss status,carry;
goto sub_60;
goto back_1s;
finish
end
