logonanoSoft2.gif, 1 kB

Lekcia č.2 Analýza programu v strojovom kóde.

Úloha:

Čo budeme potrebovať:

V najjednoduchšom prípade bude postačovať
Inštrukčný súbor AT89S8252 Znova platí, že informácie sa dajú získať na webových stránkach. Často je v nich ale veľké množstvo chýb. Znova radšej siahnite po oficialnom dokumente nejakého výrobcu mikroradičov.
simulačný program pre MCU 8051 Simulačné programy pre 8051 určite keď pohľadáte tak, nejaký nájdete. Osobne sa mi ale žiadny nezapáčil na toľko, že by som ho používal. Ak je program volný, tak zvyčajne nie je dostatočne pohodlný a názorný A ak je pohodlný a názorný, tak je to demo nejakého komerčného vývojového software pre 8051 s rôznymi obmedzeniami.
Ak chtete skutočne analyzovať program ktorý je v mikroradiči, tak treba postupovať na jeho prečítanie podľa lekcie číslo 1.

Teoretická príprava:

Program mikroradiča sa skladá z jednotlivých inštrukcií. Sú to veľmi jednoduché inštrukcie, ktoré dokáže vykonať centrálna procesorová jednotka (CPU) ukrytá vo vnútri obvodu. Inštrukcie sú uložené v pamäti programu ako osem bitové číslicové slová. Inštrukcie mikroradičov rodiny 8051 majú rôznu dĺžku. Znamená to, že inštrukcie sa skladajú z jedneho alebo dvoch alebo troch osem bitových slov (byte). Pričom prvému byte hovoríme operačný kód a ďalšie (ak sú), to sú údaje potrebné pre vykonanie inštrukcie. Inštrukcie sa zapisujú za sebou a rozoznať kde sú operačné kódy inštrukcií a kde nasledujú údaje sa nedá priamo. Jediný východiskový bod ktorý máme je adresa 0 od ktorej sa po resete začnú inštrukcie vykonávať. Pri analýze preto postupujeme tak, že z adresy 0 zistíme operačný kód inštrukcie. Podľa neho zistíme aká je to inštrukcia (čo robí) a aj to koľko zaberá byte. O tento počet byte sa posunieme ďalej a tam zase najdeme operačný kód. A tak dookola. Celej tento činnosti sa hovorí spätný preklad, pretože sa zo strojového kódu snažíme dopátrať pôvodného programu v zdrojovom tvare.

Situáciu komplikujú inštrukcie skoku. Tieto sú navyše dvoch typov, nepodmienené a podmienené. Inštrukcia skoku nás môže pri analýze poslať na úplne inú adresu než by mala nasledovať za inštrukciou. A to sa pri podmienených skokoch deje na základe aktuálnych podmienok vo vnútri mikroradiča. Preto spätný preklad nie je priamočiara činnosť a vyžaduje veľmi dobrú znalosť inštrukcií. Ľudia ktorý to dokážu sú označovaný ako hacker. Vďaka médiam, ktoré verejnosti predstavovali zvyčajne hackerov, ktorý spáchali nejaký trestný čin, vznikol dojem, že sú to počítačový zločinci. V skutočnosti sú to ľudia, ktorý dokonale rozumejú tomu čo sa vo vnútri počítača deje a vedia to využiť, prípadne aj zneužiť vo svoj prospech.

Aká inštrukcia zodpovedá operačnému kódu sa koľko zaberá byte sa dá zo súboru ktorý popisuje inštrukcie 8051. Na strane 2 sa začína tabuľka ktorej riadky a stĺpce sú označené hexadecimálnymi číslicami. Ak operačný kód je napríklad 42H tak z tejto tabuľky zistíme že ide o inštrukciu ADD A,#data a podľa označenia 2B vieme, že zaberá dva byte. Na tretej strane tabuľka pokračuje a tu si môžeme napríklad zistiť že operačný kód 4CH je inštrukcia SWAP A a zaberá jeden byte (ak tam chýba 2B alebo 3B tak je dĺžka 1B).

V tom istom dokumente na strane 7 je tabuľka ktorá poskytuje rovnaké informácie možno ešte v pohodlnejšej forme.

tabulkaOpcode.png, 19 kB

V prvom stĺpci je operačný kód inštrukcie. V druhom stĺpci je počet byte ktoré inštrukcia zaberá. V treťom stĺpci je symbolický zápis inštrukcie, ktorý sa lepšie pamätá ako nejaké číslo. A v poslednom štvrtom stĺpci sú operandy inštrukcie.
Ak nás zaujíma podrobný popis napríklad inštrukcie SWAP A stací si ju nechať vyhľadať a je to.

