Professional Documents
Culture Documents
FAKULTET ZA INFORMATIKU
PROFESOR INFORMATIKE I MATEMATIKE
ZAVRNI SEMINARSKI RAD
PREDMET: HARDVER RAUNARA
TEMA:Asemblerski programi
SADRAJ
1. UVOD ............................................................................................................3
2. ASEMBLERSKI JEZIK ................................................................................4
2.1.Programski model procesora Intel 80386 ................................................5
2.2.AT&T sintaksa .........................................................................................6
2.3.Neposredno i registarsko adresiranje .......................................................7
3. ALATI:PRETPROCESOR,ASEMBLER,LINKER,DIBAGER ...................8
4. ZAKLJUAK ..............................................................................................14
LITERATURA
1. UVOD
2. ASEMBLERSKI JEZIK
Asemblerski jezik ili jednostavno asembler je nii simboliki jezik orijentisan raunaru (tj.
prilagoen radu raunara). Svaka instrukcija u asembleru predstavlja jednu instrukciju
mainskog jezika.
Svaki procesor poseduje instukcije za sledee osnovne operacije:
uitavanje (loading, moving) tako da se odgovarajue instrukcije zovu LD ili MOV
raunanje primeri su AND, OR, XOR, NOT
grananja, odnosno programski skokovi JMP, JNE, JE
Druga vana razlika izmeu asemblera i viih programskih jezika je u tome to asemblerski
programi zavise od arhitekture CPU-a i nisu portabilni.
2.1.
Registri opte namjene (eax, ebx, ...) su specifini po tome to se kod njih moe pristupiti
njihovom manje znaajnom dijelu kao posebnom 16-bitnom registru. Tako, na primer, manje
znaajnih 16 bita registra eax predstavlja 16-bitni registar ax.Dalje, kod registara ax, bx, cxi
dx se moe posebno posmatrati njihov manje i vie znaajan bajt. Za registar ax, vie
znaajan bajt predstavlja registar ah, a manje znaajan bajt predstavlja registar al(analogno
za ostale registre).
Registri opte namjene esi(source index) i edi(destination index) imaju specijalnu namjenu
kod naredbi za rad sa nizovima, kao i za neka adresiranja.Registri opte namjene esp(stack
pointer) i ebp(base pointer) imaju specijalnu namenu kod naredbi koje koriste stek.
Segmentni registri u sebi sadre bazne adrese segmenata memorije: cs (code segment) sadri
adresu poetka segmenta naredbi, ds (data segment) sadri adresu poetka osnovnog
segmenta podataka, ss(stack segment) sadri adresu poetka segmenta steka, dok su es, fsi gs
dodatni segmentni registri koji se koriste za rukovanje podacima.
Statusni registri su dostupni samo pomou specijalnih naredbi. Registar eflags u sebi sadri
indikatore (logike promenljive, flegove) ije vrednosti zavise od rezultata izvravanja
naredbi. Od znaaja e biti sledei indikatori: c(carry), z(zero), s(sign), d(direction), i
o(overflow). Registar eip(instruction pointer) u sebi sadri adresu naredbe (u okviru
segmenta naredbi) koja e se sledea izvriti.
Skup naredbi 80386 je neortogonalan: ne prihvataju sve naredbe sve vrste operanada. Ovo je
velikim dijelom posljedica injenice da je 80386 projektovan s ciljem da bude
kompatibilan sa ranijim Intel-ovim mikroprocesorima iz x86 familije.
2.2.
AT&T SINTAKSA
Za familiju procesora x86 postoje dvije sintakse pisanja naredbi. Jedna je Intel- ova, a druga
je AT&T. Osnovne karakteristike AT&T sintakse su sledee:
Neposredni operandi imaju prefiks $, nakon ega slijedi broj ili naziv labele.
Ukoliko se ispred konstante ili labele ne navede $, tada se koristi direktno
adresiranje.
Ukoliko naredba ima dva operanda, prvo ide izvorni operand, a zatim i odredini.
Sve naredbe koje barataju podacima imaju sufiks b, wili l(malo L), ime se
definie da li se naredba odnosi na bajt (byte, 8 bita), re (word, 16 bita) ili dvostruku
rije (long, 32 bita). Ukoliko se sufiks ne navede,bie odreen na osnovu odredinog
operanda (ovo nije problem kod registarskog adresiranja, ali jeste kod memorijskog).
2.3.
Procesor 80386 podrava vie adresiranja. Na primjer, kod naredbe koja vri postavljanje
registra ax na vrijednost 10:
movw $10, %ax
prvi operand ($10) je naveden korienjem neposrednog adresiranja, to znai da on upravo
predstavlja vrijednost sa kojom se obavlja operacija. Drugi operand (%ax) je primjer
registarskog adresiranja, to znai da ovaj operand predstavlja registar nad kojim se obavlja
operacija.
3. ALATI: PRETPROCESOR,ASEMBLER,LINKER,DIBAGER
Asemblerski program se prvo pie editorom i snima u fajl sa ekstenzijom S (veliko S). Za
makro pretprocesiranje asemblerskog koda se koristi C pretprocesor gcc-a (GNU Compiler
Collection):
gcc -E primer.S -o primer.s
Opcija E omoguava da se dobije izlaz pretprocesora, dok opcija o slui za zadavanje
naziva izlaznog fajla. Ukoliko usluge pretprocesora nisu potrebne, ovaj korak se moe
preskoiti. Za asembliranje se koristi komanda as(GNU assembler):
as --gdwarf2 primer.s -o primer.o
Opcija --gdwarf2 omoguava dibagiranje programa. Ako je prevoenje prolo bez greaka,
sistem e vratiti komandni prompt ne ispisujui nikakve dodatne poruke. Linkovanje obavlja
program ld(GNU linker):
ld primer.o -o primer
Linker e povezati fajl primer.o, nastao kao rezultat asembliranja, i kreirati izvrni fajl
primer.Program gcc omoguava da se automatski izvre svi programi neophodni za
dobijanje izvrnog fajla. U tom sluaju, ukoliko se gcc pozove na sledei nain:
gcc-g -o primer primer.S
tada e automatski biti pozvani pretprocesor, asembler i linker. Opcija g omoguava
dibagiranje programa.
Na poetku asemblerskih programa, sa kakvima e se raditi u toku ovog kursa (i koji e biti
asemblirani korienjem automatskog pozivanja svih alata), treba da stoji sledee:
#program radi to i to ...
#autor: Pera Peric, E1234
.section .data
.section .text
.globl main
main:
U prvih par linija u okviru komentara se nalazi kratak opis programa i par osnovnih podataka
o fajlu (autor, datum i slino). Treba obratiti panju na to da se ne prave komentari u stilu
#1234(broj koji se nalazi odmah nakon oznake #), poto takve oznake asembler
koristi interno prilikom asembliranja programa.
Sledea linija (.section .data) predstavlja direktivu(ili pseudonaredbu) asembleru i oznaava
poetak segmenta podataka. Nakon nje slijedi direktiva koja oznaava poetak segmenta
naredbi (.section .text). U okviru segmenta naredbi se definie ulazna naredba programa kao
spoljanja referenca (.globl) koja mora biti obiljeena labelom main. Na kraju programa
treba da se nalazi:
kraj: nop
Jedina uloga ove linije je da se na nju postavi taka prekida, kako se izvravanje programa ne
bi nastavilo dalje od njegovog kraja (ukoliko mu se ne kae da stane, procesor e izvravati
naredbe koje postoje u memoriji iza poslednje naredbe programa).
Dibager slui za kontrolisano izvravanje programa, i unutar njega se mogu stalno pratiti i
mijenjati sadraji registara i indikatora i postavljati prekidne take. Dibager se zove
DDD(Data Display Debugger) i predstavlja grafiko okruenje za gdb(GNU Debugger),
osnovni dibager koji radi iz komandne linije. DDD se poziva komandom:
ddd primer
Na slici 02 je prikazan izgled glavnog prozora dibagera. Na ovoj slici se koristi izmijenjena
verzija DDD dibagera 3.3.11. Izmjene su nainjene radi lakeg rada sa asemblerskim
programima. Glavni prozor je podijeljen na nekoliko panela i prozora (koji se mogu prikazati,
odnosno sakriti iz Viewmenija). Panel (1) sadri izvorni kod programa. Prozor (2) sadri
komande vezane za izvravanje programa. Prozor (3) sadri trenutne vrijednosti registara.
Panel (4) sadri vrijednosti koje je korisnik odabrao da prikazuje (kada takvih vrednosti
nema, panel se ne prikazuje). Panel (5) sadri komandnu liniju gdb-a (tu se moe vidjeti
tekstualni oblik svih komandi zadatih u DDD-u), dok panel (6) sadri izgled programskog
koda u memoriji. Ukoliko nakon pokretanja dibagera prozor sa registrima nije ukljuen, treba
ga ukljuiti odabirom opcije Registers menija Status.
Prozor (2) sadri vie komandi koje se koriste prilikom izvravanja programa, a od koristi e
biti sledee:
Run pokree program od poetka. Izvravanje se zaustavlja kad se naie na taku prekida.
Stepi i Nexti izvravaju tekuu naredbu i nakon toga ponovo zaustavljaju izvravanje
programa. Koriste se za izvravanje programa korak po korak. Razlika izmeu ove dve
komande se ogleda kod poziva potprograma: Stepi izvrava potprogram korak po korak, dok
Nexti izvri ceo potprogram i zaustavlja se na naredbi koja sledi naredbu poziva
potprograma.
Cont nastavlja izvravanje programa do sledee take prekida.
Interrupt prekida izvravanje pokrenutog programa (sa mogunou nastavka izvravanja).
Kill prekida izvravanje pokrenutog programa (bez mogunosti nastavka izvravanja).
Ukoliko se klikne na neki od registara u Registers prozoru, njegovo ime se pojavljuje u liniji
(7) koja se nalazi ispod menija. Na primer, ako se klikne na registar eax, u liniji (7) se
pojavljuje tekst $eax. Ako se sada klikne na dugme Display, u panelu (4) e se prikazati
polje sa sadrajem registra eaxu oznaenom dekadnom obliku. Ukoliko treba prikazati
heksadecimalnu vrijednost, pre klika na dugme Display treba dodati prefiks /x,za prikaz
binarnih vrednosti treba staviti /t, dok za prikaz neoznaenih dekadnih vrednosti treba
staviti /u.Nazivi registara se u liniju (7) mogu unositi i runo, samo ispred naziva registra
treba staviti prefiks $.
Prikazane vrijednosti na panelu (4) se mogu obrisati klikom na vrijednost, a zatim klikom na
dugme Undisp.Da bi se promijenila vrijednost u registru, u liniju (7) treba postaviti njegovo
ime (zajedno sa prefiksom $) i kliknuti na dugme Set. Nakon toga, u prozoru koji se
otvori se moe upisati vrijednost koja e se upisati u registar. Ukoliko se vrijednost navede
bez prefiksa, smatrae se da je u dekadnom obliku, dok se prefiks 0xkoristi za
heksadecimalne vrednosti.
Prikaz pojedinih indikatora iz eflags registra, kao i vrednosti 8-bitnih i 16-bitnih registara se
moe postii klikom na odgovarajue dugme na panelu (8).
Napomena: vrijednosti indikatora i registara prikazanih preko ovog panela se ne mogu
mijenjati.
32-bitne promjenljive se mogu prikazati tako to se u liniju (7) postavi njihovo ime, a zatim
se klikne na dugme Display.
8-bitne i 16-bitne promjenljive se mogu prikazati postavljanjem njihovog imena u liniju (7) i
klikom na odgovarajue dugme na panelu (9): ByteHex e vrijednost prikazati kao
heksadecimalnu, ByteDec kao oznaenu dekadnu, a ByteUns kao neoznaenu dekadnu.
Analogno, za 16-bitne promjenljive se koriste WordHex,WordDeci WordUns.
Napomena: ovako prikazane 8-bitne i 16-bitne vrednosti se ne mogu mijenjati.
Stringovi se prikazuju postavljanjem njihovog imena u liniju (7) i klikom na dugme String na
panelu (9).
Panel (9) sadri i najee koriene opcije prozora (2).
Promjena 32-bitnih promenljivih se ostvaruje postavljanjem njihovog imena u liniju (7) i
klikom na dugme Set. 8-bitne i 16-bitne promjenljive se ne mogu mijenjati na ovaj nain.
DDD omoguava i prikaz sadraja nizova. Za 32-bitne nizove je dovoljno iza naziva niza
staviti sufiks@n, gde je n broj lanova niza koje treba prikazati. Na primer, ako se niz zove
nizrec i ima 5 lanova, u liniju (7) treba upisati nizrec@5i kliknuti na dugme Display.
Ukoliko je potrebno prikazati sadraj memorije koji je odreen nekim tipom adresiranja, kao
na primjer:
movw nizrec(,%ecx,2), %ax
tada treba izraz nizrec(,%ecx,2) postaviti u liniju (7) (na primer, obiljeiti ga miem),
a zatim odabrati opciju Memory iz menija Data. U dijalogu koji e se otvoriti treba odabrati
broj elemenata koji se eli prikazati, brojni sistem u kome se ele prikazati vrednosti i
veliinu jednog elementa (u poslednjem polju e se nai izraz koji odreuje memorijsku
lokaciju). Na primer, ukoliko treba prikazati jedan podatak na koga ukazuje gornji izraz, u
prvo polje bi se upisalo 1, u drugom bi se odabrao brojni sistem, na primer hex, a
utreem bi se odabrala opcija halfwords (2) koja oznaava podatke veliine 2 bajta, poto
instrukcija movw radi sa 2-bajtnim vrijednostima. Nakon klika na dugme Display, traeni
podatak bi se prikazao u panelu (4).
Sva podeavanja DDD-a se uvaju u skrivenom direktorijumu .ddd koji se nalazi u home
direktorijumu korisnika, ako se drugaije ne naglasi. Ukoliko su podeavanja promijenjena na
takav nain da se DDD ne ponaa kako se oekuje, potrebno je obrisati trenutna
podeavanja, nakon ega e se automatski izgenerisati podrazumijevana podeavanja (pri
tome, DDD ne smije biti startovan). Podeavanja se mogu obrisati komandom:
rm -rf ~/.ddd
4. ZAKLJUAK
LITERATURA
1. www.bs.wikipedia.com Asemblerski jezik
2. http://www.singipedia.singidunum.ac.rs/content/3763-Informatika -Sinergija
3. Www.google.com