[ peca89bg @ 27.11.2010. 19:01 ] @
imam pitanje koje glasi: da li od masinskog koda moze da se dobije asemblerski kod? |
[ peca89bg @ 27.11.2010. 19:01 ] @
[ Stojan Trifunovic @ 28.11.2010. 11:33 ] @
Može. Tome služe programi za PC nazvani disasembleri.
Nažalost, oni služe samo da dobijete kakav takav kod. Komentara nema, labela nema, čak se ponekad desi da registrima i flegovima daju pogresan naziv. Da je moguće tako doći do izvornog koda, (tačnije shvatiti šta je pisac hteo da kaže) moguće je. Da je teško, jeste. Itekako. Često je lakše iznova napisati kompletan program. [ peca89bg @ 29.11.2010. 02:35 ] @
mov 001
add 010 mul 011 cmp 100 jle 101 pa recimo ovo je asemblerski kod na masinskom izgleda ovako: 001 01 10 00 00010000 001 01 10 01 00010001 011 00 01 001 01 00 01 00000001 010 00 01 001 10 01 00010000 00 100 01 00 00 01111111 101 11110000 jel moze ovo pesaka da se uradi ili mi je potreban disasembler? Hvala puno na odgovoru... Dobio sam ovo pitanje na kolokvijumu i odgovorio sa ne :( U skripti pise ovako: "Primetimo da je izmedu prikazanog asemblerskog i masinskog programa po- stoji veoma direktna i jednoznacna korespondencija (u oba smera) tj. na osnovu datog masinskog koda moguce je jednoznacno rekonstruisati asemblerski k^od. " ja sam ovo shvatio kao da moze ali da se ne dobija isto :S jer sta mi znaci da ne dobijem isti kod :) [ Stojan Trifunovic @ 30.11.2010. 21:21 ] @
Za takav kod, odgovor je trebao biti da.
U skripti je to ispravno napisano. Problem je sto je u praksi gotovo nemoguce napisati ikakav kod bez imenovanja registara, komentara i slicno. Pa dobro, nije baš nemoguće, ali je veoma teško. Bar za duže programe. Na primer, ukoliko je na početku napisano: Code: BROJAC equ 100 (ili nešto slično, zavisi od asemblera i procesora koji koristite) moguce je kasnije napisati Code: cmp BROJAC To će asembler potpuno isto prevesti u mašinski kod kao da je pisano cmp 100. Naravno, ovakav način prikazivanja koda u asembleru je mnogo lakši i razumljiviji, pa stoga niko (otkad su se pojavili asembleri) više ne piše programe "ubadajuči" nule i jedinice. Isto tako, i adresu skoka (101) u jle 101 instrukciji SVAKI asembler će sam izračunati. ukoliko se umesto nje postavi (tekstualna) labela. Međutim, ukoliko se "go" mašinski kod propusti kroz disasembler, dobiće se samo cmp 100. Sva izvorna formatiranja, sve labele, svi komentari će nestati. Procesoru naravno komentari nisu potrebni, ali programeru itekako jesu. Analizirati takav kod? Hm! Opekao sam se jednom! Pretpostavljao sam da Vam je odgovor potreban za neki konkretan projekat, pa sam Vam stoga onako odgovorio ranije. "Peške" se mašinski kod koji ste postavili može prevesti u asemblerski. Za tih 5 instrukcija verovatno će Vam trebati oko 30 minuta. Trebate tražiti kod svake instrukcije u tehničkom uputstvima, načine kodovanja svakog operanda, ručno brojati adrese skokova itd. Disasembler bi to odradio za pola sekunde na 286-tici. Ukoliko baš želim biti precizan, mogao bih reći da se bukvalno svaki mašinski kod može disasemblerom prebaciti u asemblerski format. Isto tako, svaki asemblerski kod moguće je asemblerom prebaciti u mašinski format. To je i napisano u skripti. Međutim, koliko je u praksi upotrebljiv mašinski kod koji je disasemblerom (ili ručno - ukoliko ste baš mazohista) prebačen u asembler, druga je priča. [ peca89bg @ 01.12.2010. 12:14 ] @
Hvala puno na odgvoru..
Konkretno mi smo za potrebe na faxu koristili ovo: http://www.nasm.us/ . Iskreno ne razumem konkretno sta je i za sta sluzi :) Da li se koristi za neko vezbanje ili je ovo neki univerzalni pa se na osnovu njega pisu drugi asembleri? :) Iskreno ovo nije oblast u kojoj vidim sebe ali u skoli nikad nema sve sto nam lezi :) Secam se da je profesor na jednom od predavanja iz c-a rekao da "ukoliko zelimo da se neki fragment koda brze izvrsava mozemo ga napisati na asembleru". Konkretno na sta je mislio i kako bi se to odradilo na nekom primeru iz C-a ili nekom drugom programskom jeziku? Koliko se koristi assembler u praksi i u kojim oblastima sem sto ga koriste proizvodjaci procesora i ostalih uredjaja za koje je potrebno koristiti asemble? Hvala jos jednom.. [ Stojan Trifunovic @ 01.12.2010. 16:43 ] @
To što ste koristili na faksu je asembler. Tacnije, prevodilac koji
asemblerski kod (poput mov, add, mul, cmp, jle i mnogih drugih instrukcija) prevodi u niz nula i jedinica koji određeni procesor bez problema izvršava, a za tačno određeni procesor. Postoji više generacija procesora. 80806, 286, 386, 486, 486SX, 486DX, 586, P2, P3, P4 i ko zna koji će se još pojaviti. Svaki od njih donosio je određena poboljšanja u smislu povećanja radnog takta (od 33MHz pa do današnjih 3GHz), maksimalne memorije koju može podržati, magistrale podataka preko koje komunicira sa ostalim hardverom, ali najznačajnija promena je u broju instrukcija. Prvobitni "kompjuteri" imali su svega stotinak instrukcija sa relativno ograničenim modovima adresiranja. Svaka nova generacija donosila je sve veći i veći broj instrukcija koje određeni procesor podržava. To znači da asemblerski programi za P3 neće raditi na 386 procesoru, ukoliko je korišćena neka od instrukcija koju 386 ne podržava (što je verovatno). Bilo koji procesor izvršava samo asemblerske instrukcije. Jedino njih "razume". Ništa drugo. Ukoliko se napravi program u asembleru baš za taj procesor, logično je da će biti veoma kratak i veoma brz. Postoji čak i čitav operativni sistem (Menuet) pisan u čistom asembleru. Staje na jednu 1,44Mb disketu! Ostali programski jezici (C++, Java, Python, Basic, Pascal, Ada, Delphi...) primenjuju u osnovi dva principa: 1. Kompajliraju se (C, C#, C++, Ada) - odnosno svaka njihova komanda se prilikom kompajliranja (i linkovanja ukoliko ima više delova programa ili biblioteka) prevodi u niz asemblerskih instrukcija za određeni procesor. 2. Interpretiraju se (Python, Java) - odnosno svaka njihova komanda se preko posebnog programa (nazvanog interpreter - u slučaju Jave on se naziva Java Virtual Machine) prevodi za vreme izvršavanja. Zbog toga se komande ovakvih programskih jezika mnogo sporije izvršavaju. Za neke programske jezike (Basic, a mislim da je tu i Pascal) koji su zamišljeni da se izvršavaju interpreterski, vremenom su razvijeni kompajleri, pa se stoga i oni mogu mnogo brže izvršavati. U principu, svaki od viših programskih jezika vrši prevođenje svojih komandi u asemblerske instrukcije. Ukoliko se kompajliraju, izvršavaće se brže jer su već unapred prevedene u oblik koji procesor razume, a ukoliko se interpretiraju izvršavaće se sporije jer se prevode za vreme izvršavanja programa. Razliku između kompajliranja i interpretiranja možete najlakše shvatiti ukoliko trebate razgovarati sa japancem (P4 procesorom, naravno, ne znate japanski). On može: 1. unapred unajmiti prevodioca (kompajler) i odštampati Vam ono što bi Vam trebao preneti na srpskom. 2. unajmiti prevodioca (interpreter) koji bi Vam, dok on priča, prevodio rečenicu po rečenicu. E, onda tek vidite da nije baš sve u redu. Prevodioc je možda dobar, a možda i nije. Možda ima naglasak koji Vi ne razumete najbolje, možda japanac takođe priča svojim dijalektom, možda koristi termine koje ni Vi ni prevodioc ne razumete najbolje. Zbog toga je prevod (program) duži nego što bi trebao biti, pa Vam je potrebno više vremena za njegovo čitanje (izvršavanje). Preostaje Vam treće rešenje: 3. naučite japanski (asembler). Sporazumevaćete se idealno, bez ikakve mogućnosti za dvosmislice ili nejasnoće, prevodioc Vam neće biti potreban, sam razgovor (program) će biti kratak, a razumećete se (brzina izvršavanja programa) ekstremno brzo. Možda mislite da je u ovom slučaju asembler idealan! Pa i bio bi, da se stalno ne pojavljuju novi procesori! Zamislite samo šta bi se dogodilo da sada trebate pričati sa francuzom (AMD 64bit dual core)! > Secam se da je profesor na jednom od predavanja iz c-a rekao da "ukoliko > zelimo da se neki fragment koda brze izvrsava mozemo ga napisati na > asembleru". > Konkretno na sta je mislio i kako bi se to odradilo na nekom primeru iz C-a > ili nekom drugom programskom jeziku? U pojedinim C kompajlerima postoji mogućnost "umetanja" asemblerskog koda. Znači, možete pisati: Code: I++ <asm> mov 001 add 010 mul 011 cmp 100 jle 101 </asm> J++ Većina ostalih programskih jezika (u koje spadaju svi interpreterski) ne podržava ovakvo umetanje koda. > Koliko se koristi assembler u praksi i u kojim oblastima sem sto ga koriste > proizvodjaci procesora i ostalih uredjaja za koje je potrebno koristiti > asemble? Nažalost, sve slabije i slabije. Najviše prilikom programiranja mikrokontrolera, mada i tu gubi vođstvo zbog velike kompatibilnosti programa pisanih u C programskom jeziku sa novijim generacijama mikrokontrolera, i sve veće i veće procesorske snage i memorije novijih mikrokontrolera koje anuliraju najveće prednosti asemblera - veličinu i brzinu programa. Za PC kompjutere se skoro i ne koristi, osim za drajvere, upravo zbog svoje velike brzine. Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|