Vypis desiatkoveho cisla

   V minulych lekciach sme si ukazali, ako mozeme z postupnosti cislic vypocitat hodnotu tohto cisla. Dnes si pohovorime o opacnom probleme - ako sa da hodnota cisla previest na postupnost cislic a tuto postupnost zapisat do vhodneho buffera.

   Ked sme menili postupnost cislic na hodnotu, museli sme vediet, v akej ciselnej sustave je vlastne to cislo zapisane. Podobne aj pri opacnom prevode nam musi byt jasne v akej sustave bude vysledna postupnost cislic. Pre zaciatok si zvolme ten jednoduchsi pripad - ze chceme dostat postupnost desiatkovych cislic.

   Tento prevod je vlastne presne taka ista uloha, aku sme riesili v uvodnej nultej lekcii, ked sme chceli previest nejake cislo do sestnastkovej sustavy. Rozdiel je len v tom, ze namiesto nas to tentoraz bude robit pocitac, ktory ma dane cislo v nejakom registri a prevadza ho do desiatkovej sustavy (namiesto delenia sestnastimi bude cislo delit desiatimi). Kedze delit ste sa uz naucili v piatej lekcii, urcite nebude problem pre vas napisat takyto program. Kto chce a trufa si, moze si to skusit.

   Ja vam vsak ponukam ine, efektivnejsie riesenie, ktoreho princip je ovela blizsi ludskemu ponimaniu cisla. Jeho myslenkou je postupne odcitavanie desiatkovych radov, pricom si zaznamenavame kolko krat sa nam prislusny rad podarilo odcitat. Cize napiklad ak sa nam od cisla podari tri razy odcitat hodnotu desattisic tak vieme, ze nase cislo bude mat na mieste pre desattisice cislicu 3. Najvyssie mozne cislo este zobrazitelne v parovom registri je 65535. Preto nam bude stacit vypocet iba pre tychto pet radov a teda aj buffer dlhy pet bajtov.

   Princip prace programu je takyto: Program vezme najprv najvyssi rad - desattisice a tento rad odcitava dovtedy, pokial hodnota cisla neklesne pod 10000. Potom vezme najblizsi nizsi rad (tisice) a od novej hodnoty odcitava pokial sa to este da (pokial opet hodnota neklesne tentoraz pod 1000). Tento postup vykovava pre vsetky rady az po jednotkovy rad.

   Odpocitavanie v kazdom rade sa deje nasledovne: Na zacatku sa vlozi do akumulatora ASCII kod znaku 0. Pri kazdom odpocitani sa hodnota v akumulatore zvysi o jednotku. Kedze ASCII kody ciselnych znakov idu bezprostrene za sebou, na konci odpocitavania mame v akumulatore priamo ASCII kod cislice prislusneho radu. Tento kod sa ulozi do buffera. Na ukladanie cislic je pouzity register BC, ktory obsahuje adresu pameti kam sa ma ulozit kod nasledujucej cislice.

run ld hl,54321 Priklad cisla 
    
bndc ld bc,buffer BC bude ukazovatel do buffera 
 ld de,-10000 Pre desiatkovy rad desattisice: 
 call cifra vypocet cifry 
 ld de,-1000 ...tisice 
 call cifra vypocet tisicov 
 ld de,-100 ...stovky 
 call cifra vypocet stoviek 
 ld e,-10 ...desiatky 
 call cifra vypocet desiatok 
 ld e,-1 ...jednotky 
cifra ld a,'0'-1 Vypocet cislice jedneho radu: 
cif1 add hl,de odcitavame hodnotu radu a 
 inc zaroven pocitame ze kolko krat, 
 jr c,cif1 kym neprekrocime nulu 
 sbc hl,de Oprava prekrocenia nuly 
 ld (bc),a ulozenie kodu cislice do buffera 
 inc bc ukazovatel na dalsie miesto v bufferi 
 ret  koniec a navrat 
    
buffer db 'xxxxx' buffer pre vznikajuce cislo 

   Ked si dobre vsimnete tento program, na vase mozno velke prekvapenie zistite, ze v slucke, kde sa odcitavaju rady (cif1) je instrukcia scitania ! Je to tak preto, lebo instrukcia add hl,de ma menej bajtov ako sbc hl,de (usetrime pamet), okrem toho sa rychlejsie vykona (usetrime cas) a navyse nepotrebuje mat na zaciatku vynulovany carry. Mozeme si to dovolit podla matematickeho pravidla, ktore hovori ze "odcitat kladne cislo je to iste ako pricitat zaporne s rovnakou absolutnou hodnotou". Preto sa na zaciatku programu do registra DE vkladaju desiatkove rady ako zaporne cisla. Toto nase "dolu hlavou" obratene odcitanie ma jeden zaujimavy dosledok - priznak carry nam opacne signalizuje pretecenie. To znamena, ze ak nie je pretecenie, carry bude nastaveny a ked nastane pretecenie, carry bude nulovy. Toto musime zohladnit pri teste prekrocenia nuly.

   Vsimnime si este jednu vec: Slucka na vypocet jednej cislice velmi pripomina delenie odcitanim. Aj tu delitela (prislusny desiatkovy rad) odcitavame az dovtedy, pokym delenec (hodnota cisla) nie je zaporny. Kedze vsak potrebujeme poznat aj hodnotu zvysku, musime na zaver slucky spravit korekciu prekrocenia nuly - presne tak, ako sme to robili pri deleni v piatej lekcii. Toto posledne odcitanie, ktorym sme sa s delencom dostali az pod nulu, uz nesmieme ratat do vysledku - preto sa na zaciatku slucky dava do akumulatora hodnota o jednotku mensia ako ASCII kod nuly.

   Na domacu ulohu sa skuste zamysliet nad tym, ako by vyzeral program, ktory meni hodnotu cisla na postupnost sestnastkovych cislic.

Vas Busy.

Nazad / back , predchadzajuca a dalsia lekcia