Pochopenie činnosti programu sa deje ľahšie ak máme k spätnému prekladu vhodné programové vybavenie. Pre náš účel postačuje hocijaký simulačný program, ktorý na počítači PC simuluje činnosť 8051. Tento nám automaticky dokáže previesť operačný kód na symbolický zápis inštrukcie. A tiež nám dovolí simulovať činnosť programu krok za krokom tak, že pri tom môžeme sledovať všetko čo sa vo vnútri odohráva. Aj tak prísť na funkciu programu nie je jednoduché a považujem to za veľmi dobrý spôsob stúdia inštrukcií. Je to niečo na spôsob Čo tým chcel básnik (programátor) povedať. Skutočne programovanie sa dá prirovnať napríklad k skladaniu hudby. Skutočne dobrý skladateľ si dokáže v hlave aj bez hudobných nástrojov predstaviť ako to bude znieť. Rovnako dobrý programátor by si mal tiež byť schopný aj bez simulátora predstaviť aspoň malú časť programu. Existujú ale vynimočné talenty ktoré si zapamätajú celú operu. Medzi počítačovými odborníkmi sú to tzv. praví programátori, ktorý poznajú obsah pamäte naspamäť.

Keďže simulátory sa od seba veľmi lýšia nebudem tu popisovať nejaký univerzálny postup práce ale všetko si ukážeme na konkrétnom príklade.

Ručný spätný preklad:

Vezmime si napríklad program ktorý sme programovali do mikroradiča v prvej lekcii
OpenFlashZenit.png, 44 kB

Takto to vyzeralo keď bol program načítaný do programovacieho bufera programu PonyProg. Na adrese 0 je číslo 02 a to je operačný kód prvej inštrukcie ktorá príde vykonať ako prvá po signále RESET. Pozrieme do tabuľky v dokumetácii a zistíte že je to inštrukcia LJMP addr a zaberá 3 byte. Aby to bolo prehľadné zapíšeme si to takto.
0000 02 00 24	LJMP	0024H
V prvom stĺpci budeme písať adresu inštrukcie. Potom napíšem operačný kód a údajové byte ak sú. No a nakoniec symbolický názov inštrukcie a parametre. Ako vypočítať parameter inštrukcie sa treba prozrieť do presného popisu jednotlivej inštrukcie. Ak budete poriadne usilovný a urobíte spätný preklad až po adresu 0040h dostanete niečo takéto.
0000 02 00 24	LJMP	0024H
0003 32      	RETI
0004 FF      	MOV	R7,A
0005 FF      	MOV	R7,A
0006 FF      	MOV	R7,A
0007 FF      	MOV	R7,A
0008 FF      	MOV	R7,A
0009 FF      	MOV	R7,A
000A FF      	MOV	R7,A
000B 32      	RETI
000C FF      	MOV	R7,A
000D FF      	MOV	R7,A
000E FF      	MOV	R7,A
000F FF      	MOV	R7,A
0010 FF      	MOV	R7,A
0011 FF      	MOV	R7,A
0012 FF      	MOV	R7,A
0013 32      	RETI
0014 FF      	MOV	R7,A
0015 FF      	MOV	R7,A
0016 FF      	MOV	R7,A
0017 FF      	MOV	R7,A
0018 FF      	MOV	R7,A
0019 FF      	MOV	R7,A
001A FF      	MOV	R7,A
001B 02 00 95 	LJMP	0095H
0023 32       	RETI
0024 79 20    	MOV	R1,#20H
0026 7A 60    	MOV	R2,#60H
0028 E4       	CLR	A
0029 F7       	MOV	@R1,A
002A 09       	INC	R1
002B DA FC    	DJNZ	R2,0029H
002D 75 89 10 	MOV	89H,#10H
0030 D2 8E    	SETB	8EH
0032 D2 AF    	SETB	AFH
0034 D2 AB    	SETB	ABH
0036 75 81 08 	MOV	81H,#08
0039 75 30 07 	MOV	30H,#7
003C 12 00 60 	CALL	0060H
003F 20 E0 0F 	JB 	E0H,0051H
0042 30 E1 F7 	JNB	E1H,003CH
0045 15 30    	DEC	30H
0047 E5 30    	MOV	A,30H
0049 B4 02 F0 	CJNE	A,#2,003CH
004C 75 30 14 	MOV	30H,#14H
004F 80 EB    	JMP	003C
A máme ten program pekne prepísaný do čitatelnejšej podoby. Ak by ste chceli môžete začať analyzovať jeho činnosť. Treba si len poriadne naštudovať každú inštrukciu a snažiť sa pochopiť jej význam v programe. Pri ručne písaných programoch v jazyku assembler to pri troche cviku ide, pomerne ľahko, pretože programátor každú inštrukciu vloží s nejakým cieľom. Ak by sme takto spätne analyzovali program napísaný vo vyššom programovacom jazyku. Nechápali by sme význam niektorých inštrukcií pokiaľ by sme nepochopili úplne do detailu činosť prekladača toho vyššieho jazyka. Takéto programy sa tažko spätne analyzujú a ten kto to robí má na to zvyčajne nejaký moc dobrý dôvod. Ostatne všetky komerčné programy majú v licenčnej zmluve napísané, že nie je dovolený ich spätný preklad a analýza.

Nebudem tu teraz vysvetľovať činnosť programu. Chcel som len ukázať postup ako treba analyzovať strojový kód. Tento ručný spôsob je už vhodný len k tomu aby ste pochopili pricíp ako to celé funguje. K skutočnej analýze máme teraz k dispozíci vhodné programoveé vybavenie, ktoré nás zbavuje zbytočnej rutinnej práce.

