Програма за преобразуване на еднобайтови двоични числа в BCD код
Максималната стойност на еднобайтовото число е 255. За да бъде преобразувано в двоично-десетично, може да се постъпи по следния начин. От зададената стойност да се изважда най-напред100, докато се получи отрицателен остатък. След това да се възстанови последният положителен остатък и по аналогичен начин да се изважда числото 10 до получаване на отрицателен остатък. Накрая да се изважда числото 1 от възстановения последен положителен остатък до отрицателен резултат. Всеки път броят на изважданията да се отброяват.
.include “m16def.inc”
CLR ZH
LDI ZL,0×60
LDI R16,(100)
STD Z+5,R16
LDI R16,(10)
STD Z+6,R16
LDI R16,(1)
STD Z+7,R16
LD R5,Z+
LDI R16,0×03
L2: CLR R0
LDD R6,Z+4
L1: INC R0
SUB R5,R6
BRSH L1
DEC R0
ADD R5,R6
ST Z+,R0
DEC R16
BRNE L2
LDI ZL,0×62
LD R5,Z
SWAP R5
OR R5,R0
ST Z, R5Подпрограма за десетична корекция на резултата
Както е известно, числата в BCD код се кодират, като всяка десетична цифра се кодира с нейния двоичен еквивалент. За целта са необходими 4 разреда, но възможните при това комбинации са 15, а не 10. Следователно 6 комбинации са излишни и ако при някакви действия резултатът попадне в този списък, ще възникне грешка. Например, ако се сумират числата 7 и 5, ще се получи 12. В BCD код това е 0001 0010, докато в обикновен двоичен код това е 1100, т.е. забранена комбинация. За да се коригира тази грешка е необходимо да се прескочат 6 забранени комбинации. Това става като резултатът от сбора на 7 и 5 се събере с 6 и се следи дали има пренос.
0111
0101
1100
0110
0001 0010
Възможно е резултатът да си остане в списъка на разрешените комбинации. Например ако се събере 3 и 5. Тогава не трябва да се добавя числото 6. Признакът, по който ще се разпознава, дали е необходимо добавянето на 6 или не, е проверката дали при добавянето на 6 възниква пренос към следващата тетрада или не. Следователно, ако след като е добавено числото 6 е възникнал пренос следва, че добавянето е било необходимо. Ако не възникне пренос, резултатът не е бил в забранена комбинация и числото 6 трябва да се извади обратно.
В списъка на инструкциите на процесорите AVR няма инструкция за автоматична десетична корекция. За това в следващия пример е предвидено създаването на подпрограма за тази цел, която може да се използва като част от други програми, използващи BCD код..include “m16def.inc”
LDI R16,LOW(RAMEND)
OUT SPL,R16 ;Инициализиране на стека
LDI R16,HIGH(RAMEND)
LDI ZL,0×60 ;Задава адрес
CLR ZH
LD R0,Z+ ;Прехвърля в оперативен регистър
CALL DAA ;Извиква подпрограмата
JMP END
DAA: ;Начало на подпрограмата
LDI R16,0×06
ADD R0,R16 ;Добавя 6 към първата тетрада
BRHS DAAL1 ;Проверява за полупренос
SUB R0,R16 ;Ако няма полупренос
DAAL1:
CLR R1 ;Нулира байта за стотиците
INC R1 ;Допуска, че ще има стотици
LDI R16,0×60 ;Продължава с втората тетрада
LDI R17,0×01 ;Формира байт за стотиците
ADD R0,R16 ;Добавя 6 към старшата тетрада
BRCS DAAL2 ;Следи за пренос
SUB R0,R16 ;Ако няма пренос
CLR R1 ;Нулира байта за стотиците
DAAL2:
RETEND: ;край на програмата
ST Z+,R1 ;Записва байта на стотиците
ST Z,R0 ;Записва младшите две тетрадиEND: ;край на програмата
Сходни статии:
- Програма за преобразуване на четирибайтови числа в допълнителен код Програма за преобразуване на четирибайтови числа в допълнителен код Зададеното число се разполага в четири последователни клетки от паметта. И тук е прието най-старшият байт да е с най-малък адрес....
- Програма за деление на еднобайтови числа Да се разделят две числа означава, да се установи, колко пъти делителя се нанася в делимото. Това може да стане най-просто, като се изважда делителят от делимото циклично и се...
- Програма за събиране не еднобайтови BCD числа В тази програма не би трябвало да има нещо особено. Двата операнда се задават в BCD код в клетките 0х0060 0х0061. След това се извършва сумирането им по познатия начин....
- Програма за умножение на еднобайтови числа без алгебричен знак Програма за умножение на еднобайтови числа без алгебричен знак Алгоритъм на умножението Нека е дадено множимото 1101 и множителя1001. Алгоритъмът за умножение на десетични и двоични числа е един и...
- Програма за събиране на четирибайтови числа с алгебричен знак Програма за събиране на четирибайтови числа с алгебричен знак В следващия пример подпрограмата за обработване на знака е извикана три пъти. При първия път е зададен адресът на първия операнд...