Samomodifikujuce sa programy II.

   V dvoch predoslych lekciach sme sa zaoberali problemom ako pre nejake N zadane v registri A vypocitat hodnotu 2^N a vysledok vratit zase v registri A, co inymi slovami povedane je uplne ten isty problem ako v registri A nastavit N-ty bit a ostatne bity vynulovat, pricom cislo N mame na zaciatku zadane tiez v registri A.

   V dnesnej lekcii sa na tento problem pozrieme trosku z inej strany. Vynulovat register A je pomerne jednoduche, robi to hned niekolko instrukcii ako napriklad XOR A alebo SUB A. Nastavenie X-teho bitu je tiez jednoduche: SET X,A. Napadlo vas pri citani minulej lekcie, ze aj takto mozno riesit nas problem ?

   Mozno i nemozno. Vec ma jeden hacik. Hacik spociva v tom, ze instrukcie SET X,A ma X pevne dane operacnym kodom instrukcie a to nam nevyhovuje. Existuju sice vsetky moznosti tejto instrukcie pre X od 0 do 7, avsak kedze chceme aby rutinka fungovala pre lubovolne N v tomto rozsahu, museli by sme pouzit vsetky instrukcie a podla konkretnej hodnoty N nejakym sposobom urcit, na ktoru z nich skocime aby sa nastavil potrebny bit v registri A. Chcelo by to preto nejaku instrukciu, ktora by mala moznost hodnotu X ziskat z nejakeho registra. Avsak takato instrukcia neexistuje, takze v tomto ohlade mame proste smolu.

   Pametate sa, ako sme v minulej lekcii modifikovali instrukciu skoku JR ... ? Skusme podobnym sposobom nejak modifikovat instrukciu SET X,A tak, aby X bolo take, ake potrebujeme.

   Rozanalyzujme si z akych bajtov sa sklada instrukcia SET X,A. Ak mate po ruke tabulky, v ktorych sa nachadzaju aj operacne kody instrukcii, vezmite si ich a sledujte spolu so mnou. Prvy bajt instrukcie SET X,A je prefix #CB, ktory nas z hladiska zmeny X nemusi zaujimat, pretoze v nom sa nenachadza ziadna informacia o X. Druhy a posledny bajt je samotny operacny kod instrukcie, ktory v binarnom tvare vyzera takto: 11KLM111, kde bity K,L,M priamo urcuju hodnotu X.

   Problemom ostava uz len dostat cislo N od 0 do 7 z dolnych troch bitov registra A do bitov K,L,M tohto operacneho kodu. Riesenie nie je o nic zlozitejsie ako samotny problem. Staci register A rotovat tri krat dolava, vsetky ostatne bity okrem K,L,M nastavit do jednotky a tym ziskame v registri A operacny kod instrukcie ktory uz len zapiseme do druheho bajtu instrukcie SET X,A. Nasa rutinka bude vyzerat takto:

rut4 rlca  Bity 0,1,2 potrebujeme dostat do bitov 3,4,5 
 rlca  preto register A zarotujeme trikrat dolava 
 rlca  Ked su nase tri bity na spravnom mieste, 
 or %11000111 vsetky ostatne bity nastavime do jednotky 
 ld (ddd+1),a Ziskany operacny kod instrukcie ulozime a 
 xor pred nastavenim bitu register A vynulujeme 
ddd set 0,a Samotne nastavenie potrebneho bitu 
 ret  a nakoniec navrat nazad. 

   Rutinka zabera v pameti 12 bajtov, a co je velmi zaujimave, ma konstantny cas trvania 54 taktov ktory nie je zavisly od hodnoty N.


   Verim ze vam tieto lekcie programovania v asembleri Z80 ukazali ako vyzera programovanie v praxi a dali vam mnoho napadov ako pisat rozne strojove programy pre procesor Z80 a ze pripadne i niektore rutinky ktore sme si tu ukazali vyuzijete v bohatej programatorskej praxi, ktora sa pred vami prave otvara...

Vas Busy.

Nazad / back , predchadzajuca lekcia