You are on page 1of 15

INTERNACIONALNI UNIVERZITET BRKO

FAKULTET ZA INFORMATIKU
PROFESOR INFORMATIKE I MATEMATIKE
ZAVRNI SEMINARSKI RAD
PREDMET: HARDVER RAUNARA

TEMA:Asemblerski programi

Mentor: Prof.dr Zoran Lovrekovi


Student: Sinia Davidovi

Broj Indeksa: OI 321/13


Brko,2014.godine.

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

Za razumijevanje rada raunara,obian korisnik ne mora znati sve tehnike detalje.Dovoljno


je znati odgovore na pitanja:kako raunar radi ono to radi i to objasniti sa osnovnim,netehnikim rijenikom.
Hardver raunarskog sistema obuhvata dvije glavne grupe fizikih komponenti:samog
raunara CPU (centralne procesorske jedinice) i periferijskog ureaja.
Da bi korisnik razumio osnovne funkcije hardvera raunara,potrebno je znati ta raunar
stvarno radi i kako upisuje i uitava podatke sa vrstog diska.
CPU je komponenta raunara koja izvrava jednostavne programske zadatke koji se nazivaju
instrukcije i transformaciju ulaznih podataka u izlazne informacije.IBM kompatibilni PC
raunari koriste x86 kompatibilne procesore,koje proizvode Intel,AMD,Via Technologies ili
Transmeta.Apple Macintosh raunari inicijalno su pravljeni sa Motorola 680x0 familijom
procesora,zatim su preli na PowerPC seriju sa RISC arhitekturom koju su zajedno razvili
Apple Computer,IBM i Motorola.Od 2006,Apple je ponovo preao na x86 kompatibilne
procesore.Moderni CPU su opremljeni sa ventilatorom za hlaenje spojenog preko
hladnjaka.Tipian CPU sadri nekoliko funkcionalnih jedinica:kontrolnu ,aritmetiko logiku
(ALU),decoder,magistralu ili BIU (Bus Interface Unit) koja komunicira podatke,adrese i
kontrolne informacije i prefetch jedinicu.

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

Zavisno o broju instrukcija mainskog jezika razlikujemo CISC i RISC procesore:


CISC procesori imaju velik broj instrukcija, od kojih su mnoge sloene pa se relativno sporo
izvode, dok RISC procesori imaju implementiran malen broj osnovnih operacija, koje se
izvode relativno brzo.
Program u assembler-u se esto oznaava i kao assembler kod. Taj kod se putem specijalnog
kompajlera pretvara u mainski kod koji je direktno izvriv od strane procesora. Obrnuti
proces pretvaranja mainskog u assembler kod se naziva disasembliranje.
Asemblerski program se pohranjuje kao tekst, tj. kao bilo kakav program napisan u
viemprogramskom jeziku kao to je C++. Svaka asemblerska instrukcija predstavlja po
jednu mainsku instrukciju, dakle postoji 1-1 preslikavanje. Na primer, gornja instrukcija
se u asembleru reprezentuje kao:
add eax, ebx
Dakle, ovde je znaenje instrukcije daleko jasnije nego u mainskom kodu. Opti
oblikinstrukcije u asembleru je:
mnemonic operand(s)
Zadatak asemblera je da tekstualni kod prevede u mainski, slino kao to to ine kompajleri
viih programskih jezika. Shodno bliskosti asemblera i mainskog jezika, asembler je dosta
jednostavniji od bilo kog kompajlera.

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.

Programski model procesora Intel 80386

Intel 80386 (u daljem tekstu 80386) je 32-bitni mikroprocesor CISC arhitekture i


pripada familiji procesora x86. Ovaj procesor spada u little endian procesore. Unazad je
kompatibilan sa procesorima iz familije x86, pa u sebi sadri 8-bitne, 16-bitne i 32-bitne
registre (slika 1).

Slika 01:Osnovni registri procesora Intel 80386

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:

Labela se definie navoenjem imena labele iza koga slijedi dvotaka.

Neposredni operandi imaju prefiks $, nakon ega slijedi broj ili naziv labele.
Ukoliko se ispred konstante ili labele ne navede $, tada se koristi direktno
adresiranje.

Podrazumijevani format brojeva je dekadni. Ako treba unijeti broj u


heksadecimalnom obliku, prefiks je 0x,za oktalne brojeve prefiks je 0, dok je za
brojeve u binarnom obliku prefiks 0b.

Registarski operandi imaju prefiks %.

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).

Na primer, kod naredbe:


movw $10, %ax
slovo w u nazivu oznaava da je u pitanju naredba koja se odnosi na rije. Izvorni
operand je neposredni (vrijednost 10 dekadno), a odredini je registarski (registar ax).
Slino, u primjeru:
movb %ch, %al
slovo b u nazivu oznaava da je u pitanju naredba koja se odnosi na bajt. Izvorni
operand je registarski (registar ch), a odredini operand je takoe registarski.

2.3.

Neposredno i registarsko adresiranje

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.

Slika 02: DDD Dibager


Pre pokretanja programa, prvo to treba uraditi je da se postavi taka prekida (breakpoint) na
poslednju liniju u programu (trebalo bi da je kraj: nop). Taka prekida predstavlja mjesto na
kome e se zaustaviti izvravanje programa kad se on pokrene. Mjesto do kog se stiglo u
izvravanju programa je obiljeeno zelenom strelicom i predstavlja naredbu koja e se
sledea izvriti. Taka prekida se moe postaviti na vie naina:
kursor se postavi na poetak linije, pa se miem klikne na dugme Break(ukoliko u toj liniji
ve postoji taka prekida, dugme menja naziv u Clear, to znai uklanjanje take prekida)
klikne se desnim dugmetom mia na poetak linije, pa se iz menija odabere Set Breakpoint
dvoklik miem na poetak linije
Taka prekida se moe iskljuiti ili preko dugmeta Clear, ili izborom opcije Delete
Breakpoint iz menija koji se dobija desnim klikom mia na taku prekida.

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

Programi napisani u assembler-u se odlikuju mogunou slanja direktnih komandi procesoru


kao i iskoritavanju cijelog dijapazona raunarske arhitekture. Poto ti programi rade
praktino na nivou mainskog koda, i sa sobom nemaju pomone konstrukcije, generalizacije
koda i za mainu sline nebitne stvari, su mnogo manji i bri od programa napisanih u
nekom konvencionalnom programskom jeziku.

LITERATURA
1. www.bs.wikipedia.com Asemblerski jezik
2. http://www.singipedia.singidunum.ac.rs/content/3763-Informatika -Sinergija
3. Www.google.com

You might also like