Програма за събиране не еднобайтови BCD числа
В тази програма не би трябвало да има нещо особено. Двата операнда се задават в BCD код в клетките 0х0060 0х0061. След това се извършва сумирането им по познатия начин. Резултатът остава в оперативен регистър, върху които се извършва десетичната корекция.
Тук ще бъде разгледан вариант на програма, която се разполага в няколко файла, с което се постига по-голяма прегледност. Освен това към нея могат да се включват готови типови файлове, създадени по повод на други програми. Такъв файл може да бъде например фрагментът за инициализиране на стека, който може да се напише еднократно и да се използва във всяка програма.
STACK.ASM
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,HIGH(RAMEND)
OUT SPH,R16
В отделен файл може да се запише и подпрограмата за десетична корекция на резултата и да се използва винаги, когато се работи в BCD код.
;DAA.ASM
DAA:
CLR R1
INC R1
LDI R16,0×06
ADD R0,R16
BRHS DAAL1
SUB R0,R16
DAAL1: LDI R16,0×60
LDI R17,0×01
ADD R0,R16
BRCS DAAL2
SUB R0,R16
CLR R1
DAAL2: RET
В следващия пример е показано, как се включват такива файлове към основната програма. Използва се директивата .include, след която следва името на файла. Тя се поставя на мястото от програмата, в която би трябвало да бъде записан съответния програмен код. В машинния код след асемблерането такова деление не личи.
;MyProject.asm
.include “m16def.inc”
.include “STACK.ASM”
LDI ZL,0×60
CLR ZH
LD R0,Z+
LD R1,Z+
ADD R0,R1
CALL DAA
JMP END
.include “daa.asm”
END:
ST Z+,R1
ST Z,R0
Стекът обикновено се инициализира в началото на програмата. Именно там е поставен редът:
.include “STACK.ASM”
При симулация редовете се изпълняват последователно, независимо дали са в отделен файл или не.
Подпрограмите си извикват по обичайния начин. В един допълнителен файл могат да се записват по няколко подпрограми, всяка от която се извиква чрез уникалния си етикет за начало на подпрограмата.
При съставяне на подпрограма в отделен файл се цели тя да бъде максимално универсална. Подпрограмата не трябва да използва регистри, които обикновено се използват от основната програма. Поради множеството на оперативни регистри при контролерите AVR програмистът си създава собствени правила, кои регистри да използва за подпрограми и кои за основната програма. Когато все пак се налага да се използва регистър и в основната програма и в подпрограмата, съдържанието му обикновено в началото на подпрограмата се записва в стека чрез инструкцията PUS, а чрез POP се връща съдържанието му непосредствено преди изхода от подпрограмата.
Сходни статии:
- Програма за събиране на четирибайтови числа с алгебричен знак Програма за събиране на четирибайтови числа с алгебричен знак В следващия пример подпрограмата за обработване на знака е извикана три пъти. При първия път е зададен адресът на първия операнд...
- Програма за преобразуване на еднобайтови двоични числа в BCD код Максималната стойност на еднобайтовото число е 255. За да бъде преобразувано в двоично-десетично, може да се постъпи по следния начин. От зададената стойност да се изважда най-напред100, докато се получи...
- Програма за умножение на еднобайтови числа без алгебричен знак Програма за умножение на еднобайтови числа без алгебричен знак Алгоритъм на умножението Нека е дадено множимото 1101 и множителя1001. Алгоритъмът за умножение на десетични и двоични числа е един и...
- Програма за събиране на четирибайтови числа Програма за събиране на четирибайтови числа Операндите трябва да се заредят най-напред в оперативната памет. За първия операнд са отделени клетките 0х60, 0х61, 0х62 и 0х63; като първата от тях...
- Програма за деление на еднобайтови числа Да се разделят две числа означава, да се установи, колко пъти делителя се нанася в делимото. Това може да стане най-просто, като се изважда делителят от делимото циклично и се...