Toto je novy serial nazvany
Strojovy kod pre pokrocilych. Ukazeme si v nom
nejake najprv jednoduche, potom aj trosku zlozitejsie rutinky a podprogramy.
Nebudeme sa zameriavat na cinnost jednotlivych instrukcii, ani na to, co
robia samostatne, ale budeme si ich vsimat ako sucast tychto rutin a zameriame
sa na ich cinnost vzhladom na okolite instrukcie v rutinke - inymi slovami
budeme sledovat ich cinnost v kontexte s ostatnymi instrukciami.
Este predtym, nez zacneme s jednotlivymi lekciami, povieme si nieco
o sestnastkovej sustave. Ti, ktori ju "maju v malicku", mozu samozrejme
tuto cast preskocit.
Ako uz sam nazov hovori, tato ciselna sustava pouziva sestnast roznych cislic
pri zapise cisla. Kedze ale arabskych cislic je iba desat, ako dalsich
sest cislic sa pouzilo prvych sest pismen abecedy: A,B,C,D,E,F.
Takze sestnastkova sustava pouziva tieto cislice:
cislica | hodnota | cislica | hodnota | |
'0' | 0 | '8' | 8 | |
'1' | 1 | '9' | 9 | |
'2' | 2 | 'A' | 10 | |
'3' | 3 | 'B' | 11 | |
'4' | 4 | 'C' | 12 | |
'5' | 5 | 'D' | 13 | |
'6' | 6 | 'E' | 14 | |
'7' | 7 | 'F' | 15 |
Namiesto velkych pismen 'A' az 'F' sa kludne mozu pouzivat aj male 'a' az 'f'.
Sestnastkova sustava sa niekedy zvykne oznacovat aj ako hexadecimalna
(hexa=sest, deci=desat). Obidve pomenovania su spravne a mozno ich pouzivat.
Ak sa napise cislo v sestnastkovej sustave, je vhodne nejak dat najavo, ze
je v sestnastkovej sustave. Ak by sa totiz v cisle nachadzali iba desiatkove
cislice, mohol by toto cislo niekto povazovat za desiatkove.
Toto odlisenie sa zvykne robit dvomi sposobmi:
My budeme pouzivat tento druhy sposob a pred kazde sestnastkove cislo vlozime
znak #. To preto, lebo toto oznacenie pouziva vecsina ladiacich
systemov strojoveho kodu Z80.
Ukazme si teraz na konkretnom priklade sposob, ako nejake cislo dostat do
sestnastkovej systavy. Nech je to napriklad cislo 60000.
Nakoniec vezmeme vsetky zvysky a napiseme ich v opacnom poradi, nez ako sme ich dostali. Teda nase zvysky budu 14,10,6,0. Este namiesto cisel 14 a 10 dosadime prislusne cislice a dostavame sestnastkove vyjadrenie cisla, ktore znie #EA60. Teda 60000 sa pise v sestnastkovej sustave #EA60.
Teraz si ukazme opacny prevod - ak mame cislo v sestnastkovej sustave a chceme
zistit, aku ma vlastne hodnotu. Majme teda cislo napriklad #BC00.
Hodnotu akehokolvek cisla vypocitame analogicky ako v desiatkovej sustave po
jednotlivych (teraz ale sestnastkovych) radoch. Cize:
#BC00 = 11*16^3 + 12*16^2 + 0*16^1 + 0*16^0 = 48128
Teda cislo #BC00 je v desiatkovej sustave 48128.
Preco sa vlastne v oblasti strojoveho kodu casto pouziva prave setnastkova
sustava ?
Rozsahy drvivej vecsiny adries a udajov v pocitaci su mocninou dvoch.
Napriklad bajt ma 8 bitov (8=2^3) a tolko isto bitov ma aj priamy operand
v niektorych strojovych instrukciach. 8-bitovy rozsah cisla dokaze zobrazit
256 cisel (256=2^8). Procesor Z80 dokaze adresovat prave
65536 pametovych buniek a 65536 perifernych zariadeni (65536=2^16), pretoze
ma 16-bitovu adresovu zbernicu (16=2^4), tak isto aj registrove pary ako napr.
BC,DE,HL,IX,IY maju tiez 16 bitov a tiez aj niektore instrukcie maju priamy
operand 16-bitovy.
Teraz si len tak pre zaujmavost povedzme vsetky tieto cisla v sestnastkovej
sustave. Takze: 8-bitovy operand dokaze zobrazit prave #100 cisel, procesor
Z80 vie adresovat prave #10000 pametovych buniek a #10000 periferii, pretoze
ma #10-bitovu zbernicu. Ktore cisla sa vam pacia viac ? Ktore cisla
si lepsie zapametate ? Take, co vyzeraju uplne vseobecne (65536,256) alebo
take, co su pekne okruhle (#10000,#100) ?
Dalsi dovod na pouzivanie sestnastkovej sustavy je aj vecsia prehladnost
programu vo vecsine situacii. Napriklad ked v programe zbadate instrukciu
LD HL,#EA60ihned viete, ze do registra H sa zapise #EA a do L #60. Keby to bolo napisane takto:
LD HL,60000
museli by ste si to najskor prepocitat (hodnota v H = INT(60000/256).
Preco to v sestnastkovej sustave tak jednoducho funguje ?
Skusme to prepocitat: INT(#EA60/#100) = #EA, pretoze delenie cislom ktore ma na
zaciatku iba jednu jednotku za ktorou nasleduju nuly je presne take iste ako
v desiatkovej sustve - proste na to, aby sme dostali celociselnu cast podielu,
musime odrezat od delenca tolko miest, kolko nul ma delitel.
Teraz sa pozrime, aka hodnota sa dostane do registra L. Pri cisle #EA60 je to
hned jasne - do L sa dostane hodnota #60. Preco ? Vysvelime si to vypoctom.
Do L sa vlastne zapise nizsi bajt cisla #EA60 (v H je vyssi bajt).
Nizsi bajt dvojbajtovej hodnoty X sa pocita takto:
256*(X/256-INT(X/256))V sestnastkovej systave to potom bude vyzerat takto:
#100*(X/#100-INT(X/#100))
Lenze delit cislo #100 znamena iba posunut desatinnu ciarku (v nasom pripade
to vlastne bude sestnastinova ciarka) o dve miesta vlavo. Funkcia INT funguje
normalne - proste ureze vsetko za ciarkou (X kladne cislo). Nasobenie cislom
#100 je analogicke ako delenie, ale ciarka sa posuva o dve miesta vpravo.
Cize ak za X dosadime hodnotu #EA60, po vypocte dostavame nizsi bajt #60.
Pred zaverom si este ukazeme takyto priklad: Vieme, ze v registri H je hodnota #80 (desiatkovo 128), v registri L je #c0 (desiatkovo 192). Naraz najdeme v programe takuto instrukciu:
LD (HL),#40
Ten, kto pozna sestnastkovu sustavu hned vie, ze udaj #40 sa ulozi na adresu #80c0. Ale kto ju nepozna, musi vypocitat vyraz 128*256+192 aby zistil, ze kam sa uklada tento udaj.
Velka prehladnost sestnastkovej sustavy sa najviac prejavi pri adresacii
pamete. Totiz vsetky dolezite adresy v pocitacoch su v sestnastkovej sustave
obvykle velmi pekne a okruhle cisla. Napriklad ak sa povie ze PC/XT ma 640kB
pamete, je to vlastne #A0000 bajtov. V desiatkovej sustave by cislo #A0000
vyzeralo asi takto: 655360. Alebo ine priklady - tentoraz z pocitacov
ZX Spectrum a Didaktik: Romka ma kapacitu #4000 (desiatkovo 16384) bajtov,
ramka ma #c000 (49152) bajtov, videoramka zacina na adrese #4000 (16384),
je dlha #1b00 (6912) bajtov, z toto prvych #1800 (6144) tvori bodovy vzor a
od adresy #5800 (22528) su atributy, ktorych je #300 (768).
To by ako priklad malo uplne stacit. Myslim si, ze ta namaha, ktoru vynalozite
na ziskanie zrucnosti a prehladu v sestnastkovej sustave sa vam mnohokrat
vrati, ked budete robit alebo skumat programy v strojovom kode.
Vas Busy.