V predchadzajucej lekcii sme riesili problem ako mozeme z hodnoty cisla vytvorit postupnost desiatkovych cislic, ktore zodpovedaju tomuto cislu. V tejto lekcii budeme riesit ten isty problem, ale namiesto desiatkovej sustavy budeme pracovat v sestnastkovej - budeme vytvarat postupnost sestnastkovych cislic.
Na riesenie tohto problemu pouzijeme ten isty program, len si ho prisposobime na potreby sestnastkovej sustavy. Toto prisposobene vykoname tromi nasledovnymi zmenami:
Nas program z minulej lekcie po tychto troch upravach bude vyzerat takto:
run | ld | hl,#fc12 | Priklad cisla |
bnhx | ld | bc,buffer | Adresa buffera pre cislice |
ld | de,-#1000 | pre sestnastkovy rad 4096 (16^3) | |
call | cifra | vypocet cislice | |
ld | de,-#0100 | ...256-ky (16^2) | |
call | cifra | vypocet cislice | |
ld | de,-#10 | ...sestnastky (16^1) | |
call | cifra | vypocet cislice | |
ld | e,-#01 | ...jednotky (16^0) | |
cifra | ld | a,'0'-1 | vypocet cislice jedneho radu: |
cif1 | add | hl,de | odpocitavame hodnotu radu - |
inc | a | (sucasne pocitame kolko krat) | |
jr | c,cif1 | - az kym neprekrocime nulu | |
sbc | hl,de | Oprava prekrocenia nuly | |
cp | '9'+1 | cislica vecsia ako 9 ? | |
jr | c,cif2 | nie - skok | |
add | a,'a'-':' | ano - korekcia cislic A-F | |
cif2 | ld | (bc),a | ulozenie cislice do buffera |
inc | bc | ukazovatel na dalsie miesto v bu | |
ret | |||
buffer | db | 'xxxxxxxxxxx' | buffer pre nase cislice |
To, co sme prave urobili, bola iba modifikacia uz existujuceho riesenia z minulej lekcie. Je to dobry a v praxi velmi pouzivany postup, ale tento postup nam neprinasa ziadne vecsie originalne myslienky. Skusme sa preto teraz pozriet na tento problem z uplne inej strany !
Na vyjadrenie jednej sestnastkovej cislice potrebujeme prave styri bity (pretoze 2^4=16). Parovy register ma 16 bitov (rozdelme si to na styri stvorice bitov) a cislo v nom vyjadrene sa da zapisat styrmi sestnastkovymi cislicami. Ked sa nad tym zamyslime, prideme na to, ze jednu konkretnu sestnastkovu cislicu urcuje iba jej prisluchajuca stvorica bitov v parovom registri. Nedala by sa tato vlastnost vhodne vyuzit v nas prospech ?
Vytvorme si rutinku (nazvime ju "bnhx4") ktora nam zo styroch bitov (napr. styri najnizsie bity v akumulatore) vypocita ASCII-kod prislusnej sestnastkovej cislice a ulozi ho do buffera. Tymto sa cely problem prevodu cisla na postupnost sestnastkovych cislic redukuje na postupne aplikovanie rutinky "bnhx4" na vsetky stvorice bitov v nasom cisle - v poradi od najvyznamnejsej stvorice po najmenej vyznamnu.
Teraz si vytvorme rutinku "bnhx8" ktora vezme jeden bajt (dve stvorice bitov v akumulatore) a aplikuje rutinu "bnhx4" najprv na vyssie a potom na nizsie styri bity tohto bajtu. Nakoniec vytvorme poslednu rutinku "bnhx" ktora vezme nase cislo v (parovom registri HL) a aplikuje rutinku "bnhx8" najprv na register H (vyssi bajt) a potom na register L (nizsi bajt).
run | ld | hl,#fc12 | Priklad cisla |
bnhx | ld | bc,buffer | Adresa buffera pre cislice |
ld | a,h | vyssy bajt = rady 4096 a 256 | |
call | bnhx8 | spracovanie jedneho bajtu cisla | |
ld | a,l | nizsi bajt = rady 16 a 1 | |
bnhx8 | push | af | uschova jedneho bajtu cisla |
rrca | - presun vyssich styroch | ||
rrca | - bitov tohto bajtu | ||
rrca | - do nizsich bitov | ||
rrca | - (kvoli vypisu) | ||
call | bnhx4 | spracovanie tychto presunutych bitov | |
pop | af | obnova povodneho bajtu cisla | |
bnhx4 | and | #0f | vynulovanie nezaujimavych bitov |
add | a,'0' | Vypocet ASCII-kodu cislic 0-9 | |
cp | '9'+1 | cislica vecsia ako 9 ? | |
jr | c,bnhx0 | nie - skok | |
add | a,'a'-':' | ano - korekcia cislic A-F | |
bnhx0 | ld | (bc),a | ulozenie cislice do buffera |
inc | bc | ukazovatel na dalsie miesto v bufferi | |
ret | |||
buffer | db | 'xxxxxxxxxxx' | buffer pre nase cislice |
Na domacu ulohu sa skuste zahrat na samotny procesor Z80 a skuste si tento program prejst od zaciatku (navestie "run") az do samotneho konca. Prave takto najlepsie uvidite a na vlastnej kozi pocitite, kadial a kolkokrat musi procesor prebehnut aby mohol splnit ulohu, ktorou sme ho poverili. Zvlast si davaje pozor na zasobnik - co a kedy sa don uklada a co a kedy sa z neho cita.
Vas Busy.