Analýza programu pomocou simulátora:

V prvom rade treba mať nejaký simulátor mikroradiča 8051. Ako sompísal žiadny čo som našiel na internete sa mi nepáčil a tak som si začal programovať svoj vlastný. Zatiaľ má pomerne málo funkcií a určite sa v ňom nájdu aj chyby, ale snažím sa ho postupne vylepšovať. Tento odkaz umožní jeho získanie. Inštalácia v podstate neexistuje. Stačí iba rozbaliť a spustiť. Okrem toho ešte potrebujete súbor so strojovým kódom. Ak ste su ho neuložili v prvej lekcii tu je naň odkaz.

Po spustení simulátora sa otvorí takéto okno.

usimStart.png, 8 kB

A postupom ako v každom programe si otvoríte súbor programu vo formáte Intel Hex. Zobrazí sa niečo takéhoto.
usimZenit02.png, 50 kB

V pravom okne je výsledok spätného prekladu, ktorý nám okamžite zobrazil niečo veľmi podobné tomu čo sme ručne pred chvíľou vyrábali pomerne dlho a náročne.

Prvý stĺpec obsahuje adresu, inštrukcie, druhý stĺpec obsahuje operačný kód, tretí stĺpec ukazuje symbolický zápis inštrukcie aj operandami, tak ako sa zapisujú pri programovaní. Môžete si všimnúť šedé miesta od adresy 0004H až 000AH. Týmto označením sa snaží simulátor ukázať, že na týchto adresách programu sa nenachádzajú inštrukcie a preto zostanú pri programovaní tieto miesta nenaprogramované - teda s hodnotou 0FFH čomu zodpovedajú inštrukcie MOV R7,A. Ak je program dobre nápísaný nebude to vadiť. Pretože na tieto šedé miesta sa nikdy nedostane.

Analýzu činnosti programu nám teraz spríjemní ďalšia užitočná funkcia simulátora - krokovanie programu. Všimnite si a vyskúšajte ikonu označenú na obrázku červeným rámikom. Každým kliknutím sa vykoná jedna inštrukcia programu. V pravom okne sa nachádza modre zýraznený riadok. To je riadok ktorý sa má práve vykonať. Po kliknutí na ikonu krokovania sa presunie na ďalšiu inštrukciu, ktorá bude vykonaná. V ľavom okne sa zase vypisujú SFR registre mikroradiča. Tu sú sústredené všetky dôležité časti a môžete prehľadne sledovať ako sa menia po jednotlivých krokoch. Môžete si tak overiť či ste správne pochopili význam inštrukcie. A či sa naozaj vykonalo presne to čo ste očakávali.

Simulátor je veľmi silná pomocka pri začiatkoch práce s mikroradičmi. Jeho význam ale nekončí keď sa už naučíte čo robia všetky inštrukcie. Programátor simulátor používa každodenne pri vytváraní programov k odhaľovaniu rôznych chýb.

Záver:

Na koniec zhrnutie čo by ste mali vedieť po tejto lekcii.
  1. Získať predstavu o pojme strojová inštrukcia.
  2. Vedieť ako je inštrukcia uložená v pamäti programu
  3. Pochopiť že v pamäti programu inštrukcie nemusia byť uložené za sebou ale, že program môže skákať z jedného miesta na iné
  4. Pochopiť že niektoré miesta v pamäti programu môžu zostať aj "prázdne". V skutočnosti aj prázdne, lepšie povedané nenaprogramované miesto pamäte programu je inštrukcia.
  5. Vedieť zistiť z operačného kódu symbolický zápis inštrukcie.
  6. Vedieť načítať strojový program v kóde Intel Hex do ľubovolného simulátora 8051 na PC.
  7. Vedieť krokovať program po jednotlivých krokoch. Sledovať pritom zmeny v jednotlivých častiach mikroradiča.

test.gif, 0 kB Na záver niekoľko úloh na overenie správnosti porozumenia problematike
  1. Koľko byte tvorí jednu strojovú inštrukciu pre mikroradiče 8051?
    vždy iba jeden byte
    jeden, dva, alebo tri byte
    štyri byte
    jeden, dva, nikdy však nie tri
  2. Inštrukcia z ktorej adresy pamäte programu je vykonaná ako prvá po resetovaní mikroradiča 8051? Zadajte iba číselnú hodnotu.
  3. V nasledovných otázkach píšte odpovede veľkými písmenami. Prípadné operandy oddeľujte jednou medzerou.

  4. Aký symbolický zápis má inštrukcia s operačným kódom 00H?
  5. Aký symbolický zápis má inštrukcia s operačným kódom 32H?
  6. Aký symbolický zápis má inštrukcia s operačným kódom 1FH?
  7. Aký symbolický zápis má inštrukcia s operačným kódom D3H?
  8. Koľko byte zaberá inštrukcia s operačným kódom DDH?
  9. Koľko byte zaberá inštrukcia s operačným kódom 02H?
Hlavná stránka
© Peter Plesník 02.01.2007 23:48:41 All rights reserved