Ste se kdaj vprašali, kakšen je videti vaš program, ko ga Bascom-AVR prevede v obliko, ki je razumljiva mikrokontrolerju? Tega ni tako težko izvedeti – samo odpreti morate .hex datoteko in pogledati nize heksadecimalnih števil, ki so zapisane v njih. Videti je nekoliko nečitljivo, kaj pravite? Težko je verjeti, da bi lahko ti „nizi naključnih števil“ komurkoli karkoli pomenili. Ampak ne, ta števila niso naključna in da, ta števila vodijo mikrokontroler, da deluje točno tako, kot ste zapisali v svojem programu.
Obstaja preprosto orodje, s katerim lahko pretvorite heksadecimalno zapisani objektni program v popolnoma razumljiv simbolični jezik, asembler (zbirnik). Orodje se imenuje disasembler: gre za računalniški program, ki prebere *.hex datoteko, v kateri je zapisan program, ki ga „razumejo“ (v našem primeru) AVR mikrokontrolerjem in ga izpiše v obliki ukazov zbirnika (asemblerja). Če bi iste ukaze v zbirniku spet prevedli z AVR zbirnikom, bi dobili enako objektno kodo, s katero smo začeli. No, mi ga bomo uporabljali na drugačen način – disasemblirani program je namreč lažje brati in razumeti kot niz heksadecimalnih števil.
Za disasembliranje običajno uporabljam Revava disasembler. To je brezplačni program, ki si ga lahko naložite z različnih internetnih strani, lahko v obliki C++ izvorne koda ali kot že preveden (.exe) program. V C++ obliki programa boste zraven najpogosteje dobili tudi navodila kako ga prevesti. Nameščanje ni potrebno: enostavno shranite program revava.exe v mapo, kjer so tudi ostali vaši Bascom-AVR programi (bolj natančno, njihove .hex datoteke) in že je pripravljen za uporabo. Uporabite lahko tudi druge podobne programe, vendar se bo njihov način uporabe in njihove izhodne datoteke delno razlikovale od primerov, ki jih bomo analizirali tukaj.
Slika 1 prikazuje primer disasembliranja objektnega programa, ki ga vsebuje datoteka Asm_1.hex v zbirniku. Objektni program iz tega primera je rezultat prevajanja „praznega“ Bascom-AVR programa, v katerem je zapisan le End ukaz. Kljub temu je Bascom-AVR ustvaril nekaj programske kode. Revava se izvaja znotraj DOS-ovega okna:
>revava Asm_1.hex,-o Asm_1.txt -e
Asm_1.hex:
- ime vhodne .hex datoteke
-o:
- sledi ime izhodne datoteke
Asm_1.txt:
- naziv izhodne datoteke
-e:
- uporablja Intelov način zapisa
Najpogosteje uporabljam le opciji -o in -e, izpis vseh opcij pa dobite, če vpišete le „revava“, bez dodatnih opcij. Ustvarjen asemblerski program je prikazan na sliki 1 spodaj. Ta izpis je še dodatno malce „ročno obdelan“, da je bolj čitljiv. Da bi ga razumeli, je potrebno splošno predznanje o programiranju v zbirniku in poznavanje mnemonikov (asemblerskih ukazov, oznak), ki jih uporabljamo za programiranje v asemblerju za AVR mikrokontrolerje. Nekaj informacij o tem lahko najdete tudi v Bascom-AVR help-u, v poglavjih „Assembler mnemonics“ in „Mixing ASM and BASIC“. Priporočljivo je, da si dobro ogledate tudi poglavje „Language Fundamentals“.
Preden se spustimo v analizo programa, si oglejmo še samo strukturo izpisa. Revava disasembler je izpisal ukaze zbirnika kjerkoli je bilo to mogoče. Nize, ki jih ni prepoznal, pa je prikazal kot podatke (dc.W deklaracije). V vsaki vrstici se nahaja komentar (začne se za znakom »;«) v katerem je zapisan naslov, na katerem se nahaja disasembliran ukaz ali podatek. Če gre za ukaz skoka, razvejanja ali klic podprograma, je naveden tudi ciljni naslov (napisan je za „Dest:“). V primerih, ko je lahko objektna koda nastala s prevajanjem dveh ali več asemblerskih ukazov, so prikazane vse možnosti. Te alternative so prikazane kot skupina ukazov, pred katero in za katero je ena prazna vrstica. Razen prvega so vsi ostali ukazi takšne skupine opremljene s komentarji, kot kaže naslednji primer:
brbc 1, -6,_ ; 0054, Dest: 0050
;brne -6,_ ; 0054, Dest: 0050
clr r6 ; 0056
;eor r6, r6 ; 0056
Tu ukaza BRBC in BRNE in tudi CLR ter EOR, ustvarita enako objektno kodo. Revava ne more „vedeti“, kateri ukaz je bil prvotno res napisan, zato ponudi obe možnosti (lahko jih je tudi več). Opazili boste, da sta alternativna ukaza, v našem primeru BRNE in EOR, opremljena z znakom za komentar (;), zato ne vplivata na kodo pri prevajanju. V naslovnem delu vrstice vidimo, da se nahajata na istih naslovih kot ukazi, katerim so alternative. V konkretnem programu izberemo ukaz, ki se nam zdi bolj smiseln; katerokoli izberemo, bo končni rezultat enak, saj vsi ukazi znotraj ene skupine povzročijo ustvarjanje enake objektne kode. V primeru na Sliki 1 so izbrisani vsi alternativni predlogi, da je program bolj čitljiv.
Zdaj pa poskusimo analizirati, kako je Bascom-AVR prevedel prazen program!
Pokukajmo v notranjost programa Bascom-AVR
2012_SE193_33