Professional Documents
Culture Documents
za predmet
Arhitektura raunara
Autori:
arko ivanov
Ivan Nejgebauer
Lazar Strievi
Miroslav Hajdukovi
Sadraj
1. Uvod u korienje Linux operativnog sistema...............................................................1
1.1. Izbor platforme za rad............................................................................................1
1.2. Prijavljivanje na sistem...........................................................................................1
1.3. Rukovanje shell-om.................................................................................................2
1.4. Organizacija direktorijuma.....................................................................................2
1.5. Osnovne komande bash-a.......................................................................................3
Kretanje po stablu direktorijuma i listanje fajlova.....................................................3
Rukovanje fajlovima i direktorijumima......................................................................4
Prikaz sadraja fajla i pretraivanje...........................................................................5
Alias-i..........................................................................................................................6
Preusmeravanje standardnog ulaza, standardnog izlaza i pajpovi............................6
Izvravanje programa u pozadini...............................................................................7
1.6. Programi za rukovanje fajlovima............................................................................7
1.7. Tekst editori............................................................................................................7
1.8. Grafiki programi....................................................................................................7
1.9. Korisni linkovi.........................................................................................................8
2. Asemblerski programi....................................................................................................9
2.1. Zato asemblersko programiranje..........................................................................9
2.2. Neophodno predznanje za praenje vebi..............................................................9
2.3. Programski model procesora Intel 80386...............................................................9
2.4. AT&T sintaksa.......................................................................................................11
2.5. Neposredno i registarsko adresiranje...................................................................12
2.6. Izgled asemblerskog programa.............................................................................12
2.7. Asembler (kompajler)............................................................................................13
2.8. Dibager..................................................................................................................13
2.9. Primer: izraunavanje NZD..................................................................................15
2.10. Domai zadaci.....................................................................................................17
3. Rukovanje celim brojevima..........................................................................................18
3.1. Neoznaeni i oznaeni brojevi..............................................................................18
3.2. Definisanje numerikih podataka.........................................................................18
3.3. Prikaz promenljivih u dibageru.............................................................................19
3.4. Mnoenje i deljenje pomou sabiranja i oduzimanja............................................20
3.5. Viestruka preciznost............................................................................................20
Sabiranje u dvostrukoj preciznosti...........................................................................20
3.6. Numeriki tipovi podataka na C-u i asembleru....................................................21
3.7. Domai zadatak.....................................................................................................22
4. Nizovi...........................................................................................................................23
4.1. Pristupanje elementima niza.................................................................................23
4.2. Nizovi brojeva.......................................................................................................23
Varijanta 1 indeksno adresiranje...........................................................................24
Varijanta 2 indirektno adresiranje.........................................................................24
Varijanta 3 indirektno + indeksno adresiranje + optimizacija..............................24
Varijanta 4 indirektno + indeksno adresiranje + loop naredba............................25
Drugi primer brojanje dana sa odreenom temperaturom...................................25
4.3. Stringovi................................................................................................................27
4.4. Naredbe za mnoenje i deljenje............................................................................28
4.5. Testiranje programa..............................................................................................29
4.6. Domai zadaci.......................................................................................................29
5. Sistemski pozivi...........................................................................................................30
5.1. Sistemski pozivi....................................................................................................30
5.2. Ulaz, izlaz i zavretak programa...........................................................................30
6. Potprogrami.................................................................................................................33
6.1. Konvencija poziva potprograma............................................................................33
6.2. Stek frejm..............................................................................................................34
Strana 1
dajekorienjeslobodnounastaviivannje,
dajeizvornikdsvimadostupanidasemoeslobodnokoristiti,
dasekopijemoguslobodnodistribuirati,i
dasekdmoemenjatipopotrebiitakoizmenjendaljedistribuirati.
Strana 2
Strana 3
Za korisnike je ipak najbitniji direktorijum /home u kome se nalaze lini fajlovi za svakog od
korisnikakojiimajunalognasistemu.Svakikorisnikuovomdirektorijumuimasvojpoddirektorijumi
obino je to jedino mesto u kome korisnici imaju pravo upisa, pored direktorijuma /tmp. Svi ostali
direktorijumisemoguilisamoitati,iliimjepristuppotpunoonemoguen.
U svakom direktorijumu se nalaze i dva specijalna poddirektorijuma: . oznaava tekui
direktorijum,dok..oznaavanadreenidirektorijum(parent),kojisenalaziiznadtekueg.Obase
estokoristeuraduizkomandnelinije.Ikorisnikovhomedirektorijumimaposebnuoznaku~(tilda),
kojasemoekoristitizapristupizkomandnelinije.
Kadasenavodiputanjadonekogdirektorijuma,nazivipojedinihpoddirektorijumaserazdvajajusa
/.Ovajznaktakoemorastojatiiizmeuposlednjegnazivapoddirektorijumainazivafajla.
Kadaseod Linuxazatraidapokrenenekiizvrnifajl,ukolikosenenavedetanaputanjado
njega,pretraiesepodrazumevanidirektorijumizaizvrnefajlove.Spisakovihdirektorijumasenalazi
u promenljivoj okruenja (environment variable) PATH. Treba napomenuti da se tekui direktorijum
najee ne nalazi u ovom spisku, tako da, ako treba pokrenuti program koji se nalazi u tekuem
direktorijumu(akojisenenalaziuPATHu),potrebnojekucati
./naziv_programa
Strana 4
Znaenje
Zamenjujebilokojibrojbilokojihznakova
Zamenjujetanojedanbilokojiznak
[]
Slinodokeru?,samotosezamnjujetanoodreeniskupznakova.Naprimer,[adps]
bibilazamenazajedanodsledeihznakova:a,b,c,d,p,s
Tabela 1: Doker znaci
Tako, na primer, ako treba izlistati sve fajlove u tekuem direktorijumu koji poinju sa pr,
komandabibila:
ls pr*
Akotrebaizlistatisvefajloveutekuemdirektorijumukojipoinjusaa,bilic,komandabi
bila:
ls [a-c]*
Upotrebadokerznakovanijeogranienasamonalskomandu.Onisemogukoristitisabilokojom
komandomkojakaoparametarprihvatanazivfajlailidirektorijuma.
Za veinu komandi se moe dobiti spisak svih njenih opcija kucanjem komande i argumenta
--help. Drugi nain dobijanja (detaljnije) pomoi za neku komandu je komanda man (manual). Na
primer, za komandu ls uputstvo se moe dobiti kucanjem man ls. Pregledanje uputstva se vri
kursorskimtasterima,dokseizlazakpostiepritiskomnataster q.Ukolikoseuuputstvutraineka
posebnare,trebaotkucati /,zapretraguunapred,odnosno ? zapretraguunazad,panakontogare
kojasetrai.Ponovnapretragazaistomrejuseostvarujepritiskomnan,odnosnoShift+nzapretragu
unazad,ilikucanjem/,odnosno?,nakonegatrebapritisnutiEnter.
Strana 5
Neretkosekomandarmkoristisaopcijom-i,ijijeefekatdasekorisnikpitazabrisanjesvakog
fajlaponaosob,kakobiseizbeglosluajnobrisanjefajlova.Akotakvihfajlovaimavie,korisnikebiti
pitanzasvaki.Akosvifajlovisigurnotrebadabuduobrisani,moesedodatiopcija -f.Meutim,sa
ovomopcijomtrebabitiobazrivjerselakomoedesitidaseobrienetotonijetrebaloobrisati.Na
primer, akosegrekomumesto rm -f aaa* otkuca rm -f aaa * (razmakizmeuaaai*),bie
pobrisanisvifajloviudirektorijumu.
Nekadjepotrebnopremestitifajlsajednogmestanadrugo(tj.iskopiratiganadrugomesto,a
zatim obrisati original). Ovo se postie komandom mv (move), ije korienje je slino komandi cp.
Komandamvsemoekoristitiizapreimenovanjefajlova.
Ukoliko je potrebno, novi prazan fajl se moekreirati komandom touch. Osnovna namena ove
komandejeda,akofajlpostoji,postavinjegovovremeposlednjeizmenenatekuevreme,aukolikofajl
nepostoji,tadasekreiranoviprazanfajl.
Novi direktorijum se moe kreirati komandom mkdir (make directory), dok se postojei
direktorijum moe obrisati komandom rmdir (remove directory). Obe komande kao parametar
prihvataju naziv direktorijuma. Treba obratiti panju na to da rmdir moe obrisati samo prazan
direktorijum.
Svakifajlpod Linuxomimapridruenskupatributa.Atributipredstavljajupravakojakorisnik
moeimatinadfajlom.Korisnikmoeimatipravaitanja(r, read),pisanja(w, write)iizvravanja(x,
execute).Atributifajlanpr.fajl.txtmogudasevideuzpomokomandels -l fajl.txt
-rw-r--r-- 1 e12345 stud
Komanda chmod slui za menjanje atributa fajla. Na primer, ako korisniku treba dati pravo
izvravanjanekogfajla,tosemoepostiisa:
chmod u+x naziv_fajla
Strana 6
Alias-i
Jo jedna korisna mogunost basha je definisanje alias a, odnosno drugih imena za postojee
komande. Na primer, ako se komanda ls -l *.xyz esto koristi, moe joj se dodeliti drugo ime,
odnosnoskraenicakojomesetakomandapozivati:
alias xyz='ls -l *.xyz'
Sada,kadakorisnikotkuca xyz,izvrieseupravo ls -l *.xyz.Akosezadasamo alias bez
parametara,naekranueseispisatispisaksvihtrenutnopostojeihzamena.Akonekuodzamenatreba
obrisati,tosemoeuraditipomoukomandeunalias.
Strana 7
Slika 1: Nautilus
Drugavrstaprogramajebazirananapostojanjudvazasebnadelaprozorapri emusvakiodnjih
nezavisnoprikazujesadrajnekogoddirektorijuma.Fajlovisemogukopirati,pomeratiisl.izmeuova
dvadelaprozoraodnosnodirektorijuma.Uovugrupuspada MidnightCommander kojisestandardno
isporuujeuskorosvimdistribucijamaikojiseizvravautekstualnomreimu.Postojivieprograma
tipaMidnightCommanderakojiseizvravajuugrafikomreimu,anekiodnjihsuKrusader,Worker,
DoubleCommander,itd.
Strana 8
Asemblerski programi
Strana 9
2. Asemblerski programi
2.1. Zato asemblersko programiranje
Poslednjihnekolikogodinasepraktinodolodogornjegraniceradneuestanostinakojimarade
savremeni mikroprocesori zasnovani na silicijumu (34GHz; vee brzine se mogu ostvariti samo
korienjemekstremnoniskihtemperatura,kaotojehlaenjetenimazotom,naprimer).Topraktino
znaidasevienemoereiakohoedatiprogrambreradi,kupibriprocesor.Deliminoreenje
problemaleiukorienjuvieprocesorskihjezgara,meutimtozahtevapisanjeprogramakojimoguda
iskoristetajpotencijal.Mnogialgoritmisemogusamodelimino(ilinikako)paralelizovati,todovodido
toga da se pisanju efikasnog kda mora posvetiti vea panja. Dananji kompajleri su prilino
napredovalipopitanjuoptimizacije,alisenjihovemogunostiuglavnomvezujuzarelativnouzakkrug
programskihablona.
Optimalnoiskoriavanjemogunostikompajlera(injegovihoptimizacija)praktinopodrazumeva
poznavanjeonogatosedeavaispodhaube,tj.kakoeizgledatiasemblerski,odnosnomainskikd
kogaeprocesorizvravati.Ovojejobitnijekodprogramskihjezikakojiseinterpretirajuuvirtuelnoj
maini(Javavirtuelnamaina,.NETvirtuelnamaina,itd.),potovirtuelnamainapraktinoizvrava
nekuvrstumainskogkdazavirtuelniprocesorrealizovanunjoj.
Onotobiovajkurstrebalodaobezbedijeoseajtasveprocesormoradaizvrikadaseizvrava
iskaz napisan u viem programskom jeziku i da prui osnovu za pisanje asemblerskih potprograma
kojimasemoguubrzatikritinidelovisporihprograma.
definisanjeideklarisanjefunkcija
definisanjeikorienjekonstanti
prenosparametarafunkcijipovrednostiipoadresi
osnovneoperacijeiradsanizovima(pristupelementimaniza,pretraivanjeniza,sortiranje,rad
sastringovima)
poznavanjeosnovnihCiskaza(if,for,do,while,return,break)
Asemblerski programi
Strana 10
posmatratinjihovmanjeznaajanivieznaajanbajt.Zaregistar ax,vieznaajanbajtpredstavlja
registarah,amanjeznaajanbajtpredstavljaregistaral(analognozaostaleregistre).
Registrioptenamene esi (sourceindex)i edi (destinationindex)imajuspecijalnunamenukod
naredbizaradsanizovima,kaoizanekaadresiranja.
Registri opte namene esp (stack pointer) i ebp (base pointer) imaju specijalnu namenu kod
naredbikojekoristestek.Potosuovadvaregistraneophodnazaradsapotprogramima,uovomekursu
seneekoristitinizakojudrugunamenu.
Segmentniregistri usebisadre bazneadrese segmenatamemorije: 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, fs i gs dodatni
segmentniregistrikojisekoristezarukovanjepodacima.
Statusniregistrisudostupnisamopomouspecijalnihnaredbi.Registareip(instructionpointer)
usebisadriadresunaredbe(uokvirusegmentanaredbi)kojaesesledeaizvriti.Registareflagsu
sebi sadri indikatore (logike promenljive, flegove) ije vrednosti zavise od rezultata izvravanja
naredbi.Odznaajaebitisledeiindikatori: c (carry), o (overflow), z (zero), s (sign),i d (direction;
koristisesamokodnekihspecijalnihnaredbi).
32-bit
al
ax
eax
bh
bl
bx
ebx
ch
cl
cx
ecx
dh
dl
dx
edx
bp
ebp
si
esi
di
edi
sp
esp
Status registri
31
fs
gs
sign
es
31 .. 12
zero
ds
trap
eflags
direction
ss
interrupt
eip
overflow
cs
11 10 9
carry
16-bit
ah
Segmentni registri
15
parity
16
aux carry
31
Asemblerski programi
Strana 11
Procesor80386jenapravljentakodamnogenjegovenaredbenezaviseodtogadalisuimoperandi
oznaeniilineoznaenibrojevi(tojeposledicakorienjakomplementa2zaoznaenebrojeve).Dabi
program koji seizvravanaprocesoru mogaoda koristi obatipapodataka, adapri tomnedoe do
zabune,moraseoslonitinaindikatore.Posmatranjemvrednostinekogodindikatoranakonobavljene
operacije,programpraktinodajeznaenjepodatkukojiseobrauje(npr.dalijeupitanjuoznaenili
neoznaenbroj).
c (carry)jeindikatorprekoraenjazaneoznaenebrojeve.Postavljasena 1 ukolikojeprilikom
izvravanjanekeoperacijedolodoprenosailipozajmce(rezultatseovdeposmatrakaoneoznaenbroj),
a u suprotnom na 0. Kada se obavlja neka aritmetika operacija, na primer sabiranje, procesor e
odrediti rezultat u binarnom obliku i istovremeno postaviti sve indikatore koji mogu imati veze sa
sabiranjem.Akoprogramradisaneoznaenimbrojevima,nakonsabiranjatrebaproveritiinidikator c
kakobiseutvrdilodalijerezultatuopseguneoznaenihbrojeva.
o (overflow)jeindikatorprekoraenjazaoznaenebrojeve.Postavljasena 1 ukolikojeprilikom
izvravanjanekeoperacijedolodoprenosailipozajmce(rezultatseovdeposmatrakaooznaenbroj),a
u suprotnom na 0. Ako program radi sa oznaenim brojevima, nakon aritmetike operacije treba
proveritiinidikatorokakobiseutvrdilodalijerezultatuopseguoznaenihbrojeva.
z(zero)jeindikatornule.Postavljasena1ukolikojeprilikomizvravanjanekeoperacijerezultat
jednaknuli,ausuprotnomna0.
s(sign)jeindikatorznaka.Postavljasena1ukolikojeprilikomizvravanjanekeoperacijenajvii
bit rezultata jednak jedinici (odnosno, ako je rezultat, posmatran kao oznaeni broj, negativan), a u
suprotnomna0.
Prilikomizvravanja,programstanjeovihindikatoramoetestiratinaredbamauslovnihskokova,
apostojeinaredbekojekoristevrednostiindikatoraprilikomizraunavanjarezultata.Takoe,vrednosti
nekih indikatora se mogui direktno postavljati na 0 ili 1 (zadetalje pogledati poglavlje 11, Pregled
korienihnaredbi).
Skupnaredbi 80386 je neortogonalan:neprihvatajusvenaredbe svevrste operanada. Ovoje
velikimdelomposledicainjenicedaje80386(kaoisviostalinaslednici,ukljuujuiiposlednjefamilije
mikropeocesora) projektovansciljemdabudekompatibilansaranijim Intel ovimmikroprocesorimaiz
x86familije.
Labelasedefinienavoenjemimenalabeleizakogasledidvotaka.
Neposrednioperandiimajuprefiks$,nakonegasledibrojilinazivlabele.Ukolikoseispred
konstanteililabelenenavede$,tadasekoristidirektnoadresiranje.
Podrazumevanibrojnisistemjedekadni.Akotrebaunetibrojuheksadecimalnomobliku,prefiksje
0x,zaoktalnebrojeveprefiksje0,dokjezabrojeveubinarnomoblikuprefiks0b.
Registarskioperandiimajuprefiks%.
Ukolikonaredbaimadvaoperanda,prvoideizvornioperand,anakonnjegaodredini.
Svenaredbekojebaratajupodacimaimajusufiksb,wilil(maloL),imesedefiniedalise
naredbaodnosinabajt(byte,8bita),re(word,16bita)ilidvostrukure(long,32bita).Ukolikosesufiks
Asemblerski programi
Strana 12
nenavede,bieodreennaosnovuodredinogoperanda(ovonijeproblemkodregistarskogadresiranja,
alijestekodmemorijskog).Naprimer,kodnaredbe:
movw $10, %ax
slovowunazivuoznaavadajeupitanjunaredbakojaseodnosinare.Izvornioperandjeneposredni
(vrednost10dekadno),aodredinijeregistarski(registarax).Slino,uprimeru:
movb %ch, %al
slovobunazivuoznaavadajeupitanjunaredbakojaseodnosinabajt.Izvornioperandjeregistarski
(registarch),aodredinioperandjetakoeregistarski.
Ovedvelinijeomoguavajudaseprogramzavrinaregularannain,pozivomsistemskefunkcije
zazavretakprograma(osistemskimpozivimaeviereiuglaviError:Referencesourcenotfound).Da
bisevidelastanjaregistaraprenegoseprogramzavri,korisnojepostavitiprekidnutakunaprvuod
dvenaredbe.
Napomena:veinaprogramaupraktikumujedatabezovihpodrazumevanihlinija.
Asemblerski programi
Strana 13
2.8. Dibager
Dibager slui za kontrolisano izvravanje programa, i unutar njega se mogu stalno pratiti i
menjatisadrajiregistaraiindikatoraipostavljatiprekidnetake.Dibagerkojiesekoristitisezove
DDD(DataDisplayDebugger)ipredstavljagrafikookruenjezagdb(GNUDebugger,osnovnidibager
kojiradiizkomandnelinije).DDDsepozivakomandom:
ddd primer
gdeje primer nazivizvrnogfajla.Ukolikosedibagerpokreneizkomandnelinijenaovajnain,
dalja interakcija sa komandnom linijom nee biti mogua sve dok se dibager ne zatvori. Meutim,
ukolikosedibagerpokrenenasledeinain:
ddd primer &
tadaekomandnalinijaostatislobodnazadaljiradidokjedibagerpokrenut.Natajnainseonamoe
daljekoristitizaprevoenjeprograma,bezpotrebedasedibagerzatvarailidaseotvaranovakomandna
linija.
Ukolikosedesidadibagerprestanedaseodazivanakomande,anemoesezatvoritiklikomna
dugmezazatvaranje,moeseiskoristitinaredbakillall:
killall -9 ddd
Nakonizvrenjaovenaredbe,sveinstancedibageraebitizatvorene.
Na slici 4 je prikazan izgled glavnog prozora dibagera. Na ovom kursu se koristi izmenjena
verzija DDD dibagera 3.3.11. Izmene su nainjene radi lakeg rada sa asemblerskim programima.
Glavniprozorjepodeljennanekolikopanelaiprozora(kojisemoguprikazati,odnosnosakritiiz Viewi
Statusmenija).Panel(1)sadriizvornikdprograma.Prozor(2)sadrikomandevezanezaizvravanje
programa. Prozor (3) sadri trenutne vrednosti registara. Panel (4) sadri vrednosti koje je korisnik
odabraodaprikazuje(kadatakvihvrednostinema,panelseneprikazuje).Panel(5)sadrikomandnu
liniju gdba(tusemoevidetitekstualniobliksvihkomandizadatihu DDDu),dokpanel(6)sadri
izgled programskog kda u memoriji. Ukoliko nakom pokretanja dibagera prozor sa registrima nije
ukljuen,trebagaukljuitiodabiromopcijeRegistersmenijaStatus.
Asemblerski programi
Strana 14
Pre pokretanja programa, prvo to treba uraditi je postaviti taku prekida (breakpoint) na
pretposlednjulinijuuprogramu(trebalobidaje kraj: movl $1, %eax).Takaprekidapredstavlja
mestonakomeesezaustavitiizvravanjeprogramanakontoseonpokrene.Mestodokogsestiglou
izvravanjuprogramajeobeleenozelenomstrelicomipredstavljanaredbukojaese sledea izvriti.
Takaprekidasemoepostavitinavienaina:
kliknesedesnimdugmetommianapoetaklinije,paseizmenijaodabereSetBreakpoint
dvoklikmiemnapoetaklinije
Runpokreeprogramodpoetka.Izvravanjesezaustavljakadsenaienatakuprekida.
Asemblerski programi
Strana 15
pozivapotprograma: Stepiizvravapotprogramkorakpokorak,dokNextiizvriceopotprogrami
zaustavljasenanaredbikojasledinaredbupozivapotprograma.
Contnastavljaizvravanjeprogramadosledeetakeprekida.
Interruptprekidaizvravanjepokrenutogprograma(samogunounastavkaizvravanja).
Killprekidaizvravanjepokrenutogprograma(bezmogunostinastavkaizvravanja).
UkolikosekliknenanekiodregistarauRegistersprozoru,njegovoimesepojavljujeuliniji(7)koja
senalaziispodmenija.Naprimer,akosekliknenaregistar eax,uliniji(7)sepojavljujetekst$eax.
Akosesadakliknenadugme Display,upanelu(4)eseprikazatipoljesasadrajemregistra eax u
oznaenom dekadnom obliku. Ukoliko treba prikazati heksadecimalnu vrednost, pre klika na dugme
Display treba dodati prefiks /x, za prikaz binarnih vrednosti treba staviti /t, dok za prikaz
neoznaenihdekadnihvrednostitrebastaviti/u.Naziviregistaraseuliniju(7)moguunositiiruno,
samoisprednazivaregistratrebastavitiprefiks$.
Prikazanevrednostinapanelu(4)semoguobrisatiklikomnavrednost,azatimklikomnadugme
Undisp.
Da bi se promenila vrednost u registru, u liniju (7) treba postaviti njegovo ime (zajedno sa
prefiksom$;tosemoeuraditi,naprimer,klikomnaregistaruprozoruRegisters)ikliknutinadugme
Set.Nakontoga,uprozorukojiseotvorisemoeupisativrednostkojaeseupisatiuregistar.Ukolikose
vrednost navede bez prefiksa, smatrae se da je u dekadnom obliku, dok se prefiks 0x koristi za
heksadecimalnevrednosti.
Prikaz pojedinihindikatoraiz eflags registra, kao ivrednosti 8bitnihi16bitnihregistarase
moepostiiklikomnaodgovarajuedugmenapaneluzaprikazpodataka(8).
Napomena:vrednostiindikatorairegistaraprikazanihprekoovogpanelasenemogumenjati.
Panel(9)sadrinajeekorieneopcijeprozora(2),kaoidugmezaponovnouitavanjeprograma
(Reload).
Sva podeavanja DDDa se uvaju u skrivenom direktorijumu .ddd koji se nalazi u home
direktorijumukorisnika,akosedrugaijenenaglasi.Ukolikosupodeavanjapromenjenanatakavnain
da se DDD ne ponaa kako se oekuje, potrebno je obrisati trenutna podeavanja, nakon ega e se
automatski izgenerisati podrazumevana podeavanja (pri tome, DDD ne sme biti startovan).
Podeavanjasemoguobrisatikomandom:
rm -rf ~/.ddd
Asemblerski programi
Strana 16
1. Smestivrednost12upromenljivua
2. Smestivrednost8upromenljivub
3. Uporediaib.Akosujednaki,preinakorak9
4. Uporediaib.Akojeaveeodb,preinakorak7,inaepreinasledeikorak
5. Oduzmiaodbirezultatsmestiub
6. Preinakorak3
7. Oduzmibodairezultatsmestiua
8. Preinakorak3
9. Krajalgoritma
cmpPoreenjeoperanada.Tehniki,ovomnaredbomseododredinogoperandaoduzimaizvorni,
ali se pri tom sadraj odredita ne menja, ve se samo auriraju indikatori: u ovom sluaju
zanimajunasindikatorz(zero),kojisepostavljaakojerezultatnula,iindikatorc(carry),kojise
postavljausluajuprenosasanajznaajnijepozicije.
je,ja,jmpRelativniskokovi.Prvadvasuuslovna.Doskokaje(jumpifequal)dolaziakovai
z=1,adoskoka ja (jumpifabove)dolaziakovai c=0i z=0.Naredba jmp jebezuslovniskok.
Naredbeskokaneutiunaindikatore.
Asemblerski programi
Strana 17
movl $12,%eax
movl $8,%ebx
uporedi:
cmpl %ebx,%eax
je kraj
ja vece
subl %eax,%ebx
jmp uporedi
vece:
subl %ebx,%eax
jmp uporedi
kraj:
movl $1, %eax
movl $0, %ebx
int $0x80
#eax<->ebx
Strana 18
0xff 0x64
Izaodgovarajuedirektivesemoenavestiivievrednostiodvojenihzarezima,imesedefinieniz
vrednostiistogtipa.Ispreddefinicijepodatkastojilabela, imeseomoguavadasepodatkupristupa
prekolabele.Labelajesamo zamenazaadresu nakojojsepodataknalazi.Trebaimatinaumuda
procesormoesabilokojeadresedaproitapodatakbilokojepodraneveliine,bezobziranatokakoje
podatakdefinisan.Primeri:
movl
movw
movl
movw
movl
movb
movl
duga_rec, %eax
%ax, rec
$bajt, %eax
bajt, %ax
rec+2, %eax
duga_rec, %al
bajt, %eax
Konstantesedefiniunasledeinain:
konstanta = vrednost
gcc dozvoljava osnovne aritmetike operacije sa konstantama (mogue je pisati proizvoljne
aritmetikeizrazesakonstantamabilogdeuprogramugdesekonstantamoenai):
const1 = 5
const2 = const1+4
const3 = const2*2
movl $const1+const2, %eax
movl $const3*4, %ebx
movl $const1*%eax, %ebx
Strana 19
Treba imati na umu da ovakve operacije vae samo za konstante, i da e svaka drugaija
upotrebadovestidogreke.
Labelasemoedefinisatikaokonstantaitadajojseeksplicitnododeljujeadresa.Ovakvalabelase
koristiilikaoneposrednioperandilikaopoetnavrednostkodpromenljive:
max_vrednost = 20
vrednost:
.long max_vrednost
...
movl $max_vrednost, %eax
Mainskiformatnaredbiprocesora 80386 dozvoljavadaseujednojnaredbimoeobavitinajvie
jedanpristupmemoriji(kodnaredbisadvaoperanda).Topraktinoznaidajeneispravnanaredbaija
obaoperandazahtevajupristupanjenekojmemorijskojlokaciji,kaouprimeru:
movb bajt, rec
#
#
#
#
Strana 20
0;
3;
8;
(;a > 0;a--)
r += b;
r = 0;
a = 8;
b = 3;
while (a >= b) {
a -= b;
r++;
}
(b)
(a)
Dabise64bitnapromenljivaprikazalaudibageru(bezobziranatokakojedefinisana),potrebno
jeizmenijaDataodabratiopcijuMemoryipopunitipoljanasledeinain:Examinetrebapostavitina1
(ilinavie,akoseeliposmatratiniz64bitnihbrojeva),sledeepoljetrebapostavitinaeljenibrojni
sistem(najeehex,decimaliliunsigned),narednopoljetrebapostavitinagiants(8)(posmatranje
8bajtnihpodataka),auposlednjempoljutrebaupisatinazivpromenljivesaznakom&ispred(zagornji
primerbibilo&a1,odnosno&a2).NakonklikanaDisplay,prikazaesesadraj64bitnepromenljivekao
64bitnavrednost.
Strana 21
# a = 0x8000 (0x000080001)
# b = 0x100080001
Podrazumevasedaseprvideokdanalaziudatasekciji,adrugiutextsekciji.
Opseg
128do+127
0do255
16
32768do+32767
16
0do65535
32
Strana 22
C
0do4,294,967,295
64
263do+2631
64
0do+2641
Dibager
char
.byte
bytes
unsigned char
.byte
bytes
short int
.word
halfwords
.word
halfwords
.long
words
unsigned int
.long
words
long long
.quad
giants
.quad
giants
2147483648do2147483647 int
32
Asembler
Nizovi
Strana 23
4. Nizovi
4.1. Pristupanje elementima niza
Pristupanjeelementimanizazahtevakorienjeindeksnogi/iliindirektnogadresiranja.Ukoliko
seradisanizovimaijielementisuveliine1,2,4ili8bajta,tadasemoekoristitiindeksnoadresiranje,
kaouprimeru:
niz: .long -3,6,7,4,12
...
movl $2, %eax
movl niz(,%eax,4), %ebx
# indeks u %eax
# 7 u %ebx
Uovomprimeru,registareaxjeiskorienkaoindeksniregistar,abroj4oznaavaveliinujednog
elementaniza.Adresakojojesepristupitisedobijakaozbiradreselabele niz isadrajaindeksnog
registrapomnoenogsa4(veliinajednogelementanizaje4bajta).
Koristeiindirektnoadresiranje,istomelementubisemoglopristupitinasledeinain:
movl $niz, %eax
addl $8, %eax
movl (%eax), %ebx
Uovomprimeru,registareaximauloguindeksnogregistra,aregistarecximauloguindirektnog
registra.Adresakojojesepristupitisedobijakaozbirvrednostiregistra ecx isadrajaregistra eax
pomnoenog sa 4. Ova varijanta je naroito pogodna ukoliko pristup elementima niza treba
parametrizovati.
Vrednostkojomsemnoiindeksniregistarmoebiti1,2,4ili8.Zadrugeveliineelemenataniza
semorakoristitiindirektnoadresiranje,itadasezasvakopristupanjeelementunizamoraizraunati
njegovaadresa.
DDD omoguavajednostavanprikazsadraja32bitnihnizova.Za32bitnenizovejedovoljnoiza
nazivanizastavitisufiks@n,gdejenbrojlanovanizakojetrebaprikazati.Naprimer,akosenizzove
nizrec i ima 5 lanova, treba kliknuti na naziv niza, zatim u gornjoj liniji iza naziva dodati @5
(nizrec@5) ikliknutinadugme Display.Za8bitne,16bitnei64bitnenizovetrebaiskoristitiopciju
MemoryizmenijaData,kakojeranijeveopisano.
Nizovi
Strana 24
#define NELEM 10
int niz[NELEM] = {1,2,3,4,5,6,7,8,9,10};
int suma = 0;
int i;
for (i = 0; i < NELEM; i++)
suma = suma + niz[i];
Slika 7: C program za sumiranje elemenata niza
= 10
.long 1,2,3,4,5,6,7,8,9,10
.long 0
...
main:
movl $0, %esi
movl $0, %eax
#indeksni registar
#eax se koristi za raunanje sume
petlja:
addl niz(,%esi,4), %eax
incl %esi
cmpl $NELEM, %esi
jl petlja
kraj:
movl %eax, suma
movl $1, %eax
movl $0, %ebx
int $0x80
Vanojenapomenutida,akosetraidaserezultatnakrajunalaziunekojpromenljivoj(suma),to
trebai uraditi uprogramu. Program utoku svogradakoristi registar eax zaraunanjesume (x86
procesorinemoguimatidvamemorijskaoperandauistojnaredbi),anakrajuprogramasetaizraunata
vrednostpostavljaupromenljivusuma.
petlja:
addl (%esi), %eax
addl $4, %esi
#long zauzima 4 bajta
cmpl $niz+NELEM*4, %esi
jl petlja
kraj:
movl %eax, suma
movl $1, %eax
movl $0, %ebx
int $0x80
Ovavarijantaprogramajepodesnazapretvaranjeupotprogram,potoseuglavnojpetljinigde
eksplicitnonenavodiadresaniza(onajepreglavnepetljepostavljenauregistaresi).
Nizovi
Strana 25
main:
movl $niz, %esi
movl $NELEM-1, %edi
movl $0, %eax
#bazni registar
#indeksni registar
#eax se koristi za raunanje sume
petlja:
addl (%esi, %edi, 4), %eax
decl %edi
jns petlja
kraj:
movl %eax, suma
movl $1, %eax
movl $0, %ebx
int $0x80
Ovavarijantajetakoepodesnazakorienjeupotprogramima.Dodatno,kodovevarijantenema
eksplicitne provere da li se dolo do kraja niza. Inicijalno, indeksni registar je postavljen tako da
pokazuje na poslednji element u nizu. U toku izvravanja petlje, indeksni registar se smanjuje, a
indikacijuzavretkanamdajes(sign)indikator.Dokgodjevrednostuindeksnomregistrupozitivnaili
nula nakon oduzimanja (to odgovara validnim indeksima elemenata u nizu), skakae se na labelu
petlja.imovavrednostpostanenegativna(tonamoznaavaindikatorsnakoganaredbadecutie),
ciklussezavrava.Ovakvaproveraimaogranienjedasenemoekoristitisanizovimakojiimajuvie
od231 elemenata(akopogledamobinarnureprezentacijubroja2 31,atojejedinicakojusledi31nula,
videemodajezaneoznaenevrednostiod231do2321najznaajnijibitpostavljenna1,toznaidaeis
indikatorbitipostavljenna1,pabisepetljazavrilaodmahnakonobradeprvogelementa).
#bazni registar
#indeksni registar
#eax se koristi za raunanje sume
petlja:
addl -4(%esi, %ecx, 4), %eax
loopl petlja
kraj:
movl %eax, suma
movl $1, %eax
movl $0, %ebx
int $0x80
Iovavarijantajepodesnazakorienjeupotprogramima. Kodovevarijantesekoristinaredba
loop za realizaciju petlje. U svojoj 32bitnoj varijanti (loopl), ova naredba radi sledee: umanjuje
vrednost ecxregistraza1iukolikojetavrednostnakonumanjenjarazliitaodnule,skaenalabelu.
Akopogledamovrednostikojeeuzimatiindeksniregistar(ecx),videemodaenjihovopsegbitiod1do
NELEM,aneod0doNELEM-1,kaotobiindeksnoadresiranjezahtevalo.Iztograzloga,opsegjepomeren
zajednu32bitnupozicijunadoledodavanjemkonstante -4 uizrazzaadresiranjeniza(praktino,sve
adresekojimasepristupasupomereneza4bajtanadole,paefektivnodobijamoopsegindeksaod0do
NELEM-1).
dalijeindeksprvogdanapozitivan?
dalijeindeksposlednjegdanamanjiodukupnogbrojadana?
Nizovi
Strana 26
dalijeindeksprvogdanamanjiilijednakindeksuposlednjeg?
Akobilokojaodovihproveraneuspe,postavljaseglobalnapromenljivagreska.
#define BROJ_DANA 365
extern int g_donja, g_gornja;
extern int d_prvi, d_poslednji;
extern int broj_d;
extern int greska;
extern int dani[];
greska = 0;
if (d_prvi < 0 || d_poslednji >= BROJ_DANA
|| d_poslednji < d_prvi)
greska++;
else {
int i;
broj_d = 0;
for (i = d_prvi; i <= d_poslednji; i++)
if (g_donja <= dani[i] && g_gornja >= dani[i])
broj_d++;
}
Slika 8: C program za brojanje dana sa temperaturom u zadatim granicama
Asemblerskiekvivalentdatjeunastavkuteksta.Onserazlikujeodprethodnogprogramapotome
tojesmanjenbrojdana(nasedam),daasemblerskiprogramnebibiopredugaak(sutinaalgoritmase
ovimenemenja)ipotometouasemblerskomprogramunijeodraenaveinaprovera.
broj_dana
g_donja:
g_gornja:
d_prvi:
d_poslednji:
broj_d:
greska:
dani:
= 7
.long
.long
.word
.word
.word
.byte
.long
.long
.long
.long
.long
.long
.long
-1
3
1
5
0
0
5
-1
2
4
-2
-3
3
...
main:
movl $0, %ebx
movw d_prvi, %bx
cmpw $0, %bx
jl i_greska
movl $0, %ecx
movw d_poslednji, %cx
subl %ebx, %ecx
incl %ecx
movw $0, broj_djedan_dan:
movl dani(,%ebx,4), %eax
cmpl g_donja, %eax
jl van_opsega
cmpl g_gornja, %eax
jg van_opsega
incw broj_d
van_opsega:
incl %ebx
loopl jedan_dan
jmp kraj
Nizovi
Strana 27
i_greska:
incb greska
kraj:
movl $1, %eax
movl $0, %ebx
int $0x80
Napomeneuzprimer:
Pojedinanimvrednostimanizapristupasepomouindeksnogadresiranja.
Kaobrojaiteracijaglavnepetljeprograma(kojapoinjelabelom jedan_dan)koristiseregistar
ecx. Za njegovo dekrementiranje, testiranje i uslovno grananje mogue je koristiti specijalnu
naredbu loop koja podrazumeva korienje samo ovog registra (zbog neortogonalnosti skupa
naredbi80386).Uovomsluaju,loop jedan_danbilobiekvivalentnonizunaredbi
decl %ecx
jnz jedan_dan
Obratitipanjunakorienje16bitnihi32bitnihregistara(naprimer,paralelnosekoristekako
registarbx,takoiregistarebx).
4.3. Stringovi
Stringovi su nizovi znakova. Svaki znak je u raunaru predstavljen celim brojem. Za kodiranje
znakovakoristise ASCII standard(AmericanStandardCodeforInformationInterchange)ilinekaod
njegovihproirenihvarijanti.Uosnovnom ASCII kodu,svakiznakzauzimajedanbajt.Zaoznaavanje
krajastringaesekoristitikonvencijajezikaC,atojedasenakrajustringanalaziASCIINULbajt,
kojiimavrednostnula.
Direktiva.asciisluizasmetanjeASCIItekstausegmentpodataka:
string: .ascii "neki tekst\0"
Znaci\0nakrajustringasluezadefinisanjeASCIINULznaka(istokaonaCu).
Zaprikaz stringova se moe iskoristiti dugme String sa panela za prikaz promenljivih. Rad sa
stringovimaebitipredstavljennaprimeruizbacivanjaznakovarazmakasakrajaisapoetkastringa.
char s[] = " neki tekst
\0"
char *p = s;
//izbacivanje razmaka sa kraja
while (*p) p++;
while (*(p-1) == ' ') p--;
*p = 0;
//izbacivanje razmaka sa poetka
while (*s == ' ') {
p = s;
while (*(p+1)) {
*p = *(p+1);
p++; }
*p = 0;
}
//tekst
//pomoni pokaziva
//nalaenje kraja stringa
//nalaenje prvog razmaka sa kraja
//postavljanje nule na taj razmak
//dok god je na poetku razmak
//kree se od poetka stringa
//i ide se do kraja
//niz[i] = niz[i+1]
//sledei element
//nula na kraju stringa
Nizovi
Strana 28
Asemblerska verzija programa sadri samo izbacivanje znakova razmaka sa kraja stringa. Za
razlikuodprethodnogprimera,ovdesezapristupanjeelementimanizakoristeindeksnoiindirektno
adresiranje.
string: .ascii " abcd
...
movl $string, %eax
kraj_s:
cmpb $0, (%eax)
je razmaci
incl %eax
jmp kraj_s
razmaci:
cmpb $' ', -1(%eax)
jne izbaci
decl %eax
jmp razmaci
izbaci:
movb $0, (%eax)
\0"
#poetna adresa stringa u %eax
#odreivanje kraja stringa
#da li se na tekuoj poziciji nalazi NUL?
#ako ne, uveaj %eax
#odreivanje broja razmaka koje treba izbaciti
#da li se na poziciji ispred tekue nalazi
#znak razliit od razmaka?
#ako ne, umanji %eax
#upisivanje NUL znaka iza poslednjeg znaka
#koji je razliit od razmaka
kraj:
movl $1, %eax
movl $0, %ebx
int $0x80
Adresiranje -1(%eax) znaidaseposmatralokacijasaadresomkojajeza1manjaodvrednosti
%eaxregistra(kodstringova,jedanelementnizazauzima1bajt).Ovakvoadresiranjejekorisnoukoliko
treba adresirati lokaciju koja je za fiksan broj mesta udaljena od tekue, na primer, adresiranje
prethodnogilisledeegelementaniza(pritometrebavoditiraunadasekonstantauskladisaveliinom
elemenataniza).
Ukoliko je potrebna ASCII vrednost nekog znaka, ona se moe dobiti iz tabele ASCII znakova
(nalaziseudodatku)ilinavoenjemznakaunutarapostrofa(naprimer, 'a'oznaavaASCIIvrednost
znakaa).
#al*operand -> ax
#ax*operand -> dx:ax
#eax*operand -> edx:eax
Deljenje neoznaenih brojeva se moe obaviti naredbom div koja, u zavisnosti od veliine
operanada,radisledee(operandmoebitipromenljiva/memorijskalokacijailiregistar):
divb operand
divw operand
divl operand
Izvravanjenaredbedivmoedovestidopojaveizuzetka.Ovosemoedesitiudvasluaja:
ukolikojevrednostoperandajednakanuli
ukolikojedobijenavrednostprevelikadastaneuodredite
Postojeinaredbekojerademnoenje(imul)ideljenje(idiv)oznaenihbrojeva,adetaljionjimase
mogunaiuglavi11(Pregledkorienihnaredbi).
Nizovi
Strana 29
= 10
.long 1,2,3,4,5,6,7,8,9,10
.long 0
= 10
.long 1,2,3,4,5,6,7,8,9,2147483632
.long 0
taeuovomsluajubitirezultat?Akoprihvatimodaasemblerskiprogramradisaoznaenim
vrednostima (poto tako radi i C program naosnovu koga je nastao asemblerski), vrlo lako se moe
utvrditidaeprogramkaorezultatdativrednost2147483618kojanikakonijetana.Zbogegasedesila
greka?
Ako se pokua izvravanje programa korak po korak, moe se videti da u trenutku kada se
rezultatu doda vrednost 2147483632, on odjednom postane negativan. U tom istom trenutku se i
indikator overflow postavljanajedinicu,tonamdajedoznanjadadobijenirezultatvienemoeda
staneu32bita.
Kakoseprogrammoedopunitidaradiispravnije?Naprimer,takotoeseuvestipromenljiva
greskaidodatiproveraprekoraenjanakonsvakogsabiranja.Grekunapoetkupostavimona0,aako
sedesiprekoraenje,postavimojena1.Ovakoproireniprogrammoedatiispravanrezultatzamnogo
iriopsegulazanegopoetnavarijanta.
to se program testira sa vie razliitih ulaza, to postoji vea sigurnost u njegovu ispravnost.
Generalnogledano,programtrebatestiratisadvegrupeulaza:
ulazikojitrebadadajuispravanrezultat
ulazikojitrebadaizazovugreku
Utestprimereuvektrebauvrstitiivrednostigraninihsluajeva,kaoivrednostiokograninih
sluajeva.Naprimer,akotestiramoprogramkojiprebrojavakolikoreikojepoinjuslovomaunekom
stringu,testprimeribitrebalidaukljueprazanstring,stringodsamojednogznakakojinijea,string
odsamojednogznakaa,stringsaviereibezijednekojapoinjesaaaliimaslovoausrediniilina
kraju,nekolikovarijantistringovagdeviereipoinjeslovoma,stringukomesvereipoinjuslovom
a,itakodalje.
Sistemski pozivi
Strana 30
5. Sistemski pozivi
Programkojitrebadakomunicirasaokruenjemobraajuiseperiferijskimureajimamoetoda
ini na dva naina: direktnim pristupom hardverskom interfejsu ureaja (na primer, portovima u
ulazno/izlaznom adresnom prostoru koji odgovaraju hardverskim registrima), ili korienjem usluga
operativnog sistema. Prvi nain se zbog svoje sloenosti koristi skoro iskljuivo kod programa
specijalizovane namene, kao to su upravljaki programi zamikrokontrolere ilidrajveri. Drugi nain
podrazumevaobraanjesistemuputemsistemskihpoziva.
Sistemski pozivi
Strana 31
Nakon povratka iz poziva, registar eax e sadrati broj proitanih bajtova, odnosno znakova.
Ukoliko jedolo do neke greke, ovajbroj e biti negativan. Treba imati u vidu da se kod unosa sa
tastature,nakrajunizaunetihznakovanalazikd10(kdzataster Enter),kaoitoda,akoseunese
vieodmaksimalnogbrojaznakova,ubafereseupisatisamoonolikokolikojespecificiranoregistrom
edx.
Sistemskipozivzaizlaz(write)koristisledeeargumente:
eax
4(brojsistemskogpozivazaizlaz)
ebx
deskriptorfajla(zastandardniizlaz,stdout,ovavrednostje1,
dokjezastandardniizlazzagreke,stderr,ovavrednost2)
ecx
adresaizlaznogbafera
edx
veliina bafera
Nakon povratka iz poziva, registar eax e sadrati broj ispisanih bajtova, odnosno znakova.
Ukolikojedolodonekegreke,ovajbrojebitinegativan.Trebaimatiuvidudaeseispisationoliko
znakovakolikosenavedeuedxregistru,bezobziranastvarnuveliinubafera.
Za regularan zavretak programa potreban je sistemski poziv exit, koji saoptava operativnom
sistemudajenastupiokrajizvravanjaprograma.Sistemskipozivzazavretakprogramakoristisledee
argumente:
eax
1(brojsistemskogpozivazazavretakprograma)
ebx
Po konvenciji, u registar ebx se stavlja 0 ukoliko je izvravanje programa prolo bez greaka,
odnosnobrojrazliitod0,ukolikojedolodonekegreke.
Unastavkusudatiprimeriprogramakojikoristepomenutesistemskepozive.Oviprimerikoriste
naredbu lea (LoadEffectiveAddress).Naredba lea izraunava adresu izvornogoperanda(kojimora
bitimemorijski)ismetajeuodredinioperand(kojimorabitiregistarski).Kodovenaredberaunanje
adreseseobavljautokunjenogizvravanja(dinamiki),doksekodnaredbe:
movl $dec_br, %edi
toradiutokuprevoenjaprograma(statiki).
Primer 1:
#primer unosa stringa
string_max = 40
string: .fill string_max,1,0
movl $3, %eax
movl $0, %ebx
leal string, %ecx
movl $string_max, %edx
int $0x80
movl $1, %eax
movl $0, %ebx
int $0x80
Sistemski pozivi
Strana 32
Primer 2:
#primer ispisa stringa
string: .ascii Neki tekst\0
str_len = 11 #moe i 10, \0 ionako nije znak koji se moe ispiati
movl $4, %eax
movl $1, %ebx
leal string, %ecx
movl $str_len, %edx
int $0x80
movl $1, %eax
movl $0, %ebx
int $0x80
Udrugomprimeruseduinastringazadajekaokonstantaiprogramerjeduandapostavinjenu
tanuveliinu.
Primer 3:
Trei primer se od drugog razlikuje samo u jednom detalju, a to je nain odreivanja duine
statikogstringa(stringaijaseduinaznauvremeprevoenjaprograma):
#primer ispisa stringa
string: .ascii Neki tekst\0
str_len = . - string
movl $4, %eax
movl $1, %ebx
leal string, %ecx
movl $str_len, %edx
int $0x80
movl $1, %eax
movl $0, %ebx
int $0x80
Ovdejekorienadirektivauoblikuizraza
labela1 = .-labela2
Takauizrazuoznaava brojalokacija kojipredstavljaadresudokojesetrenutnostiglopri
asembliranju.Ovimeselabelilabela1dodeljujerazlikapomenuteadreseiadreselabelelabela2,ime
se efektivno izraunava broj bajtova koji se nalaze izmeu te dve labele (u ovom primeru time se
izraunavaduinastringa). Bitnojeuoitidakorienjebrojaalokacijazavisiodmestanakomese
obavljaraunanje(raunajeduinestringajeneophodnodaseobaviodmahnakondefinicijestringa).
Jo jednom treba napomenuti da se ovako moe izraunati duina samo statiki zadatih stringova,
odnosnobilokakvihdrugihstatikizadatihstrukturapodataka.Stringovimakojisegenriutokomrada
programasenaovajnainnemoeodreditiduina.
Kratkisegmentikdakojiseestoponavljaju(kaotosusistemskipozivi)mogubitiveomapogodni
zapretvaranjeumakro.VieotomesemoenaiudodatkuD.
Potprogrami
Strana 33
6. Potprogrami
U raunarstvu se pod pojmom potprogram podrazumeva deo koda unutar veeg programa koji
obavljaspecifinezadatkeirelativnojenezavisanodostatkakoda.Potprogramjeobinotakonapravljen
da moe da bude pokrenut (pozvan) vie puta sa razliitih mesta u toku izvravanja programa,
ukljuujui i pozive iz drugih potprograma. Po zavretku potprograma izvravanje se nastavlja od
instrukcijeneposrednoposlepoziva[Literatura,10].
Kodprocedurnihprogramskihjezikaviegnivoapotprogramisuosnovninainzamodularizaciju
kda.Osimrazbijanjaprogramanamanjedelove,popretpostavcijednostavnijeilakezarazumevanjei
odravanje,vananamenapotprogramaje parametrizacija problema: mogunost dasezaodreenu
grupu operacija odrede njeni parametri, a da se prilikom izvravanja zadaju razliite vrednosti
parametara(argumenti)kojimaeteoperacijebaratati.
Potprogramikojikaorezultatizvravanjavraajunekuvrednostobinosenazivajufunkcije.Neki
programski jezici striktno razlikuju ovakve potprograme (funkcije) od onih koji nemaju povratnu
vrednost(procedure).Sdrugestrane,Csvepotprogramenazivafunkcijama,stimdasekaoekvivalent
procedurakoristefunkcijeijijetipeksplicitnodeklarisankaovoid.Poziviovakvihfunkcijanesmejuse
pojavitiuizrazima.
Mikroprocesoripopraviluimajuoperacijeimemorijskestrukturezaimplementacijupotprograma.
80386 nijeizuzetak:zapozivpotprogramapostojinaredba call,povratakizpotprogramaomoguava
naredba ret, a da bi ove operacije automatski pamtile i preuzimale povratnu adresu (od koje se
nastavljaizvravanjepozavretkupotprograma),koristisememorijskastrukturazvanastek(stack).
Stekjetzv.LIFO(LastIn,FirstOut)struktura:poslednjismetenelementebitiprvipreuzet.Kod
80386, call i ret koriste stek automatski, ali postoje i posebne operacije za smetanje (push) i
preuzimanje(pop)vrednosti.U32bitnomreimurada,nastekse uvek smetaju32bitnevrednosti
(jednailivienjih).Kaopokazivanavrhstekakoristiseregistaresp.
394F88E2
CE4DA0B7
685AB9FF
BEB38325
esp
porast adresa
porast adresa
394F88E2
CE4DA0B7
00000000
esp
BEB38325
Potprogrami
Strana 34
opisujeinterfejspozvanogkoda: gdeseparametrismetaju(nastekiliuregistre),redosledukomse
parametrialociraju,kojiregistrimogudasekoristeunutarpotprograma,kojeodgovoranzadealociranje
parametara(sampotprogramilikodkojigapoziva).
NaovomkursuemokoristitipozivnukonvencijuprogramskogjezikaCnax86arhitekturikojase
nazivacdecl.Premaovojkonvencijipotprogrameemopozivatiuskladusasledeimpravilima:
Kdkojipozivapotprogramjeodgovoranzaalociranjeparametara,kaoizanjihovodealociranje.
Ovodozvoljavadapotprogrammoedaimapromenjivulistuparametarakao tojeimanpr. C
funkcijaprintf().
Argumentisestavljajunastekodposlednjegkaprvom(righttoleft redosled).Naovajnainprvi
argumentjeuveknapoznatojlokaciji,neposrednoiznadpovratneadrese.
Povratnavrednostpotprogramatj.funkcijesesmetauregistareax(ukolikojepovratnavrednost
64bitna,smetaseuregistarskipar edx:eax,gde edx predstavljaviih32bita,a eax niih32
bitavrednosti).
Registri eax, ecx i edx su slobodni za korienje unutar potprograma. Ukoliko je neophodna
upotrebajonekihregistara, potrebnojedaseobezbedi da vrednost tihregistarapoizlaskuiz
potprogramabudeneizmenjena(moguseutokuizvravanjapotprogramasauvatinasteku).
Svrha korienja ove konvencije je pre svega mogunost povezivanja potprograma napisanih na
asemblerusaprogramimapisanimnaprogramskomjeziku C.Ovojeponekadneophodnobuduidaje
pojedinestvari(npr.optimalanpristuphardveru,optimizacijakritinogdelakoda,itd.)veomatekoili
aknemogueuraditikorienjemiskljuivoprogramskogjezikaC(ilinekogdrugogviegprogramskog
jezika).
Potprogrami
Strana 35
*rez
porast adresa
void
nzd (int a, int b, int *rez)
{
int r;
while (a != b)
if (a > b)
a -= b;
else
b -= a;
r = a;
*rez = r;
}
b
a
RA
FP(ebp)
ebp
esp
(b)
(a)
Slika 11: C funkcija: (a) izvorni kd i (b) izgled frejma nakon poziva funkcije, a
pre izvravanja njenog tela
Na slici 11 prikazani su jedna C funkcija i izgled njenog frejma nakon inicijalizacije. RA
(returnaddress)jepovratnaadresa,aFP(framepointer)prethodnavrednostpokazivaafrejma(registar
ebp).
Asemblerskikdkojistvarafrejmsenalazinapoetkupotprograma:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
Nakrajupotprogramasenalaziasemblerskikdkojiunitavafrejm:
movl %ebp, %esp
popl %ebp
ret
Potprogrami
Strana 36
Potopozivajuafunkcijastavljaargumentenastek,onaihmoraisklonitisasteka.Tosepostie
izmenomsadrajaespregistra.Pozivfunkcijesaslike11izveobisenasledeinain(pretpostavljaseda
suargumentia,bi*rezredomuregistrimaeax,ebxiecx):
pushl %ecx
pushl %ebx
pushl %eax
call nzd
addl $12, %esp
Umestobroja20moesestavitibrojvrednostinastekukojese eleposmatrati,dokseumesto
octalmoestavitibilokojidrugipodranibrojnisistem.
Preizlaskaizpotprogramatrebavratitivrednostisauvanihregistarauobrnutomredosledu:
popl
popl
movl
popl
ret
%esi
%ebx
%ebp, %esp
%ebp
Potprogrami
Strana 37
potprograma. Potprogrami se mogu definisati kako pre, tako i posle glavnog programa. Ukoliko je
potrebnodasepotprogrampozivaizCkda,potprogramejepotrebnodeklarisatiuskladusapravilima
Cjezika,kakobiCprevodiocznaobrojitipoveparametarapotprograma,kaoitippovratnevrednosti.
ImajuiuviduCpozivnukonvenciju,kadasepieasemblerskipotprogram,najeeemouznjega
davati i C deklaraciju funkcije, odnosno opis pozivanja tog potprograma iz Ca. Na primer, ako je
potrebno napisati asemblerski potprogram za sabiranje dva broja, kod koga su prva dva parametra
brojevikojisesabiraju,dokjetreiadresarezultata,Cdeklaracijatakvogpotprogramabiizgledala:
void saberi (int a, int b, int &rez);
Izovedeklaracijesemoezakljuitivieinjenica:
potprogramtrebadasezovesaberi
potprogram ne vraa vrednost (to znai da je sadraj eax registra nebitan po izlasku iz
potprograma)
potprogramima3parametra,prvadvaseprenosepovrednosti,doksetreiprenosipoadresi
nakoninicijalizacijestekfrejma,prviparametaresenalazitinaebp+8,druginaebp+12,atrei
naebp+16
dabisepristupilovrednostiparametraprenetogpoadresi,njegovaadresaseprvomorasmestiti
unekiregistar,pasetrebaiskoristitinekaodvarijantiindirektnogadresiranja
U C funkcijamajesasvimuobiajenasituacijadaseargumentprenetpovrednostimodifikujeu
tokuizvravanja.Naprimer,ukolikoimamo:
void funkcija(int a, int b) {
...
a += 4;
if (a > 20)
...
}
toseuasemblerumoeodradititakotoesevrednostargumentasmestitiunekiregistar,ijae
sevrednostmenjatiutokuradapotprograma:
movl 8(%ebp), %ecx
...
addl $4, %ecx
cmpl $20, %ecx
...
Potprogrami
Strana 38
Meutim, u situaciji kada nema dovoljno registara, vrednost argumenta se moe koristiti i
direktno,bakaoinaCu:
...
addl $4, 8(%ebp)
cmpl $20, 8(%ebp)
...
Jedinoogranienjeokometrebavoditiraunaje,naravno,ogranienjex86procesoraomaksimalno
jednompristupumemorijiujednojnaredbi(pristupstekujetakoepristupmemoriji).
Potprogrami
Strana 39
Potprogrami
Strana 40
#glavni program
#drugi argument -> stek
#prvi argiment -> stek
#poziv potprograma
#oslobaanje prostora na steku
Ovadvafajlasemoguspojitiujedanizvrnifajlsledeimpozivomgcca:
gcc -g -o saberi sabpp.S glavni.S
Kaorezultatesedobitiizvrnifajlsaberikojieusebiimatipotprogramizprvogfajlaiglavni
programizdrugog.
Potprogrami
Strana 41
6.7. Rekurzija
Rekurzija predstavlja situaciju u kojoj potprogram poziva samog sebe (direktno, ili indirektno,
prekodrugogpotprograma).Najlakesemoerealizovatikorienjemfrejmova,odnosnosteka,potou
tomsluajunijepotrebannikakavdodatnikd.Kodovakvihpotprogramatrebabitipaljivitrebadobro
definisatiuslovizlaskaizrekurzije,dasenebidesilodasestekprepuni(stackoverflow).
Jedan primer rekurzivnog potprograma bi bila funkcija za izraunavanje faktorijela. Faktorijel
nekogbrojan(nijedefinisanzanegativnebrojeve)jepodefiniciji:
n!=n*(n1)!
0!=1
Potprogrami
Strana 42
Akoseusvojidafunkcijaimajedanparametar(n)tipa32bitnogneoznaenogbrojakojiseprenosi
povrednosti,adasepovratnavrednostvraaprekoregistraeax,programbimogaoizgledatiovako:
#int faktorijel(int n);
faktorijel:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %ecx
andl %ecx, %ecx
jz fakt_nula
decl %ecx
pushl %ecx
call faktorijel
addl $4, %esp
mull 8(%ebp)
jmp fakt_kraj
fakt_nula:
movl $1, %eax
fakt_kraj:
movl %ebp, %esp
popl %ebp
ret
#provera da li je n=0
#n-1
#rekurzija
#n*(n-1)! -> eax
#sluaj n=0
Rukovanje bitima
Strana 43
7. Rukovanje bitima
7.1. Osnovne logike naredbe
Zarukovanjebitimasuzaduenelogikenaredbeprocesora 80386. Sve logikenaredbeutiuna
indikatore.Osnovnelogikenaredbesu and (logikoI), or (logikoILI), xor (ekskluzivnoILI)i not
(logiko NE). Prve tri obavljaju logiku operaciju nad parovima korespondentnih bita izvornog i
odredinogoperanda.Naredbanotimasamojedanoperandiobavljaoperacijunadnjegovimbitima.
Ovenaredbeseestokoristeizatzv.maskiranje,odnosnoproveravanjeilipostavljanjepojedinih
bita.Naprimer,akotrebanajniibitregistraeaxpostavitina0,tosemoepostiinaredbom:
andl $0xfffffffe, %eax
Broj0xfffffffeseuovomsluajunazivamaska,potosluizaizdvajanje(maskiranje)najnieg
bita.Binarno,tajbrojimasvejedninice,osimnanajmanjeznaajnojpoziciji.Nasliannainsenaredba
or moeiskoristitizapostavljanjenekogbitanavrednost1,doksezapromenuvrednostinekogbita
moeiskoristitinaredbaxor:
orlw $1, %ax
xorb $1, %cl
Proveradalinekibitimavrednost0ili1semoeuraditiizdvajanjemtogbitapomounaredbeand
iproveredobijenogrezultata.Naprimer,akotrebaproveritidalijenajniibitregistraeax0ili1,moe
sepisati:
andl $1, %eax
Nakon ovoga, ako se u registru eax nalazi 0, tada jevrednost najniegbita bila0, aako se u
registru eax nalazi vrednost razliitaod0,tadajevrednost najniegbitabila1.Kodoveprovereje
nezgodnototosevrednostodredinogoperandamenja.Upravozaovakveproverepostojinaredbatest.
Radi isto to i and, ali ne smeta rezultat u odredini operand, nego samo postavlja indikatore u
zavisnostioddobijenogrezultata.
testw $0x8000, %cx #provera znaka oznaene vrednosti u registru cx
Komplement2nekogbrojasemoedobitinaredbom neg,kojapredstavljakombinacijunaredbe
notidodavanjajedinicerezultatu.
%eax
%edx
$1, %eax
$0, %edx
Navedeni program negira vrednost u registarskom paru edx:eax. Naredba not rauna
komplement1odredinogoperanda.Uovomsluajujesvejednokojimeseredomkomplementiratinia
iviare64bitnevrednosti.
Korienjemnaredbeneg,programbisemogaonapisatinasledeinain:
Rukovanje bitima
Strana 44
negl %edx
negl %eax
sbbl $0, %edx
Vrednostviereisesmanjujezajedanakoseprilikomnegiranjaeaxpostaviindikatorc(tj.ako
eaxpromeniznak),toesedesitizasvevrednostieaxosimnule.Ovavarijantajestekraa,aliimatu
manutonepostavljaindikatorousluajuizlaskavanopsega(dokogadolazizavrednost263).
31
operand
101
101
01
010
010
10
110
10
carry
shl
0
carry
shr
0
carry
sar
0 carry
(a)
(b)
Slika 12: Naredbe za pomeranje: princip rada (a) i primer pomeranja za 1 mesto (b)
Naslici12prikazanojedejstvo80386naredbizapomeranje.Odredinioperandmoebitiregistar
ilimemorijskalokacija.Naredbezapomeranjeprihvatajujojedanoperand,kojiodreujebrojpozicijaza
kojeepomeranjebitiobavljeno.Ovajoperandjeilineposredni,iliseuzimaizregistra cl.Usluaju
pomeranja za vie pozicija, indikator c e biti postavljen prema vrednosti poslednjeg istisnutog bita.
Primeri:
shll $1, %eax
shrw %cl, %bx
Prilikompomeranjaulevo,postavljenindikator csemoeuzetikaoindikatorizlaskavanopsega
odreditazasluajradasaneoznaenimvrednostima. Akosevrednosti tretirajukaooznaene,treba
proveravatistanjeindikatorao.
Pomeranjemudesnonemoeseprekoraitikapacitetodredita.Ovdepostojedvagraninasluaja:
logikopomeranjeneoznaenevrednostiiaritmetikopomeranjepozitivneoznaenevrednostieposle
najvienkoraka(gdejenveliinaodreditaubitima)svestivrednostnanulu,dokekodaritmetikog
pomeranjanegativneoznaenevrednostikrajnjavrednostbiti1.
Rukovanje bitima
Strana 45
31
101
01
011
110
10
01
010
010
10
carry
ror
carry
rcl
carry
rcr
0 carry
101
carry
rol
operand
(a)
(b)
Slika 13: Naredbe za rotiranje: princip rada (a) i primer rotiranja za 1 mesto (b)
Uzprethodnonavedene,postojeidvenaredbezarotiranjekrozindikator c, rcl ircr.Razlikau
odnosunarolirorjeutometosenanajniuilinajviupozicijudovodibitizindikatorac.Primeri:
rolw $1, %ax
rcrl %cl, %ebx
Program
shl
shr
sar
rol
shll
rcll
rcrl
roll
$1,
$1,
$1,
$1,
%eax
%edx
%eax
%eax
ror
shrl
rcrl
rcll
rorl
$1,
$1,
$1,
$1,
%edx
%eax
%edx
%edx
Rukovanje bitima
Strana 46
Operacijerotiranjasemoguizvestiidrugaije.Naprimer,programzarotiranjeulevomogaobida
glasi:
shll $1, %eax
rcll $1, %edx
jnc nije_jedan
orl $1, %eax
nije_jedan:
...
Ovime se eksplicitno testira stanje indikatora c i postavlja najnii bit eax ako je c postavljen.
Implementacijaiztabele4jenamernouraenatakodanesadrinaredbeuslovnogskoka.
( a n1 2
+ a n2 2
n2
++ a 0 )( bn 1 2
n 1
n 2
+ b n2 2
++ b0 )
gdejeaivrednostbitanapozicijii(analognotomeibi).Proizvodsemoezapisatiiovako:
Pomeranjemsvihbitavrednostizajednupozicijuulevo;najniibitdobijavrednostnula.
Sabiranjemvrednostisasamomsobom,toesekoristitiuovomprimerusobziromdajesabiranje
udvostrukojpreciznostiveopisano.
Naslici14prikazanjeprogramnaCuzamnoenjebrojevanaopisaninain.
a = 60;
b = 30;
r = 0;
if (a != 0)
while (b != 0) {
if ((b & 1) != 0)
r = r + a;
a = a + a;
b = b >> 1;
}
Slika 14: C program za mnoenje pomou sabiranja i pomeranja
Rukovanje bitima
Strana 47
Programprihvata32bitneneoznaeneargumenteuregistrimaebxieax,arezultatjeneoznaen
64bitnibrojuregistarskomparuedx:eax.Doizlaskavanopsegaurezultatunemoedoi,pase
tajsluajineproverava.
Vrednost koja se u toku algoritma udvostruuje je registarski par esi:ebx. Parametar eax se
odmah prebacuje u registar ecx iz dva razloga: prvo, eax treba da sadri niu re rezultata, i
drugo,usledneortogonalnostiskupanaredbi 80386,za ecx jevezanaspecijalnanaredba jecxz,
uslovni skok iji je uslov za grananje ecx=0 i koji se u programu moe dobro iskoristiti. Ova
naredbapostojiizaregistarcxinjennazivjejcxz.
EkskluzivnoILInekevrednostisasamomsobom(xor %eax,%eax)dajerezultat0,tosemoe
iskoristitizaanuliranjesadrajaregistara.Ovojeekvivalentnosamov $0,%eax,stimtoseprva
naredbabreizvrava.
Naredbajz(jumpifzero)jealternativninazivzaje(jumpifequal),kojajepomenutaranije.
Strana 48
1.
2.
3.
4.
5.
00101001
01010101
01010100
01100101
00011111
paritet
1
0
1
0
1
Ukolikojebrojjedinicaparan,kontrolnasuma(uovomsluaju,kontrolnibit)sepostavljana0,au
suprotnomsepostavljana1.Ovakavkontrolnibitsenazivaparitet(parity),aponekadihorizontalni
paritet.toseovogkursatie,termin parnost e oznaavatiosobinubrojada jeparanilineparan
(deljivilinedeljivsa2),doketerminparitetpredstavljatirezultatprebrojavanjabitaubroju.
Kada se koristi paritet, uobiajeno je da se bit na najznaajnijoj poziciji koristi za smetanje
pariteta(utomsluaju,podacisemorajupredstavljatisajednimbitommanje).Ukolikobisebitpariteta
ugradiouvrednostisaslike15,dobilebisevrednostikaonaslici16:
1.
2.
3.
4.
5.
10101001
01010101
11010100
01100101
10011111
Nedostatakovakvekontrolepodatakajetonemoeotkritigrekuukolikojeubrojupromenjen
paranbrojbita.
Drugavrstakontrolnihsumasuonekojeseodnosenapodatkekaocelinu.Jedanalgoritamkoji
radinatajnainsezasnivanasledeem:posmatrasebinarnapredstavasvihpodatakazajednoibrojise
kolikoimajedinicanasvakojteinskojpozicijiusvimbrojevima(slika17).
Strana 49
1.
2.
3.
4.
5.
00101001
01010101
01010100
01100101
00011111
01010010
Strana 50
#broj za konverziju
#baza
#neophodno zbog divl
#kraj algoritma?
#kraj stringa
#obrtanje niza
Strana 51
obrni:
cmpl %edi, %esi
jae kraj
movb (%esi), %ah
movb (%edi), %al
movb %al, (%esi)
movb %ah, (%edi)
decl %edi
incl %esi
jmp obrni
kraj:
movl $1, %eax
movl $0, %ebx
int $0x80
Strana 52
Kapacitetodreditazainternioblik:prekoraenjekapacitetajegreka.
Duinaizvornognizacifara:prazanniz(onajijijeprvielementNULbajt)setretirakaogreka.
Realniprogramizakonverzijuimalibiveibrojprovera.Naprimer,uobiajenojedaseznakovi
praznine(razmakitabulator)preprvecifre,kaoiizaposlednje,ignoriu.
x n 1 b n1 + x n2 bn 2 ++ x 1 b + x0
gde je xi cifra odgovarajue teine. Pretpostavka je da se cifre piu od najvee teine ka najmanjoj.
Postupakkonverzijeovakozapisanogbrojaunjegovuvrednostmoeseopisatisledeimnizomkoraka:
1. Inicijalizujrezultatkonverzijenanuluipostavitekuupozicijuunizucifaranaprvucifru
2. Pomnoirezultatosnovombrojnogsistema
3. Dodajnarezultatvrednostcifrenatekuojpoziciji
4. Ako ima jo cifara, pomeri tekuu poziciju za jedno mesto u desno i prei na drugi korak, u
suprotnomzavrikonverziju
Program na Cu za konverziju celog neoznaenog broja iz dekadnog znakovnog oblika u interni
oblik prikazan je na slici 18. Jednostavnosti radi, ovaj algoritam ne proverava izlazak van opsega
rezultata.
#include <ctype.h>
extern const char *d;
extern int greska;
extern unsigned r;
greska = 0;
r = 0;
if (!*d)
greska++;
else
while (*d) {
if (!isdigit(*d)) {
greska++;
break;
}
r *= 10;
r += *d++ - '0';
}
Slika 18: Konverzija znakovnog zapisa neoznaenog dekadnog broja u interni format
Strana 53
Asemblerskaverzijaovogalgoritmaizgleda:
dec_br: .ascii "3133734892\0"
greska: .byte 0
...
leal dec_br, %esi
#adresa prvog znaka -> esi
movb $0, greska
xorl %eax, %eax
#r=0
xorl %ebx, %ebx
movl $10, %ecx
dec_cifra:
movb (%esi), %bl
#znak -> bl
andb %bl, %bl
#provera kraja stringa
jz kraj_dec
subb $'0', %bl
#izdvajanje cifre i provere
mull %ecx
#r*=10
addl %ebx, %eax
#r=r+cifra
incl %esi
#sledei znak
jmp dec_cifra
kraj_dec:
cmpl $dec_br, %esi
#'\0' na poetku stringa?
jne kraj
i_greska:
incb greska
kraj:
movl $1, %eax
movl $0, %ebx
int $0x80
#baza
#kraj stringa?
#dobijanje cifre
#provera prekoraenja
#sledei znak
Strana 54
#prazan string?
R=0
R=(0+2)/8=0.2510
R=(0+2*109)/8=250000000
R=(0.25+1)/8=0.1562510
R=(250000000+1*109)/8=156250000=0.15625*109
Kodimplementacijeovogalgoritmauasembleru,obratitipanjunatodaseutomsluajuradisa
skaliranimbrojevima.Zbogtoga toalgoritamradizabilokojubazu,dabiseizbeglaprekoraenjau
nekimsituacijama,zaradsa32bitnimvrednostimatrebakoristitifaktorskaliranja10 8.
Strana 55
Nemapromene
Vrednostjenedefinisana
Vrednostsemenjauskladusarezultatom
(ukolikosedrugaijenenaglasi)
Vrednostsetestiratokomoperacije
0ili1
indikatorsepostavljananavedenuvrednost
Opisinaredbiudaljemtekstuvaeza32bitnizatienireimprocesora80386.
TM
Sabira izvorni i odredini operand i rezultat smeta u odredini operand. Prilikom sabiranja,
zateeniprenosseuzimauobzir.
add src, dst
Sabira izvorni i odredini operand i rezultat smeta u odredini operand. Prilikom sabiranja,
zateeniprenosseneuzimauobzir.
and src, dst
VrioperacijulogikogIizmeukorespondentnihbitaizvornogiodredinogoperandairezultat
smetauodredini.
call dst
Pozivpotprograma.Prilikompoziva,nasteksesmetapovratnaadresa.
clc
Postavljacarryindikatorna0.
cld
Strana 56
Postavljadirectionindikatorna0.
Oduzima izvorni operand od odredinog, postavlja indikatore u skladu sa tim, ali ne menja
odredinioperand.
dec dst
Oduzima1ododredinogoperanda.
div src
Neoznaenodeljenje.Uzavisnostiodveliineizvornogoperanda,imasledeedejstvo:
divb operand # ax/operand -> al, ostatak -> ah
divw operand # dx:ax/operand -> ax, ostatak -> dx
divl operand # edx:eax/operand -> eax, ostatak -> edx
operand moebitiregistarilimemorija/promenljiva
Izvravanjenaredbedivmoedovestidopojaveizuzetka.Ovosemoedesitiudvasluaja:
ukolikojevrednostoperandajednakanuli
ukolikojedobijenavrednostprevelikadastaneuodredite
idiv src
Oznaenodeljenje.Uzavisnostiodveliineizvornogoperanda,imasledeedejstvo:
idivb operand
idivw operand
idivl operand
operand moebitiregistarilimemorija/promenljiva
Izvravanjenaredbeidivmoedovestidopojaveizuzetka.Ovosemoedesitiudvasluaja:
ukolikojevrednostoperandajednakanuli
ukolikojedobijenavrednostprevelikadastaneuodredite
Strana 57
imul op1[,op2[,op3]]
Oznaenomnoenje.Uzavisnostiodveliineibrojaoperanada,imasledeedejstvo:
imulb operand
imulw operand
imull operand
# al*operand -> ax
# ax*operand -> dx:ax
# eax*operand -> edx:eax
moebitikonstanta,registarilimemorija
oper2
moebitisamoregistar
const
moebitisamokonstanta
inc dst
Dodaje1naodredinioperand.
int dst
Generiesoftverskiprekid.
jxx dst
Uslovniskok.Odredinioperandjerastojanjeciljnenaredbeodnaredbekojasledinaredbuskoka
(ovorastojanjeasemblerraunaautomatskikadasekaooperandstavinekalabela).Ovihnaredbiima
vie,aosnovnesudateusledeimtabelama:
Strana 58
Uslovniskokovinakonporeenja
neoznaenihbrojeva
Skokakoje...
jxx
odnosno...
ja
vee
c=0iz=0
jae
veeilijednako
c=0
jb
manje
c=1
jbe
manjeilijednako
c=1iliz=1
jna
nijevee
c=1iliz=1
jnae
nijeveeilijednako
c=1
jnb
nijemanje
c=0
jnbe
nijemanjeilijednako
c=0iz=0
je
jednako
z=1
jne
nijejednako
z=0
Uslovniskokovinakonporeenja
oznaenihbrojeva
Skokakoje...
jxx
odnosno...
jg
vee
z=0is=o
jge
veeilijednako
s=o
jl
manje
s<>o
jle
manjeilijednako
z=1ilis<>o
jng
nijevee
z = 1 ili s <>
o
jnge
s<>o
jnl
nijemanje
s=o
jnle
nijemanjeilijednako
z=0is=o
je
jednako
z=1
jne
nijejednako
z=0
Strana 59
Ostaliuslovniskokovi
Skokakoje...
jxx
jmp dst
odnosno...
jc
prenos
c=1
jnc
nijeprenos
c=0
jz
nula
z=1
jnz
nijenula
z=0
jo
prekoraenje
o=1
jno
nijeprekoraenje
o=0
js
znak
s=1
jns
nijeznak
s=0
jcxz
cx=0
jecxz
ecx=0
Bezuslovniskok.
Smetaefektivnuadresuizvornogoperandauodredini.
lods
Uzavisnostiodveliinepodrazumevanogoperanda,imasledeedejstvo:
lodsb # (esi) -> al, esi+1 -> esi za d=0, odnosno esi-1 -> esi za d=1
lodsw # (esi) -> ax, esi+2 -> esi za d=0, odnosno esi-2 -> esi za d=1
lodsl # (esi) -> eax, esi+4 -> esi za d=0, odnosno esi-4 -> esi za d=1
Podrazumevanisegmentniregistarjeds(ds:esi).
loop dst
Smanjujecx(loopw),odnosnoecx(loopl)za1iskaenaciljnunaredbuakojerezultatrazliitod
nule.
Strana 60
Kopiraizvornioperanduodredini.
mul src
Neoznaenomnoenje.Uzavisnostiodveliineizvornogoperanda,imasledeedejstvo:
mulb operand # al*operand -> ax
mulw operand # ax*operand -> dx:ax
mull operand # eax*operand -> edx:eax
operand moebitiregistarilimemorija/promenljiva
neg dst
Negiraodredinioperandpokomplementu2.
nop
Naredbabezefekta(troinekolikoprocesorskihciklusa).
not dst
Negiraodredinioperandpokomplementu1.
or
src, dst
VrioperacijulogikogILIizmeukorespondentnihbitaizvornogiodredinogoperandairezultat
smetauodredini.
pop dst
Skidavrednostsavrhastekaismetajeuodredinioperand,nakonegasevrednostpokazivaa
navrhstekapoveaza4.
push src
Smanjivrednostpokazivaanavrhstekaza4,azatimizvornioperandsmetananovivrhsteka.
M/?
TM
Strana 61
Rotiraodredinioperandkrozindikatorcarryulevozanavedenibrojmesta(neposrednioperandili
registarcl).Ukolikoserotirazavieodjednogmesta,indikatoroverflowjenedefinisan.
M/?
TM
Rotiraodredinioperandkrozindikatorcarryudesnozanavedenibrojmesta(neposrednioperand
iliregistarcl). Ukolikoserotirazavieodjednogmesta,indikatoroverflowjenedefinisan.
ret
Povratak iz potprograma. Povratna adresa se skida sa vrha steka, nakon ega se vrednost
pokazivaanavrhstekapoveaza4.
M/?
Rotira odredini operand u levo za navedeni broj mesta (neposredni operand ili registar cl).
Ukolikoserotirazavieodjednogmesta,indikatoroverflowjenedefinisan.Indikatorcarryimavrednost
poslednjegbitaupisanognanajmanjeznaajnupoziciju.
M/?
Rotira odredini operand u desno za navedeni broj mesta (neposredni operand ili registar cl).
Ukolikoserotirazavieodjednogmesta,indikatoroverflowjenedefinisan.Indikatorcarryimavrednost
poslednjegbitaupisanognanajvieznaajnupoziciju.
sar cnt, dst
M/?
TM
M/?
Pomera odredini operand u levo za navedeni broj mesta (neposredni operand ili registar cl).
Najmanjeznaajnibitdobijavrednost0.Ukolikosepomerazavieodjednogmesta,indikatoroverflow
jenedefinisan.Indikatorcarryimavrednostposlednjegbitaistisnutogsanajvieznaajnepozicije.
Strana 62
o
M/?
stc
Postavljacarryindikatorna1.
std
Postavljadirectionindikatorna1.
stos
Uzavisnostiodveliinepodrazumevanogoperanda,imasledeedejstvo:
stosb # al -> (edi), edi+1 -> edi za d=0, odnosno edi-1 -> edi za d=1
stosw # ax -> (edi), edi+2 -> edi za d=0, odnosno edi-2 -> edi za d=1
stosl # eax -> (edi), edi+4 -> edi za d=0, odnosno edi-4 -> edi za d=1
Podrazumevani segmentni registar je es (es:edi).
VrioperacijulogikogIizmeukorespondentnihbitaizvornogiodredinogoperanda,postavlja
indikatoreuskladusatim,alinemenjaodredinioperand.
Zamenjujevrednostiizvornogiodredinogoperanda.
Strana 63
o
Vri operaciju ekskluzivnog ILI izmeu korespondentnih bita izvornog i odredinog operanda i
rezultatsmetauodredini.
Za detaljniji pregled naredbi procesora 80386, italac se upuuje na knjigu Intel 80386
Programmer'sReferenceManual(napomenazaknjigu:svejedatouIntelovojsintaksi).
Strana 64
Indirektnoadresiranjesadrisamopoljebaza:
movl %eax, (%ebx)
Baznoadresiranjesadripoljaadresaibaza:
movl %eax, 87(%ebx)
Indeksnoadresiranjesadripoljaadresa,indeksieventualnomnoilac:
movl %eax, 1234(,%ecx)
Vrednostizamnoilacveeod1supogodnezaradsanizovimaijisuelementiveliine2,4ili8
bajtova.Naprimer,akojedefinisanniz nizrec ijisuelementiveliine2bajta,drugomelementuse
moepristupitisa:
movl $1, %ecx
#prvi element ima indeks 0
movw nizrec(,%ecx,2), %ax #vrednost sa lokacije nizrec + ecx*2 -> ax
Ukolikoveliinaelementanizanije1,2,4ili8bajtova,tadasezapristupelementimanizamora
koristitinekavarijantaindirektnogadresiranja.
Strana 65
Strana 66
Asemblerskaverzijaprogramaizgleda:
Strana 67
#rezervisanje 33 bajta
#broj koji se konvertuje
#prebacivanje najnieg bita eax
#u bl
#upis znaka u string
#provera kraja algoritma
#kraj stringa
#obrtanje dobijenog niza
x n 1 b n1 + x n2 bn 2 ++ x 1 b + x0
moesekonvertovatiuekvivalentnibinarnizapisposledeemalgoritmu:
1. Pomnoibrojsadva
2. Akojerezultatmanjiodjedan,odgovarajuabinarnacifraje0;zapiijeipreinaprvikorak
3. Usuprotnom,zapiibinarnucifru1ioduzmijedinicuodbroja
4. Akojebrojrazliitodnule,preinaprvikorak,usuprotnomzavrikonverziju
Problemkodimplementacijeovogalgoritmauasembleruje tostandardneprocesorskenaredbe
baratajuiskljuivocelobrojnimvrednostima.Ovosemoereitiskaliranjemrazlomljenogbrojanekim
stepenombroja10:akoseimplementacijazadrinajednostrukojpreciznosti,skaliranjesemoeizvesti
sa 109. Takvim postupkom bi, na primer, vrednost 0.2 bila predstavljena kao 200000000, a vrednost
0.0625kao62500000ili062500000.Drugiproblemsaovomkonverzijomjemogunostdaseprilikom
konverzije javi beskonana periodinost u rezultatu. Poto je kapacitet memorije ogranien, mora se
postaviti gornja granicabrojacifara konvertovanog zapisa. Ako seskaliranje izvede na ranije opisan
nain,ograniavanjebrojacifarana32edatibinarnirazlomakuporedivepreciznosti.
Strana 68
#broj za konverziju
#max broj cifara
#1 ili 0?
#oduzimanje jedinice
#kraj algoritma?
#ima jo mesta u stringu?
#kraj stringa
b1 21 + b 2 22 ++ bn 2n
moesekonvertovatiudecimalnizapisispitivanjemsukcesivnihbitaisumiranjemvrednosti 2i(poev
od1/2)zasvakupozicijugdejeodgovarajuibitjednakjedinici.
Neposredna implementacija ovog algoritma, u sprezi sa skaliranjem opisanim u prethodnom
odeljku, znaila bi korienje poetne vrednosti 500000000 i njeno polovljenje u svakom narednom
koraku.Ipak,zapostizanjeveetanostirezultataboljejeprimenitialternativnipostupak:ispitivanje
binarnihcifaraskraja,stimdaserezultatpolovipreispitivanja,adodajemuse500000000akose
pokaedajenatekuojpozicijibitvrednostijedan.
S obzirom na metod, broj binarnih cifara ne bi morao biti ogranien na 32 ukoliko bi se prvo
utvrdilalokacijakrajaniza i sa konverzijom krenulo kanjegovom poetku. Uovojverzijiuvedeno je
ogranienje radi jednostavnije konverzije binarnog znakovnog oblika u interni oblik, poto se koristi
registarkapaciteta32bita.
Strana 69
Dodatak D: Makroi
Strana 70
Dodatak D: Makroi
Iako su potprogrami osnovni i najee korien nain za modularizaciju kda, oni nisu uvek
najefikasniji. Same operacije poziva i povratka traju nezanemarljivo vreme, koje produava vreme
obrade.Akojepotprogrampisantakodapotujenekupozivnukonvenciju,ovakavtroakvremenase
poveava proporcionalno broju naredbi potrebnih da bi se konvencija implementirala. Ako se
potprogramomizvodirelativnokratakskupoperacija(kao toje,naprimer,sistemskipoziv),lakose
moe desitidatroak vezanza poziv potprogramabudeuporedivsavremenom obrade. Uvremenski
kritinimdelovimakda,iliusluajuvelikogbrojapoziva,ukupantroakpozivapotprogramamoebiti
neprihvatljivoveliki.
Jedanodnainadasetroakpotprogramskogpozivaizbegne,adaizvornikdnepostanemanje
modularan,jestekorienje makroa, odnosnomakrodefinicijaimakropoziva.Makrodefinicijesadre
nizovenaredbikojezamenjujumakropozivutekstuprograma.
Prostazamenamakropoziva naredbama izmakro definicijejekorisna, ali relativnoograniene
upotrebljivosti.Zbogtogaveinamakroasembleraomoguavamakrodefinicijesaparametrima(kaoi
makro pozive sa argumentima). Pored toga, podrane su i lokalne labele, specijalni operatori i
konstrukcijezauslovnoprevoenje.
Prilikomupotrebemakroatrebaimatinekolikostvarinaumu.Prvo,sviiolesloenijimakroie
raditisaregistrima.Akoseupotrebaregistarapropisnonedokumentuje,pozivmakroamoedastvori
nepoeljne sporedne efekte, na primer unitenje sadraja registra koji se koristi u kasnijem toku
programa. Ovakve greke nisu jednostavne za nalaenje. Drugo, preterana upotreba makroa moe
dovestidotogadajekdrazumljivsamoautoru(amodanitoliko).Makroejezatonajboljekoristiti
umereno,ipaljivoihdokumentovati.
Makrosedefinienasledeinain:
.macro naziv_makroa par1=pv1, par2=pv2, ...
<telo makroa>
.endm
Parametri (pari) su opcioni, kao i njihove podrazumevane vrednosti (pvi). Kada utelumakroa
trebaiskoristitinekiparametar,njegovoimesemoranavoditisaprefiksom\,naprimer\par1.Tekst
kojisedobijanakonpozivamakroasemoevidetipozivomasemblerasasledeimparametrima:
as -alm program.S
Dodatak D: Makroi
Strana 71
Ukolikojeumakroupotrebnodefinisatilabelu,javljaseproblemkadapostojiviemakropozivau
istomprogramu.Naime,istinazivlabelebisepojaviodvailivieputautekstuprogramaiasemblerbi
prijaviogreku.Zbogtogaseumakroimakoriste lokalnelabele.Lokalnihlabelaima10idefiniuse
ciframa od 0 do 9. Kada labelu treba iskoristiti kao operand neke naredbe, tada cifru labele
dopunjava slovo b ili f. Slovo b (backwards) se koristi kada definicija labele prethodi mestu
korienja , dok se slovo f (forwards) koristiti kada definicija labele sledi posle mesta korienja.
Lokalnelabelesemogukoristitikakoumakroima,takoiuprogramu.Mogusedefinisatiproizvoljanbroj
putaitadasenjihovopozivanjeodnosinaposlednjudefinicijulabele(slovob),odnosnonaprvusledeu
definicijulabele(slovof).
Ovajmakroostavljarezultatmnoenjauregistruilimemorijskojlokacijinavedenojkaoargument
(jedinosenemoekoristitiregistareax).Sadrajsvihregistara(osimodredinog,akojekaoargument
navedenregistar)seuva.Usluajuizlaskavanopsegabiepostavljenindikatoro.
Dodatak D: Makroi
_IS_SP
_IS_DIG
_IS_UPP
_IS_LOW
_IS_HEX
_IS_CTL
_IS_PUN
=
=
=
=
=
=
=
ctype:
.fill
.fill
.fill
.fill
.fill
.fill
.fill
.fill
.fill
.fill
.fill
.fill
.fill
.fill
.fill
Strana 72
1
2
4
8
16
32
64
9,1,_IS_CTL
5,1,_IS_CTL | _IS_SP
18,1, _IS_CTL
1,1, _IS_SP
15,1, _IS_PUN
10,1, _IS_DIG
7,1, _IS_PUN
6,1, _IS_UPP | _IS_HEX
20,1, _IS_UPP
6,1, _IS_PUN
6,1, _IS_LOW | _IS_HEX
20,1, _IS_LOW
4,1, _IS_PUN
1,1, _IS_CTL
128,1, _IS_PUN
Asemblerskimakroi,ekvivalentizaisdigitiisspacesesadamogunapisatikao:
.macro isclass character, class
xorl %ebx, %ebx
movb \character, %bl
testl $\class, ctype(,%ebx,1)
.endm
.macro isspace character
isclass \character, _IS_SP
.endm
Makroi menjaju sadraj registra ebx. Rezultat izvravanja je stanje indikatora posle naredbe
test.
Domai zadaci
1. Prepravitiprogram zamnoenjepomousabiranjaudvostrukojpreciznostidakorististandardni
ulaziizlazzakomunikacijusakorisnikom.
2. Napisatimakrozasistemskipozivzaispisnaekran.Makrobitrebaodaimajedanargument,string
kojitrebaispisatinaekran,dokbiseodreivanjeduinestringaradilousamommakrou.
Strana 73
Eksponent
Frakcija
1 1 0 0 0 0 0 1 1 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
31
30
23
22
dovoenjeeksponenatanaistuvrednost(manjisedovodinavrednostveeg,uzpomeranjefrakcije)
sabiranje,odnosnooduzimanjefrakcija
Strana 74
Mnoenjesesvodinasledeeoperacije:
sabiranjeeksponenata
mnoenjefrakcija
deljenjerezultatakonstantomskaliranja
Deljenjesesvodinasledeeoperacije:
oduzimanjeeksponenata
mnoenjerezultatakonstantomskaliranja
deljenjefrakcija
Nakonobavljanjabilokojeodoperacija,neophodnojeobavitinormmalizacijurezultata,odnosno
obezbeditidasenajznaajnijacifraufrakcijinalazinaodgovarajuojpoziciji(uprimerusaslike20,toje
pozicija23).Ukolikoseprilikomnormalizacijemenjafrakcija,neophodnojemenjatiieksponent,takoda
vrednostbrojaostaneista.
Domai zadatak
1. Napisati potprogram za konverziju stringa koji predstavlja binarnu decimalnu vrednost oblika
1011.011uvrednostumainskojnormalizovanojformisa10bitarezervisanihzaeksponent.
int BinStrToMNF(char* string, int* vrednost)
Povratnavrednostpotprogramaje0akonijebilogrekeprikonverziji,odnosno1akojeste.
Strana 75
Jednostavni skriptovi
Skriptje(skoro)obiantekstualnifajlkojisemoeotkucatiubilokomteksteditoru.Napoetku
svakogskriptatrebadastojisledeitekst:
#!/bin/bash
ili
#!/bin/sh
Prva dva znaka predstavljaju tzv. magini broj (magic number), specijalnu oznaku na poeku
svakogizvrnogfajlakojaodreujenjegovtip.Uovomsluaju,rejeoskriptu.Ostataklinijejeputanja
doprogramakojieizvritiskript.Prviprimerkaedaesekoristitibash,adrugidaesekoristitish
(stariji shell,sakojimje bash kompatibilan).Inae,oznaka#predstavljaoznakuzakomentar,pase
sve posle # pa do kraja linije smatra komentarom i ne izvrava se. Ispod ove linije se standardno
stavljaredsakomentaromkojiopisuje taskriptradi,anakontogasestavljajunaredbe.Naprimer,
trebaujednomskriptuobjedinitiprelazakuhomedirektorijuminjegovolistanjenaekranu.Nazovimo
gahl:
#!/bin/bash
#prelazak u home direktorijum i njegovo listanje
echo Prelazak u home direktorijum i njegovo listanje
cd # prelazak u home direktorijum
ls -l #listanje direktorijuma
Skriptsemoekreirati,naprimer,kucanjemgedit hl,nakonegatrebaotkucatigornjiprogram.
Komanda echo slui za ispis teksta. Kada je skript otkucan i snimljen, moe se prei na njegovo
izvravanje:
bash hl
Mnogo elegantniji nain za izvravanje je da se skript proglasi za izvrni fajl. To se postie
komandom:
chmod u+x hl
Sadasenemorakucatibash hl,negojedovoljnosamo
./hl
Promenljive
Promenljiveuskriptovimasejednostavnodefiniu.Dovoljnojesamouteluskriptanapisati:
ime_promenljive=vrednost
Ononatatrebaobratitipanjujedanisalevenisadesnestraneznaka=nesmebitirazmaka.
Kadasepromenljivaelikoristiti,tadasepie$ime_promenljive,imesepristupanjenojvrednosti.
Znaci navoda nisu obavezni, ali se preporuuju. Ukoliko je potrebno da se odmah nakon naziva
promenljive nae neki tekst tada se koristi zapis ${ime_promenljive}tekst. Generalno, sve
promenljivesustringtipa,jedinotobashdozvoljavaosnovneraunskeoperacijeukolikosusviznaciu
Strana 76
stringucifre(celibrojevi).Koddefinisanjapromenljivih,ukolikostringsadrirazmak,morasestaviti
podznakenavoda.Primeri:
x=2
ime_i_prezime="Pera Peric"
ime=Pera
prezime="Peric"
Posebnavrstapromenljivihsuonekojeseuskriptukoristekaoulazniparametri.Nazivajusei
pozicioniparametri,potoimjevrednostvezanazapozicijuprosleenogargumenta.Njihovaimenasu
$0,$1,...$9.Naprimer,akoseskriptzovexyz,tadaeprilikompoziva
xyz 1 "pera peric" mika 123 456
promenljive$0do$5imatisledeevrednosti:
$0=xyz, $1=1, $2="pera peric", $3=mika, $4=123, $5=456
dokeostalebitiprazne.Postojiiposebnapromenljiva $# kojasadribrojprenetihargumenata,
kaoi$*kojausebisadrisveprosleeneargumente.Koristeseistokaoiobinepromenljive.Vrednosti
pozicionihparametara(svihosimprvog)semogupomeratiulevopomoukomandeshift.Tako,nakon
izvrenjakomandeshift,vrednostipromenljivihizprethodnogprimerabibile:
$0=xyz, $1="pera peric", $2=mika, $3=123, $4=456
dok bi ostale bile prazne. Ovo je korisno ako bi skript trebao da prima nedefinisani broj
parametara,dabisesvimogliobraditiunekojpetlji.
Upravljake strukture
Osnovnaupravljakastrukturajeif,kojapostojiunekolikovarijanti.Najjednostavijavarijantaje:
if <uslov>
then
<naredbe>
fi
Opciono,moesedodatiielsedeo:
if <uslov1>
then
<naredbe1>
else
<naredbe2>
fi
Proirenaverzijaomoguavaviestrukeupite:
if <uslov1>
then
<naredbe1>
elif <uslov2>
then
<naredbe2>
elif ...
fi
Kaonaredbesemogustavitibilokojenaredbekojesemoguizvritiubashu. Uslovtakoemoe
bitibilokojanaredba,priemusesmatradajeuslovtaanakojepovratnavrednostnaredbe0(nula),
doksebilokojadrugavrednostsmatrazanetano.Uslovmoeimatiisledeioblik:
Strana 77
Vrsta
Vraavrednosttanoako...
-n
unarni
operandnijeprazan
-z
unarni
operandjeprazan
-d
unarni
postojidirektorijumijejeimeoperand
-f
unarni
postojifajlijejeimeoperand
-eq
binarni
suoperandicelibrojeviiakosuisti
-ne
binarni
suoperandicelibrojeviiakosurazliiti
binarni
operandisujednaki(posmatranikaostringovi)
!=
binarni
operandisurazliiti(posmatranikaostringovi)
-lt
binarni
operand1jemanjiodoperanda2(celibrojevi)
-gt
binarni
operand1jeveiodoperanda2(celibrojevi)
-le
binarni
operand1jemanjiilijednakoperandu2(celibrojevi)
-ge
binarni
operand1jeveiilijednakoperandu2(celibrojevi)
Tabela 5: Operatori bash-a
Naprimer,trebaproveritidalijeskriptuprosleentanojedanparametarkojijeceobrojikojije
veiod3,paakojeste,vratitituvrednostuveanuza1:
#!/bin/bash
#primer za if
if [ "$#" -ne 1 ] #provera da li postoji tacno 1 parametar
then
echo "Unesite tacno 1 argument"
exit 1
elif [ "$1" -le 3 ] #provera da li je parametar veci od 3
then
echo "Unesite parametar koji je veci od 3"
exit 2
else
x=$(($1 + 1))
echo "Uneti broj uvecan za 1 iznosi $x"
fi
exit 0
KomandaexitsluidaseOSuvratikdgreke.Pokonvenciji,akonemagreke,sistemusevraa
kd0,dokseusluajugrekevraakdrazliitod0.Posebnapromenljiva$?usebisadrikdgreke
poslednjeizvrenenaredbe.Aritmetikiizrazisenavodeudvostrukimmalimzagradamaispredkojih
stojiznak$.
Petlje
Prvapetljakojaebitipomenutajefor.Njenosnovnioblikje:
for brojacka_promenljiva in lista_vrednosti
do
<naredbe>
done
Listavrednostijelistastringovarazdvojenihrazmacima.Uprimeru:
Strana 78
#!/bin/bash
#for petlja
for boja in crvena zelena plava
do
echo "Jedna od boja je $boja"
done
naekranueseispisati:
Jedna od boja je crvena
Jedna od boja je zelena
Jedna od boja je plava
Argumentulistivrednostimoebitiinazivfajlailidirektorijuma,ukomesemogunaiidoker
znaci.Utomsluajuforkomandaezavrednostbrojakepromenljiveuzimatisvenazivefajlovakojise
slau sa argumentom. Na primer, treba napisati skript koji e pretraiti sve tekstualne fajlove u
tekuemdirektorijumuiispisatikolikoputasezadatarenalaziusvakomodnjih:
#!/bin/bash
#for petlja, primer 2
for fajl in *.txt #prolazak kroz sve txt fajlove
do
if [ -f "$fajl" ]
n=$(grep -c -i "$1" "$fajl") #n dobija vrednost izlaza komande grep
if [ "$n" -eq 0 ] #ako je n nula
then
echo "U falju $fajl rec '$1' se ne pojavljuje"
elif [ "$n" -eq 1 ] #ako je n jedan
echo "U falju $fajl rec '$1' se pojavljuje jednom"
else #ako je n > 1
echo "U falju $fajl rec '$1' se pojavljuje $n puta"
fi
fi
done
Konstrukcija promenljiva=$(komanda) senaziva zamenakomandi (commandsubstitution)i
omoguavadaseizlazkomandeunutarzagradedodelipromenljivoj.Opcija-ckomandegrepznaidae
sevratitibrojpojavljivanjareiufajlu,aondaeuskriptutajbrojbitidodeljenpromenljivojn.Daljese
proveravavrednostpromenljiveniuzavisnostiodtogaseispisujeodgovarajuaporuka.
Drugapetljakojaebitipomenutajewhile.Njenoblikje:
while <uslov>
do
<naredbe>
done
Uslovsedefinieistokaokodifkomande.Znaenjejedasetelopetljeizvravadokgodjeuslov
taan.Naprimer,ispisprvihnprirodnihbrojevabiizgledaoovako:
#!/bin/bash
#for petlja, primer 2
x=1
while [ "$x" -le "$1" ]
do
echo -n "$x "
x=$(($x+1))
done
Opcija-nkomandeechoznaidasenakonispisaneepreiunovired.Tako,naprimer,akobise
skriptpozvaosaargumentom5,izlazbibio12345.
Strana 79
Znaenje
$0
nazivskripta
$1
pozicioniparametar1
$2$9
pozicioniparametri29
${10}
pozicioniparametar10
$#
brojpozicionihparametara
"$*"
svipozicioniparametrikaojednare(kaojedanparametar)
"$@"
svipozicioniparametri(svakizasebno)
${#*}
brojparametaraprosleenihskriptu
${#@}
brojparametaraprosleenihskriptu
$?
povratnavrednostposlednjeizvrenekomande
$$
pid(ProcessID)skripta
svisetindikatoriprosleeniskriptu
$_
poslednjiargumentprethodnekomande
$!
pid(ProcessID)poslednjegprocesapokrenutogupozadini
Tabela 6: Specijalne shell promenljive
Korisni linkovi
Nasledeimwebstranicamasemoenaiviedetaljavezanihzapisanjeskriptova:
1. www.tldp.org/ldp/abs/html/
2. tille.xalasys.com/training/bash/
3. www.linuxtopia.org/online_books/advanced_bash_scripting_guide/refcards.html
Strana 80
Hex
--000
001
002
003
004
005
006
007
008
009
00A
00B
00C
00D
00E
00F
010
011
012
013
014
015
016
017
018
019
01A
01B
01C
01D
01E
01F
020
021
022
023
024
025
026
027
028
029
02A
02B
02C
02D
02E
02F
030
031
032
033
034
035
036
037
038
039
03A
03B
03C
03D
03E
Binary Value
------ ----00000000
NUL (Null char.)
00000001
SOH (Start of Header)
00000010
STX (Start of Text)
00000011
ETX (End of Text)
00000100
EOT (End of Transmission)
00000101
ENQ (Enquiry)
00000110
ACK (Acknowledgment)
00000111
BEL (Bell)
00001000
BS (Backspace)
00001001
HT (Horizontal Tab)
00001010
LF (Line Feed)
00001011
VT (Vertical Tab)
00001100
FF (Form Feed)
00001101
CR (Carriage Return)
00001110
SO (Shift Out)
00001111
SI (Shift In)
00010000
DLE (Data Link Escape)
00010001
DC1 (XON/Device Control 1)
00010010
DC2 (Device Control 2)
00010011
DC3 (XOFF/Device Control 3)
00010100
DC4 (Device Control 4)
00010101
NAK (Negative Acknowledgement)
00010110
SYN (Synchronous Idle)
00010111
ETB (End of Trans. Block)
00011000
CAN (Cancel)
00011001
EM (End of Medium)
00011010
SUB (Substitute)
00011011
ESC (Escape)
00011100
FS (File Separator)
00011101
GS (Group Separator)
00011110
RS (Request to Send)(Record Separator)
00011111
US (Unit Separator)
00100000
SP (Space)
00100001
! (exclamation mark)
00100010
" (double quote)
00100011
# (number sign)
00100100
$ (dollar sign)
00100101
% (percent)
00100110
& (ampersand)
00100111
' (single quote)
00101000
( (left/opening parenthesis)
00101001
) (right/closing parenthesis)
00101010
* (asterisk)
00101011
+ (plus)
00101100
, (comma)
00101101
- (minus or dash)
00101110
. (dot)
00101111
/ (forward slash)
00110000
0
00110001
1
00110010
2
00110011
3
00110100
4
00110101
5
00110110
6
00110111
7
00111000
8
00111001
9
00111010
: (colon)
00111011
; (semi-colon)
00111100
< (less than)
00111101
= (equal sign)
00111110
> (greater than)
Strana 81
Hex
--03F
040
041
042
043
044
045
046
047
048
049
04A
04B
04C
04D
04E
04F
050
051
052
053
054
055
056
057
058
059
05A
05B
05C
05D
05E
05F
060
061
062
063
064
065
066
067
068
069
06A
06B
06C
06D
06E
06F
070
071
072
073
074
075
076
077
078
079
07A
07B
07C
07D
07E
07F
Binary Value
------ ----00111111
? (question mark)
01000000
@ (AT symbol)
01000001
A
01000010
B
01000011
C
01000100
D
01000101
E
01000110
F
01000111
G
01001000
H
01001001
I
01001010
J
01001011
K
01001100
L
01001101
M
01001110
N
01001111
O
01010000
P
01010001
Q
01010010
R
01010011
S
01010100
T
01010101
U
01010110
V
01010111
W
01011000
X
01011001
Y
01011010
Z
01011011
[ (left/opening bracket)
01011100
\ (back slash)
01011101
] (right/closing bracket)
01011110
^ (caret/cirumflex)
01011111
_ (underscore)
01100000
`
01100001
a
01100010
b
01100011
c
01100100
d
01100101
e
01100110
f
01100111
g
01101000
h
01101001
i
01101010
j
01101011
k
01101100
l
01101101
m
01101110
n
01101111
o
01110000
p
01110001
q
01110010
r
01110011
s
01110100
t
01110101
u
01110110
v
01110111
w
01111000
x
01111001
y
01111010
z
01111011
{ (left/opening brace)
01111100
| (vertical bar)
01111101
} (right/closing brace)
01111110
~ (tilde)
01111111
DEL (delete)
Strana 82
Strana 83
Strana 84
Strana 85
dozvoljeno) pod tim imenom. Meutim, sekcije .text i .data su podrazumevane sekcije prilikom
pokretanjaprograma,iakonepostoje,programseneemoiizvravatikakojezamiljeno.
Nepotrebni skokovi
Razmotrimonekolikoprimeranepotrebnihskokova:
cmpl $0, %eax
je L1
L1:
incl %eax
...
Ugornjemprimeru,ukolikojeuslovtaan,programeseizvravatiodnaredbeincl %eax,aako
nijetaan,opetodteistenaredbe,odaklesledidajeskoksuvian(ilialgoritamnijedobar).
movl %eax, %ebx
jmp L1
L1:
incl %eax
...
Ugornjemprimerupostojibezuslovniskoknanaredbuodmahizaskoka,tojenepotrebno,potobi
setanaredbasvakakosledeaizvrilaidanemabezuslovnogskoka.
cmpl $0, %eax
je L2
L1:
incl %eax
...
L2:
addl $5, %eax
jmp L1
Ugornjemprimeruseprivremenoiskaeizsekvencijalnogtokaprogramadabiseobavileneke
naredbe,pasevraanamestoodmahispoduslovnogskoka.Ovakvasekvencanaredbisemoemnogo
razumljivijenapisatikorienjemsuprotnoguslovnogskoka:
cmpl $0, %eax
jne L1
addl $5, %eax
L1:
incl %eax
...
Strana 86
#poetak
#adresa od niz u esi
#nelem-1 u edi
#nula u eax
#poetak petlje
#dodaj (%esi, %edi, 4) na eax
#smanji edi za 1
#skoi ako nije s
#kraj programa
#stavi eax u sumu
#stavi 1 u eax
#stavi 0 u ebx
#pozovi int sa $0x80
Komentariugornjemprimeruninakojinainnedoprinoserazumevanjuprograma.Vrlolakose
moeispostavitidajezapoetnikeuasemblerskomprogramiranjuprilinotekodapogodetajesvrha
programa bez malo veeg udubljivanja u znaenje asemblerskih naredbi. Jedan primer dobrog
komentarisanjaistogkdajedatusledeemlistingu:
#dobro iskomentarisan kod
#program za raunanje sume niza, varijanta 3
main:
movl $niz, %esi
#registar za bazu
movl $NELEM-1, %edi
#indeks poslednjeg elementa
movl $0, %eax
#trenutna suma
petlja:
#od poslednjeg ka prvom elementu
addl (%esi, %edi, 4), %eax
decl %edi
#kad se desi edi<0, s postaje 1
jns petlja
kraj:
movl %eax, suma
#smetanje sume u zadatu promenljivu
movl $1, %eax
#exit sistemski poziv
movl $0, %ebx
#nije bilo greaka pri izvravanju
int $0x80
(Korisna) Literatura
Strana 87
(Korisna) Literatura
1. Intel80386Programmer'sReferenceManual,1986
2. LinuxAssembly,linuxassembly.org
3. ProgrammingfromtheGroundUp,JonathanBartlett,2003
4. ProfessionalAssemblyLanguage,RichardBlum,2005
5. TheLinuxDocumentationProject,www.tldp.org
6. LinuxforProgrammersandUsers,GrahamGlass,KingAbles,2006
7. GNUBashManual,www.gnu.org/software/bash/manual/bash.html
8. AdvancedBashScriptingGude,MendelCooper,2002
9. DDDDataDisplayDebuggerManual,www.gnu.org/manual/ddd/
10. TheArtofComputerProgrammingVolume1:FundamentalAlgorithms,AddisonWesley,
1997
11. WriteGreatCodeVolume1:UnderstandingtheMachine,RandallHyde,2004
12. WriteGreatCodeVolume2:ThinkingLowLevel,WritingHighLevel,RandallHyde,2006
Indeks pojmova
80386 9
ASCII 27
asembler 65
biblioteka 39
cdecl 34
ddd 13
dibager 13
direktive
ascii 27
broja lokacija 32
byte 18
data 12
direktiva 12
endm 70
fill 50
globl 12
long 18
macro 70
quad 20
section 12
text 12
word 18
frejm 34
GNU 1
horizontalni paritet 48
jednostruka preciznost 18
konstanta 18
kontrolna suma 48
labela 11
linker 65
Linux
case sensitive 1
direktorijumi 2
distribucija 1
Linux 1
logovanje 1
nazivi fajlova 4
odjavljivanje 1
lokalna labela 71
maska 43
maskiranje 43
naredbe
adc 20, 55
add 20, 55
and 43, 55
call 33, 55
clc 55
cld 55
cmp 16, 56
dec 21, 56
div 28, 56
idiv 56
imul 57
inc 20, 57
int 30, 57
ja 16
jcxz 47
je 16
jecxz 47
jmp 16, 59
jxx 57
jz 47
lea 31, 59
lods 59
loop 27, 59
mov 16, 59
mul 28, 60
neg 43, 60
nop 60
not 43, 60
or 43, 60
pop 33, 60
push 33, 60
rcl 45, 60
rcr 45, 61
ret 33, 61
rol 45, 61
ror 45, 61
sar 44, 61
sbb 21, 61
shl 44, 61
shr 44, 62
stc 62
std 62
stos 62
sub 16, 62
test 43, 62
xchg 17, 62
xor 43, 63
NUL 27
paritet 48
pokaziva frejma 34
pozivna konvencija 33
pretprocesor 65
registri 10
segmentni registri 10
shell
alias 6
bash 2
cat 5
cd 3
chmod 5
cp 4
doker znaci 3
exit 2
gcc 13
grep 5, 78
help 4
istorija komandi 2
kompletiranje naziva 2
less 5
ls 3
man 4
mkdir 5
mv 5
pajp 6
PATH 3
preusmeravanje U/I 6
prompt 2
pwd 3
rm 4
rmdir 5
set 6
shell 2
touch 5
unalias 6
skaliranje 67
skriptovi
aritmetiki izrazi 77
echo 75, 78
exit 77
for 77
if 76
operatori 77
pozicioni parametri 76
promenljive 75
shift 76
skript 75
uslovi 76
while 78
zamena komandi 78
statusni registri 10
stek 33
taku prekida 14
vertikalni paritet 49
Indeks slika
Slika 1: Nautilus................................................................................................................7
Slika 2: Midnight Commander...........................................................................................7
Slika 3: Osnovni registri procesora Intel 80386..............................................................10
Slika 4: DDD dibager.......................................................................................................14
Slika 5: C program za izraunavanje NZD......................................................................15
Slika 6: Mnoenje pomou sabiranja (a) i deljenje pomou oduzimanja (b)....................20
Slika 7: C program za sumiranje elemenata niza............................................................24
Slika 8: C program za brojanje dana sa temperaturom u zadatim granicama................26
Slika 9: C program za izbacivanje razmaka sa poetka i kraja stringa...........................27
Slika 10: Izgled 80386 steka pre i posle operacije pushl $0...........................................33
Slika 11: C funkcija: (a) izvorni kd i (b) izgled frejma nakon poziva funkcije, a pre
izvravanja njenog tela....................................................................................................35
Slika 12: Naredbe za pomeranje: princip rada (a) i primer pomeranja za 1 mesto (b). .44
Slika 13: Naredbe za rotiranje: princip rada (a) i primer rotiranja za 1 mesto (b).........45
Slika 14: C program za mnoenje pomou sabiranja i pomeranja..................................46
Slika 15: Paritet...............................................................................................................48
Slika 16: Paritet na najznaajnijem bitu..........................................................................48
Slika 17: Vertikalni paritet...............................................................................................49
Slika 18: Konverzija znakovnog zapisa neoznaenog dekadnog broja u interni format. 52
Slika 19: Konverzija iz internog formata u binarni znakovni format...............................66
Slika 20: Broj u mainskoj normalizovanoj formi sa 8 bita za eksponent.......................73
Indeks tabela
Tabela
Tabela
Tabela
Tabela
Tabela
Tabela
1:
2:
3:
4:
5:
6:
Doker znaci.......................................................................................................4
Numeriki tipovi podataka na C-u i asembleru................................................22
Pristup parametrima i lokalnim promenljivama..............................................35
Pomeranje i rotiranje u dvostrukoj preciznosti................................................45
Operatori bash-a..............................................................................................77
Specijalne shell promenljive............................................................................79