Sestnastkova alebo hexadecimalna sustava

   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' '8' 
'1' '9' 
'2' 'A' 10 
'3' 'B' 11 
'4' 'C' 12 
'5' 'D' 13 
'6' 'E' 14 
'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:

  1. Za sestnastkove cislo napiseme velke pismeno 'H' (ako hexadecimaly). Tento sposob sa casto pouzival na niektorych starsich systemoch, ale i dnes sa s nim mozno stretnut.
  2. Pred nase cislo sa napise nejaky dohodnuty specialny znak, ktorym dame najavo, ze sa jedna o sestnaskove cislo. Obvykle to byvaju znaky ako #,&,%.

   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.

  1. Vydelime cislo 60000 cislom 16. Dostaneme vysledok 3750 a zvysok 0.
  2. Vysledok, ktory dostaneme zase vydelime cislom 16. Dostaneme 234 a zvysok 6.
  3. Hodnotu 234 zase vydelime 16 a dostavame 14 a zvysok 10.
  4. Teraz cislo 14 vydelime 16 a dostavame vysledok 0 a zvysok 14.
  5. Nas vypocet v tomto bode uz moze skoncit, lebo dalsimi deleniami by sme stale dostavali same nulove vysledky a zvysky.

   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,#EA60
ihned 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.

Nazad / back , dalsia lekcia