;Kaj moram popraviti: ;*** Desetiski izpis z brisanjem vodilnih nicel *** (R0,R4,R5) ;v komentarju ni natancno navedeno, katere registre uporabljamo: ;klicemo DELI10, ki uporablja R0, R1, R2 in R3 ;klicemo ZNAK, ki uporablja R0 in R1 ;razpolozljivi sklad ni neskoncno velik, koliko sklada uporabljamo? DECIZP_SP STR LR,[SP,#-4]! MOV R4,#10 ;zacetek zanke DECIZP1_SP BL DELI10 ;izpisi desetiska mesta na sklad STR R0,[SP,#-4]! ;ostanek (cifro) shrani na sklad SUBS R4,R4,#1 BPL DECIZP1_SP ;dodan komentar: cifre s sklada posiljamo na zaslon LDR R0,=0x80 ;nastavi polozaj BL UKAZ MOV R4,#10 ;stevec cifer MOV R5,#0 ;zastavica za cifro razlicno od 0 ;*** Beri cifre s sklada in nadomescaj 0 s presledkom *** ( SKLAD_BERI ;zacetek popravka: tukaj manjka ukaz, katerih nicel ne bomo nikoli brisali CMP R4,#6 ;ali smo na mestu enic, ker nicle enic nikoli ne brisemo? MOVEQ R5,#1 ;postavimo zastavico, da nicel ne brisemo vec ;konec popravka CMP R4,#5 ;ali smo na mestu za dec. piko BNE NI_PIKA MOV R0,#'.' BL ZNAK NI_PIKA LDR R0,[SP],#4 CMP R5,#1 ;ali smo ze izpisali !=0 cifro BEQ NI_0 CMP R0,#0 BNE NI_0 MOV R0,#' ' ;cifra je 0, izpisemo presledek B IZPISI_ZNAK NI_0 ADD R0,R0,#'0' ;ASCII offset za 0 MOV R5,#1 ;cifra razlicna od 0 IZPISI_ZNAK BL ZNAK SUBS R4,R4,#1 ;zmanjsamo stevec cifer BPL SKLAD_BERI MOV R0,#' ' BL ZNAK MOV R0,#'M' BL ZNAK MOV R0,#'H' BL ZNAK MOV R0,#'z' BL ZNAK LDR PC,[SP],#4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Kako bi jaz vse skupaj skrajsal z uporabo pogojno izvedljivih ukazov ARM: ;*** Desetiski izpis z brisanjem vodilnih nicel *** (R0-5, SKLAD-48) ;neobvezen komentar, uporaba sklada: en polozaj (4byte) za LR in 11 polozajev (44byte) za 11 cifer ;vprasanje: ali je mozno, da iz 32-bitnega stevila dobimo 11 desetiskih cifer? DECIZP_SP STR LR,[SP,#-4]! MOV R4,#10 ;zacetek zanke DECIZP1_SP BL DELI10 ;izpisi desetiska mesta na sklad STR R0,[SP,#-4]! ;ostanek (cifro) shrani na sklad SUBS R4,R4,#1 BPL DECIZP1_SP ;dodan komentar: cifre s sklada posiljamo na zaslon LDR R0,=0x80 ;nastavi polozaj BL UKAZ MOV R4,#10 ;stevec cifer MOV R5,#' ' ;podremo zastavico za cifro razlicno od 0 z ASCII kodo za presledek SKLAD_BERI ;zanka za branje cifer s sklada CMP R4,#6 ;ali smo na mestu enic, ker nicle enic nikoli ne brisemo? MOVEQ R5,#'0' ;postavimo ASCII znak za '0' v zastavico, da nicel ne brisemo vec CMP R4,#5 ;ali smo na mestu za dec. piko? MOV R0,#'.' BLEQ ZNAK ;izpisemo piko, klic podprograma pogazi zastavico EQ! LDR R0,[SP],#4 ;precitamo cifro iz sklada CMP R0,#0 ;ali je cifra enaka nic? MOVEQ R0,R5 ;niclo zamenjamo z vrednostjo zastavice (presledek ali nicla ASCII) ADDNE R0,R0,#'0' ;ne-niclo pretvorimo v ASCII znak tako, da pristejemo kodo za niclo MOVNE R5,#'0' ;postavimo ASCII znak za '0' v zastavico, da nicel ne brisemo vec BL ZNAK ;izpisemo presledek ali cifro kot ASCII znak SUBS R4,R4,#1 ;zmanjsamo stevec cifer BPL SKLAD_BERI MOV R0,#' ' ;izpisemo mersko enoto BL ZNAK MOV R0,#'M' BL ZNAK MOV R0,#'H' BL ZNAK MOV R0,#'z' BL ZNAK LDR PC,[SP],#4