You are on page 1of 93

Praktikum raunarskih vebi

za predmet

Arhitektura raunara

Autori:
arko ivanov
Ivan Nejgebauer
Lazar Strievi
Miroslav Hajdukovi

Novi Sad, 2015.

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

6.3. Stek frejm i uvanje registara...............................................................................36


6.4. Definisanje potprograma na gcc asembleru.........................................................36
6.5. Prenos argumenata po vrednosti i po adresi........................................................37
6.6. Upotreba gcc-a za prevoenje i povezivanje (linkovanje) asemblerskih
(pot)programa..............................................................................................................39
Primer povezivanja asemblerskog potprograma i asemblerskog glavnog programa
..................................................................................................................................40
Primer povezivanja asemblerskog potprograma i C glavnog programa..................40
Primer povezivanja asemblerskog potprograma i glavnog programa u objektnom
fajlu...........................................................................................................................41
6.7. Rekurzija...............................................................................................................41
6.8. Domai zadatak.....................................................................................................42
7. Rukovanje bitima.........................................................................................................43
7.1. Osnovne logike naredbe......................................................................................43
Negacija u dvostrukoj preciznosti............................................................................43
7.2. Naredbe za pomeranje i rotiranje.........................................................................44
Pomeranje i rotiranje u dvostrukoj preciznosti........................................................45
7.3. Mnoenje pomou sabiranja i pomeranja.............................................................46
7.4. Domai zadatak.....................................................................................................47
8. Kontrolna suma i paritet..............................................................................................48
8.1. Domai zadatak.....................................................................................................49
9. Konverzije brojeva iz internog oblika u znakovni oblik...............................................50
9.1. Konverzija celih dekadnih brojeva iz internog oblika u znakovni oblik................50
9.2. Opti sluaj konverzije razlomljenih brojeva iz internog oblika u znakovni oblik
.....................................................................................................................................51
9.3. Domai zadatak.....................................................................................................51
10. Konverzije brojeva iz znakovnog oblika u interni oblik.............................................52
10.1. Konverzija celih dekadnih brojeva iz znakovnog oblika u interni oblik..............52
10.2. Konverzija razlomljenih dekadnih brojeva iz znakovnog oblika u interni oblik..53
10.3. Opti sluaj konverzije razlomljenih brojeva iz znakovnog oblika u interni oblik
.....................................................................................................................................54
10.4. Domai zadaci.....................................................................................................54
11. Pregled korienih naredbi........................................................................................55
Dodatak A: Adresiranja procesora Intel 80386...............................................................64
Dodatak B: Prevoenje programa korak po korak..........................................................65
Dodatak C: Konverzije brojeva u binarnom znakovnom obliku.......................................66
Konverzija celih binarnih brojeva iz internog oblika u znakovni oblik........................66
Konverzija razlomljenih binarnih brojeva iz internog oblika u znakovni oblik............67
Konverzija razlomljenih binarnih brojeva iz znakovnog oblika u interni oblik............68
Dodatak D: Makroi...........................................................................................................70
Domai zadaci..............................................................................................................72
Dodatak E: Mainska normalizovana forma....................................................................73
Primer mainske normalizovane forme........................................................................73
Izdvajanje delova mainske normalizovane forme.......................................................73
Operacije sa brojevima u mainskoj normalizovanoj formi.........................................73
Sastavljanje broja u mainskoj normalizovanoj formi..................................................74
Domai zadatak............................................................................................................74
Dodatak F: Shell skriptovi...............................................................................................75
Jednostavni skriptovi................................................................................................75
Promenljive...............................................................................................................75
Upravljake strukture..............................................................................................76
Petlje.........................................................................................................................77
Specijalne shell promenljive.....................................................................................79
Korisni linkovi...........................................................................................................79
Dodatak G: ASCII tabela..................................................................................................80

Dodatak H: este greke prilikom programiranja..........................................................82


(Korisna) Literatura.........................................................................................................87

Uvod u korienje Linux operativnog sistema

Strana 1

1. Uvod u korienje Linux operativnog sistema


Linux [1] je jezgro operativnog sistema iji je razvoj zapoeo Linus Torvalds 1991. godine kao
studentUniverzitetauHelsinkiju.Poredjezgra,zafunkionisanjejednogoperativnogsistemaneophodni
su sistemski alati i bibliotetke. Linux jezgro se najee koristi zajedno sa alatima i bibliotekama iz
GNU projekta, pa se stoga ova kombinacija jednim imenom naziva GNU/Linux i u ovom trenutku
predstavlja moderan i popularan operativni sistem. esto se u javnosti umesto punog imena koristi
skraenoLinuxkadamoedaserazumedalisegovoriocelokupnomoperativnomsistemuilisamoo
njegovomjezgru.Udaljemtekstuemozatonajeekoristitiovakavskraeninaziv.
Postoji mnotvo razliitih verzija Linuxa. Za razliku od komercijalnih operativnih sistema koje
kontrolieodreenamatinakompanija,Linuxjeslobodanzadistribuiranjeikorienje.TakojeuLinux
svetusituacijapoprilinorazliitaodonogtosedeavausvetuvlasnikog(proprietary)softvera:brojne
kompanije,organizacijeipojedincisurazvilisvojesopstveneverzijeLinuxoperativnogsistema,kojese
jonazivajuidistribucije[3].PostojeverzijeLinuxakojesurazvijenenpr.zaraunarekojikontroliu
obimanmrenisaobraaj(npr.webserver),zatimnekekojesurazvijenezabezbedanradsapoverljivim
informacijama,itd.Nekeverzijesuosmiljenezarazliitehardverskeplatforme,kaotosunpr. ARM,
PowerPCiliSunUltraSPARC.

1.1. Izbor platforme za rad


NakursuizpredmetaArhitekturaraunaraemosebavitiarhitekturomPCplatformezasnovane
na Intel ovoj x86 familiji procesora, a kao sistemska osnova bie koriena distribucija Linux a
namenjenaovojplatformi.Razlozizaizborx86PCzanauradnuplatformuleipresvegaunjenojoptoj
dostupnosti.
Linuxjeizabranzaoperativnisistemnakomeekursbitizasnovanzbogtogatozadovoljavasve
zahtevekojenastavaizovogpredmetapodrazumeva,adrugirazlogjevezanzalicencupodkojomje
dostupan.LinuxjeobjavljenpodGPL(GeneralPublicLicense)licencom[2],toznai:

dajekorienjeslobodnounastaviivannje,

dajeizvornikdsvimadostupanidasemoeslobodnokoristiti,

dasekopijemoguslobodnodistribuirati,i

dasekdmoemenjatipopotrebiitakoizmenjendaljedistribuirati.

1.2. Prijavljivanje na sistem


Napoetkuradaseodkorisnikaoekujedaunesesvojekorisnikoimeilozinku,imeseprijavljuje
nasistem(tzv. logovanje).Trebaobratitipanjunatoda Linux pravirazlikuizmeumalihivelikih
slova(onjecasesensitive).Tako,naprimer,imenaperaiPeraoznaavajudvarazliitakorisnika.
Nakonuspenogprijavljivanja,operativnisistemjespremanzarad.
Nakrajuradaneophodnajeodjavasaoperativnogsistema.ToseobavljaizboromopcijeLogoutiz
sistemskogmenija.Odjavljivanjejeneophodno,najviezbogtogatojekorisnicimapodLinuxomobino
dozvoljenodarukujusamosvojimfajlovima.Akoseraunarostavibezodjavljivanja,nekomdrugomse
dajemogunostdapristupifajlovimaneodjavljenogkorisnika.

Uvod u korienje Linux operativnog sistema

Strana 2

1.3. Rukovanje shell-om


Komunikacijusakorisnikomputemkomandnelinijeomoguujeprogramkojisezoveshell,ikoji
imauloguinterpreterakomandi.ULinuxdistribucijamanajeekorienishelljebash(BourneAgain
Shell),kojijeobinopodrazumevani shellikojieseiovdekoristiti.Zainteraktivniradsashellomje
neophodanterminal,odnosnoterminalemulator.Terminalemulatorsepokreetakotosekliknena
njegovu ikonicu koja ima oblik terminala i koja se obino nalazi na jednom od ekranskih panela.
Pokretanjeterminalemulatoraautomatskidovodidopokretanjabasha.
Nakon pokretanja basha, ispisuje se njegov odziv, odnosno prompt. Podrazumevani izgled
promptaje:
user@computer:~/download$
Re user oznaavakorisnikoime, computer jenazivraunaranakomejekorisnikprijavljen,
~/downloadjeputanjadotekuegdirektorijuma,a$jeoznakadajeprijavljenobiankorisnik.Kadaje
promptispisannaekranu,bashjespremandaprihvatikomandu.
Vanojeuoitida bash pravirazlikuizmeumalihivelikihslova. bash pamtikomandekojeje
korisnikranijekucao(tzv. istorijakomandi).Brojzapamenihkomandisemoepodesiti.Sveranije
zapamenekomandesemogupregledatipritiskomnakursorsketastere i .
Ekranterminalasebrzopopuniitadasestarisadrajgubizbogpomeranjalinijatekstanagore.
Ukoliko je potrebno videti prethodne sadraje ekrana, to se moe postii pritiskom na Shift+PgUp,
odnosnoShift+PgDn.Alternativno,mogusekoristitiiShift+,odnosnoShift+.
Jojednakorisnamogunost bashajekompletiranjenaziva.Naime,dovoljnojeotkucatiprvih
nekolikoslovanekekomandeipritisnutitasterTab.Nakontoga,ukolikopostojisamojednamogunost
zakomandu,onaebitiispisana,aakopostojivie,tadaebitiispisanealternative,pakorisnikmoe
odabrati ta mu treba. Na primer, ako se otkuca hi, pa se pritisne Tab, na ekranu e se ispisati
nekolikokomandikojepoinjuslovimahi.Ukolikoseotkucaislovos,nakonpritiskana Tabesena
ekranu ispisati history, poto je to jedina komanda koja poinje sa his. Pored toga to se moe
koristitizanazivekomandiiprograma,kompletiranjenazivaradiisanazivimadirektorijumaifajlova.
Kada se kuca naziv komande (prva re u liniji), pretrauju se podrazumevani direktorijumi (videti
sledeepoglavlje),dokseprilikomkucanjaparametarakomandipretraujetekuidirektorijum.
Postojivienainadasezavrirad basha.Jedanodnajsigurnijihjezadavanjekomande exit,a
jedanodnajkraihjepritisaknactrl+dupraznojkomandnojliniji.

1.4. Organizacija direktorijuma


OsnovnidirektorijumuLinuxovomfajlsistemujeroot,ilikorenskidirektorijumioznaavasesa
/(slash).Svidrugidirektorijumisenalazeispodnjega.Oddirektorijumakojisenalazeurootu,za
obine korisnike je znaajno nekoliko njih. Direktorijum etc sadri razne konfiguracione fajlove,
veinomutekstualnomobliku.Direktorijumbinsadriosnovnesistemskeprograme.Direktorijumusr
sadri korisnike programe i sve to je potrebno za njihovo korienje (slike, dokumentacija, razni
pomoniikonfiguracionifajlovi).
Zarazlikuodnpr. Windowsa,kod Linuxanepostojeposebneoznakediskureaja(A:, C:,itd.).
Direktorijum/mnt(unovijimdistribucijamadirektorijum/media)usebisadriputanjedoureajakoji
senalazeusistemu,kaotosu floppy diskovi, CD ROM,harddiskovi, flash memorije...Ovojesamo
najeekorienidirektorijumzauvezivanjeureaja(mountovanje),potoseureajimogupovezatina
bilokojemestouhijerarhijidirektorijuma.

Uvod u korienje Linux operativnog sistema

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

1.5. Osnovne komande bash-a


Kretanje po stablu direktorijuma i listanje fajlova
Komandakojasluizakretanjepostabludirektorijumajecd(changedirectory).Ukolikoseotkuca
samo cd bezparametara, home direktorijumkorisnikapostajetekui.Kaoparametarsemoenavesti
relativna ili apsolutna putanja do direktorijuma u koji se eli prei. Na primer, ako je tekui
direktorijum
/home/pera/prvi/
aelisepreiu
/home/pera/drugi/
moesekucatiapsolutnaputanja
cd /home/pera/drugi/
ilirelativna
cd ../drugi/
Trebanapomenutidaseusvakomtrenutkukucanjaputanjemoekoristitikompletiranjenaziva
pomoutasteraTab,imesevremekucanjamoeznatnoskratiti.
Ukolikojepotrebnosaznatipunuputanjudotekuegdirektorijuma,tosemoepostiikucanjem
komandepwd(printworkingdirectory).
Prikazsadrajatekuegdirektorijuma(ilidirektorijumakojisenavedekaoparametar)omoguuje
komandals(list).Ovakomandaimapunoopciija,odkojiheovebitipomenutesamoneke.Opcija-a
omoguujedaseprikauiskrivenifajloviidirektorijumikojisestandardnoneprikazuju(njihovaimena
poinju takom), a opcija -l (malo slovo L) omoguuje detaljniji prikaz podataka o fajlovima i
direktorijumima.Onotoeprikazatikomandalssemoedodatnofiltriratiupotrebomdokerznakova:

Uvod u korienje Linux operativnog sistema


Doker

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.

Rukovanje fajlovima i direktorijumima


Nazivifajlova pod Linuxom se mogusastojati od slova(velikih imalih), brojeva i specijalnih
znakova,kaotosu-,_ili..Iakoseu nazivumogunaiiostalispecijalniznakovi,kaotosu
razmak,;,&,?,|,*,[,],<i>.Ipakupotrebaovihznakovasenepreporuuje,jerje
korienjefajlovasaovakvimnazivimaoteano(npr.kadajepotrebnounetinjihovoimenatastaturi),ili
aknemoguena nekimdrugimsistemima.Ukolikosetakviznakoviipakkoristeunazivu, tadase
nazivmorastavitiunutarznakovanavoda,ili,alternativno,ispredspecijalnogznakatrebastaviti\
(backslash).Razlogzaovojetomnogispecijalniznaciimajuposebnoznaenjeiupotrebu(nekisuve
navedeni, ao nekima ebiti rei kasnije), astavljanjem znaka \ ispred specijalnog znaka se kae
sistemudagatretirakaoobianznak.
Jednaodosnovnihoperacijapriradusafajlovimajenjihovokopiranje.Tosepostiekomandomcp
(copy).Osnovnioblikovekomandeje:
cp ta_se_kopira gde_se_kopira
Ukolikosekopirasamojedanfajl,tadaseumestoparametragde_se_kopiramoenavestidrugo
imezafajl,ausuprotnommorabitinazivdirektorijuma.Naprimer,akotrebakopiratisvefajlovesa
ekstenzijom.xyzizhomedirektorijumautekuidirektorijum,komandabibila:
cp ~/*.xyz ./
Ukolikotrebaobrisatijedaniliviefajlova,koristisekomandarm(remove).Naprimer,akotreba
obrisatisvefajlovekojipoinjusaaaa,komandabibila:
rm aaa*

Uvod u korienje Linux operativnog sistema

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

42713 2009-04-15 15:20 fajl.txt

Komanda chmod slui za menjanje atributa fajla. Na primer, ako korisniku treba dati pravo
izvravanjanekogfajla,tosemoepostiisa:
chmod u+x naziv_fajla

Prikaz sadraja fajla i pretraivanje


Za Linux sepodrazumevadaterminstandardniulazoznaavaureajsakogastiupodaci,ada
termin standardni izlaz oznaava ureaj na kome se podaci prikazuju. Veina komandi, ukoliko se
drugaijenenavede,kaostandardniulazkoristispecijalnifajlkojiodgovaratastaturi,akaostandardni
izlazkoristispecijalnifajlkojiodgovaraekranu.Standardniulaziizlazsemogupreusmeritinadruge
fajlove.
Sadraj tekstualnih fajlova se na ekranu moe prikazati pomou nekoliko komandi. Prva je
komanda cat (concatenate)ijajeosnovnanamenadaspojiviefajlovaujedan.Kaoizlaz, cat koristi
standardniizlaz,paakosenapiecat naziv_fajla,dobieseispissadrajafajlanaekran.Ukolikoje
tekstiolevei,samoepreletetiprekoekrana.
Drugakomanda, less,omoguavadasetekstlistauobasmerakorienjemkursorskihtastera
(izlazakjepomoutasteraq,apretragapomou/,?,niShift+n,kaokodmankomande).
esto je potrebno u tekstualnom fajlu nai red u kome se nalazi neki tekst, naroito kada su
programiupitanju.Komandakojaradiupravotojegrep.Optioblikkomandegrepje:
grep sta_se_trazi gde_se_trazi
Naprimer,akotrebanaisvelinijeufajlovima ispis1.c i ispis2.c kojesadrereprintf,
komandabibila:
grep 'printf' ispis[1-2].c
Ukolikosedodaopcija-i,tadaesezanemaritirazlikaizmeuvelikihimalihslova.Akosenaziv
fajlanenavede,tadasepodrazumevastandardniulaz.

Uvod u korienje Linux operativnog sistema

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.

Preusmeravanje standardnog ulaza, standardnog izlaza i pajpovi


Kadajepotrebnodastandardniulaznebudetastatura,odnosnodastandardniizlaznebudeekran,
nego, na primer, neki fajl ili tampa, tada se koristi preusmeravanje. Simbol koji se koristi za
preusmeravanestandardnogulazaje<,azapreusmeravanjestandardnogizlazaje>,odnosno>>.
Onotosedalekoeekoristijepreusmeravanjeizlaza.Naprimer,udirektorijumu~/music/senalazi
punofajlovasamuzikimsadrajemiakojepotrebnonapravititekstualnispisakfajlovafajlovakojise
tamonalaze,tosemoedobitisa:
ls ~/music/ > spisak.txt
Ovime se u tekuem direktorijumu formira tekstualni fajl spisak.txt u kome se nalazi izlaz
komande ls ~/music/.Sadabibilolepounastalispisakdodatidatum ivremenastanka.Datum i
vrememoemodobitiuzpomokomandedate.Komanda
date > spisak.txt
biprebrisalaprethodnisadrajiupisalanovi,tonijeonotonamtreba.Dabiprethodnisadraj
ostao,adasenovidodaizanjega,koristisesimbol>>:
date >> spisak.txt
Jojednamogunostkojapostojijedasestandardniizlazjednekomandedirektnopreusmerina
standardniulazdrugekomande.Ovosenazivapajp(pipe)ioznaavasesa|.Koristeipajp,komanda
grep semoekoristitiizafiltriranjeizlazadrugihkomandi.Naprimer,komanda set otkucanabez
parametara prikazuje spisak svihpromenljivih okruenja injihovihvrednosti. Ukolikotreba izdvojiti
podatakonekojposebnojpromenljivoj,recimoPATH,moesekoristiti
set|grep PATH
Jedankomplikovanijiprimerpreusmeravanjabimogaoglasitiovako:trebanapravitispisaksvih
tekstualnihfajlovaiznekogdirektorijumaisvihnjegovihpoddirektorijuma,alitrebaizostavitionekojiu
svomnazivuimajureproba.Traenispisaksemoedobiti,naprimer,sa:
ls -R ~/tekstovi/|grep -i '.txt'|grep -v -i 'proba' >spisak.txt
Opcija R komande ls znai daselista sadraj direktorijumaisvihnjegovihpoddirektorijuma.
Opcija-vkomandegrepznaidaseizdvajajusvelinijekojenesadrezadature.Gornjekomanderade
sledee:prvokomanda ls izlistasvefajloveuzadatomdirektorijumuinjegovimpoddirektorijumima;
izlazkomandelssealjeprvojgrepkomandikojaizdvajasamoonelinijeukojimasenalazitekst.txt;
izlazprvegrepkomandesealjedrugojgrepkomandikojaizbacujesvelinijeukojimasepominjere
proba,azatimsetakopreraenispisakupisujeufajlspisak.txt.

Uvod u korienje Linux operativnog sistema

Strana 7

Izvravanje programa u pozadini


Ukolikosenakrajukomandestaviznak&,komandaeseizvravatiupozadini.Ovime shell i
daljeostajedostupanzainteraktivnirad.

1.6. Programi za rukovanje fajlovima


Pored rukovanja fajlovima iz komandne linije, mogue je baratanje fajlovima i iz grafikog
okruenja,korienjemmia.Postojidostaprogramazatusvrhu,akojijepodrazumevanoinstaliran
zavisioddistribucijedodistribucije.Naprimer,uzgrafikookruenjeGNOMEstieprogramNautilus,
dok uz KDE stie Konqueror (odnosno Dolphin uz KDE4) koji se moe koristiti kako za rukovanje
fajlovima,takoizapristupinternetu.

Slika 1: Nautilus

Slika 2: Midnight Commander

Drugavrstaprogramajebazirananapostojanjudvazasebnadelaprozorapri emusvakiodnjih
nezavisnoprikazujesadrajnekogoddirektorijuma.Fajlovisemogukopirati,pomeratiisl.izmeuova
dvadelaprozoraodnosnodirektorijuma.Uovugrupuspada MidnightCommander kojisestandardno
isporuujeuskorosvimdistribucijamaikojiseizvravautekstualnomreimu.Postojivieprograma
tipaMidnightCommanderakojiseizvravajuugrafikomreimu,anekiodnjihsuKrusader,Worker,
DoubleCommander,itd.

1.7. Tekst editori


Najee korieni tekst editori u Linux okruenju su vim/gwim i emacs. Pored njih postoji i
mnotvodrugihteksteditora,kaotosunano,kwrite,nedit,gedit,xedit...
PreporuenieditorizakursizArhitektureraunarasu kwrite za KDE odnosno gedit za Gnome
okruenje. Oba se izvravaju u grafikom okruenju i podravaju standardne (Windows) preice sa
tastaturezaradsatekstom,takodakorisnicinaviknutinaovajnainradamogulakodasesnau.

1.8. Grafiki programi


toseporogramazacrtanjetie,zajednostavnijebitmapiranesliiceseestokoristinpr.gpaintili
MyPaint,doksezaozbiljnijuobraduslikepreporuujerecimogimp.Zaobraduvektorskihcrteamogu
da se koriste inkscape ili karbon. Program pod nazivom dia je namenjen crtanju dijagrama, dok je
BRLCADnamenjenzapodrkuraunarskipomognutomdizajnu(ComputerAidedDesign).

Uvod u korienje Linux operativnog sistema

Strana 8

1.9. Korisni linkovi


VieoLinuxusemoenainastranicamaTheLinuxDocumentationProject[4],doksedetaljnije
uputstvo za bash moe nai nanjegovoj zvaninoj stranici [5]. Takoe, uokviru ovog praktikuma, u
dodatkuF,semoenaiuvodupisanjeshellskriptova.
1. www.linux.org,www.kernel.org
2. www.gnu.org/licenses/licenses.html
3. www.ubuntu.com,www.debian.org,www.opensuse.org,www.knoppix.org,www.redhat.com,
distrowatch.com
4. www.tldp.org
5. www.gnu.org/software/bash/bash.html
6. www.linuxlinks.com

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.

2.2. Neophodno predznanje za praenje vebi


Da bi se vebe iz Arhitekture raunara mogle uspeno pratiti, neophodno je poznavanje
programskogjezika C,potoseprikazi mnogihalgoritamaupraktikumu,kaoiobjanjenjapojedinih
delovaasemblerskogkoda,zasnivajunaCprogramima.Uneophodnaznanjavezanazaprogramskijezik
Cspadaju:

definisanjeideklarisanjefunkcija

definisanjeikorienjekonstanti

prenosparametarafunkcijipovrednostiipoadresi

osnovneoperacijeiradsanizovima(pristupelementimaniza,pretraivanjeniza,sortiranje,rad
sastringovima)

osnovne operacije i rad sa pokazivaima (pokazivaka aritmetika, pristup nizovima pomou


pokazivaa)

poznavanjeosnovnihCiskaza(if,for,do,while,return,break)

2.3. Programski model procesora Intel 80386


Intel80386(udaljemtekstu80386)je32bitnimikroprocesorCISCarhitektureipripadafamiliji
procesorax86.Ovajprocesorspadaulittleendianprocesore.Unazadjekompatibilansaprocesorimaiz
familijex86,pausebisadri8bitne,16bitnei32bitneregistre(slika3).
Registri opte namene (eax, ebx, ...) su specifini po tome to se kod njih moe pristupiti
njihovommanjeznaajnomdelukaoposebnom16bitnomregistru.Tako,naprimer,manjeznaajnih16
bitaregistraeaxpredstavlja16bitniregistarax.Dalje,kodregistaraax,bx,cxidxsemoeposebno

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

Registri opte namene


15

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

Slika 3: Osnovni registri procesora Intel 80386

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.

2.4. AT&T sintaksa


Za familiju procesora x86 postoje dve sintakse pisanja naredbi. Jedna je Intel ova, a druga je
AT&T.OsnovnekarakteristikeAT&Tsintaksesusledee:

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.

2.5. Neposredno i registarsko adresiranje


Procesor80386podravavieadresiranja(kompletanspisaksemoenaiudodatkuA).Naprimer,
kodnaredbekojavripostavljanjeregistraaxnavrednost10:
movw $10, %ax
prvioperand($10)jenavedenkorienjemneposrednogadresiranja,toznaidaonupravopredstavlja
vrednostsakojomseobavljaoperacija.Drugioperand(%ax)jeprimerregistarskogadresiranja,toznai
daovajoperandpredstavljaregistarnadkojimseobavljaoperacija.

2.6. Izgled asemblerskog programa


Na poetku asemblerskih programa, sa kakvima e se raditi u toku ovog kursa, treba da stoji
sledee:
#program radi to i to ...
#autor: Pera Peric, E1234
.section .data
.section .text
.globl main
main:
Uprvihparlinijauokvirukomentarasenalazikratakopisprogramaiparosnovnihpodatakao
fajlu(autor,datumislino).Trebaobratitipanjunatodasenepravekomentariustilu#1234(broj
koji se nalazi odmah nakon oznake #), poto takve oznake asembler koristi interno prilikom
asembliranjaprograma.Sledealinija(.section .data)predstavlja direktivu (ili pseudonaredbu)
asembleru i oznaava poetak segmenta podataka. Nakon nje sledi direktiva koja oznaava poetak
segmentanaredbi(.section .text).Uokvirusegmentanaredbisedefinieulaznanaredbaprograma
kaospoljanjareferenca(.globl)kojamorabitiobeleenalabelommain.Nakrajuprogramatrebadase
nalazi:
kraj:

movl $1, %eax


movl $0, %ebx
int $0x80

Ovedvelinijeomoguavajudaseprogramzavrinaregularannain,pozivomsistemskefunkcije
zazavretakprograma(osistemskimpozivimaeviereiuglaviError:Referencesourcenotfound).Da
bisevidelastanjaregistaraprenegoseprogramzavri,korisnojepostavitiprekidnutakunaprvuod
dvenaredbe.
Napomena:veinaprogramaupraktikumujedatabezovihpodrazumevanihlinija.

Asemblerski programi

Strana 13

2.7. Asembler (kompajler)


AsemblerskiprogramseprvopieteksteditoromisnimaufajlsaekstenzijomS (veliko S).Za
prevoenjeasemblerskogprogramauizvrniprogramesekoristitigcc(GNUCompilerCollection):
gcc -m32 -g -o primer primer.S
Opcija -g omoguavadibagiranjeprograma,dokseopcijom -o zadajenazivizvrnogprograma.
Ukoliko se opcija -o izostavi, izvrni program e imati naziv a.out. Prva navedena opcija, -m32, je
neophodna za prevoenje 32bitnih programa na 64bitnim sistemima, poto su svi programi
predstavljeniuovomPraktikumu32bitni.
Prevoenje asemblerskog programa u izvrni oblik praktino obuhvata tri koraka: makro
pretprocesiranje, prevoenje asemblerskog programa u objektni fajl i linkovanje objektnog fajla sa
programskimkodomkojiomoguavapokretanjeprogramanaoperativnomsistemu.Svakiodkorakase
moeodraditiizasebno(dodatakB),ukolikojepotrebno,meutim,toseneekoristitiuokviruovog
kursa.

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

Slika 4: DDD dibager

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:

kursorsepostavina poetaklinije,pasemiemkliknenadugme Break (ukolikoutojlinijive


postojitakaprekida,dugmemenjanazivuClear,toznaiuklanjanjetakeprekida)

kliknesedesnimdugmetommianapoetaklinije,paseizmenijaodabereSetBreakpoint

dvoklikmiemnapoetaklinije

Takaprekidasemoeiskljuitiiliprekodugmeta Clear,iliizboromopcije DeleteBreakpoint iz


menijakojisedobijadesnimklikommianatakuprekida.
Prozor(2)sadriviekomandikojesekoristeprilikomizvravanjaprograma,aodkoristiebiti
sledee:

Runpokreeprogramodpoetka.Izvravanjesezaustavljakadsenaienatakuprekida.

Stepi i Nexti izvravajutekuunaredbuinakontogaponovozaustavljajuizvravanjeprograma.


Koristesezaizvravanjeprogramakorakpokorak.Razlikaizmeuovedvekomandeseogledakod

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

2.9. Primer: izraunavanje NZD


Naslici 5 prikazanje C programzaizraunavanjenajveegzajednikogdeliocazadvaprirodna
broja.
a = 12;
b = 8;
while (a != b)
if a > b
a -= b;
else
b -= a;
Slika 5: C program za izraunavanje NZD
Predstavljenkaonizkoraka,algoritambiglasio:

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

Varijanta 1 - Doslovan prevod algoritma u asembler


Koristesesledeenaredbe:

mov Smetanje izvornog operanda u odredini. U ovom programu se koriste registarski i


neposrednioperandi.Naprimer,movl 12, %eaxesmestitibroj12(neposrednioperand,kodiran
kaodeonaredbe)uregistareax.Naredbamovneutienaindikatore.

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.

sub Oduzimanje izvornog operanda od odredinog. Rezultat se smeta u odredite. Prilikom


oduzimanjaseneuzimauobzirvrednostindikatorac.Naredbasubmenjaindikatore.
asembler
objanjenje
C program
--------------------------------------------------------------movl $12,%eax
#12->eax
a = 12;
movl $8,%ebx
#8->ebx
b = 8;
uporedi:
#
cmpl %ebx,%eax
#
while (a != b)
je kraj
#skok ako eax=ebx
cmpl %ebx,%eax
#
if (a > b)
ja vece
#skok ako eax>ebx
subl %eax,%ebx
#ebx-eax->ebx
a = a b;
jmp uporedi
#
vece:
#
else
subl %ebx,%eax
#eax-ebx->eax
b = b a;
jmp uporedi
#
kraj:
movl $1, %eax
movl $0, %ebx
int $0x80

Varijanta 2 Modifikacija varijante 1


Uovojvarijantiseuzimauobzirinjenicadanaredbeskokaneutiunaindikatore,pajedrugo
poreenjenepotrebno.

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

Varijanta 3 - Optimizovana verzija


Zaalgoritamnijebitnodaliseveavrednostnalaziu eax ili ebx (jersetoproveravausvakoj
iteraciji).Zbogtogaseusluajudajeebxveeodeax,sadrajovihregistaramoemeusobnozameniti
(kaorezultatzamene,eaxebitiveeodebx),izatimuraditioduzimanjeebxodeax.
Zamenusadrajaradinaredba xchg. Ovdesekoristeregistarskioperandi.Naredbaneutiena
indikatore.
movl $12,%eax
movl $8,%ebx
uporedi:
cmpl %ebx,%eax
je kraj
ja vece
xchgl %eax,%ebx
vece:
subl %ebx,%eax
jmp uporedi
kraj:
movl $1, %eax
movl $0, %ebx
int $0x80

#eax<->ebx

2.10. Domai zadaci


1. Napisati asemblerski program koji esabrati prvih n prirodnihbrojeva.Vrednost n senalaziu
registruecx,dokzbirtrebadabudeuregistrueax.
2. Napisatiprogramkojiporedivrednostiuregistrimaebxiecx,inaosnovurezultataporeenjau
regaistareaxstavlja:
1
ako ebx>ecx
0
ako ebx=ecx
2
ako ebx<ecx

Rukovanje celim brojevima

Strana 18

3. Rukovanje celim brojevima


3.1. Neoznaeni i oznaeni brojevi
Procesor80386omoguavarukovanjeneoznaenimioznaenimcelimbrojevima.Daliesebroju
nekom registru smatrati zaoznaeni ili neoznaeni zavisiiskljuivoodprogramainainanakojise
koriste indikatori. Veliina operanada kojima procesorske naredbe mogu direktno rukovati obino je
ograniena kapacitetom mainskih rei, tj. registara. Za operande u toj veliini se kae da su u
jednostrukojpreciznosti.Neoznaenibrojujednostrukojpreciznostikod80386procesoramoeimati
vrednostiizopsegaod0do2321.Oznaenibrojevisepredstavljajuukomplement2predstavi,toznai
dajeopsegoznaenihbrojevaujednostrukojpreciznostikod80386od231do2311.
Ako program rukuje sa neoznaenim brojevima, tada indikator c (carry), ukazuje na prenos
(izlazak van opsega) kod operacija sa neoznaenim brojevima. Kada program rukuje oznaenim
brojevima,tadaindikatoro(overflow)ukazujenaizlazakvanopsega.

3.2. Definisanje numerikih podataka


Podacisesmetajuusegmentpodataka.Zasmetanjerazliitihvrstapodatakasekoristerazliite
direktive.Osnovnedirektivezacelebrojevesuprikazaneusledeemprimeru:
.section .data
bajt:
.byte 0xff, 100
rec:
.word 0xee56, 2, 50
duga_rec:
.long 0xabcd1234

sadraj u memoriji u bajtovima

0xff 0x64

0x56 0xee 0x02 0x00 0x32 0x00

0x34 0x12 0xcd 0xab

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

#0xabcd1234 -> eax


#sadraj eax -> rec
#adresa labele bajt -> eax
#0x64ff -> ax
#0x320002 -> eax
#0x34 -> al
#0xee5664ff -> 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

#const2 ima vrednost 9


#const3 ima vrednost 18
#14 -> eax
#72 -> ebx
#GREKA ne postoji u x86 arhitekturi

Rukovanje celim brojevima

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

#greka u oba operanda postoji pristupanje memoriji

Treba obratiti panju na korienje konstanti i labela u programima. Ispravne i neispravne


situacijeinjihovoznaenjesudateusledeemprimeru:
a: .long 10
b = 15
...
movl $a, %eax
movl a, %eax
movl $b, %eax
movl b, %eax

#
#
#
#

adresa promenljive a u %eax


vrednost promenljive a u %eax
vrednost konstante b u %eax
greka pokuaj pristupa lokaciji sa adresom 15

3.3. Prikaz promenljivih u dibageru


32bitnepromenljivesemoguprikazatitakotoseugornjulinijupostavinjihovoime(klikomna
promenljivu,ilirunimupisomimena),azatimsekliknenadugmeDisplay.
8bitnepromenljivesemoguprikazatipostavljanjemnjihovogimenaugornjulinijuiklikomna
odgovarajuedugmenapaneluzaprikazpromenljivih:ByHexevrednostprikazatikaoheksadecimalnu,
ByDeckaooznaenudekadnu,aByUnskaoneoznaenudekadnu.Analogno,za16bitnepromenljivese
koristeWrHex,WrDeciWrUns.
Napomena:ovakoprikazane8bitnei16bitnevrednostisenemogumenjati.
Promena32bitnihpromenljivihseostvarujepostavljanjemnjihovogimenaugornjulinijuiklikom
nadugmeSet.8bitnei16bitnepromenljivesenemogumenjatinaovajnain.
Ukolikojepotrebnoprikazatisadrajmemorijekojijeodreennekimtipomadresiranja,kaona
primer:
movw nizrec(,%ecx,2), %ax
tadatrebaizraz nizrec(,%ecx,2) postavitiugornjuliniju(naprimer,obeleitigamiem),azatim
odabratiopcijuMemoryizmenijaData.Udijalogukojieseotvorititrebaodabratibrojelemenatakoji
se eli prikazati, brojni sistem u kome se ele prikazati vrednosti i veliinu jednog elementa (u
poslednjempoljuesenaiizrazkojiodreujememorijskulokaciju).Naprimer,ukolikotrebaprikazati
jedanpodataknakogaukazujegornjiizraz,uprvopoljebiseupisalo1,udrugombiseodabraobrojni
sistem,naprimerhex,autreembiseodabralaopcijahalfwords(2)kojaoznaavapodatkeveliine2
bajta, poto naredba movw radi sa 2bajtnim vrednostima. Nakon klika na dugme Display, traeni
podatakbiseprikazaoudeluzaprikazpodataka.

Rukovanje celim brojevima

Strana 20

3.4. Mnoenje i deljenje pomou sabiranja i oduzimanja


Mnoenjepomousabiranjajetrivijalnaoperacija.Ukolikotrebapomnoitidvabrojaaib,prvose
rezultatpostavinanulu,azatimsebputanarezultatdodavrednosta.Deljenjepomouoduzimanjaje
slino,trebaizbrojatikolikoputasebrojbmoeoduzetiodbrojaa:
R =
a =
b =
for

0;
3;
8;
(;a > 0;a--)
r += b;

r = 0;
a = 8;
b = 3;
while (a >= b) {
a -= b;
r++;
}
(b)

(a)

Slika 6: Mnoenje pomou sabiranja (a) i deljenje pomou oduzimanja (b)

3.5. Viestruka preciznost


Prilikom radauviestrukoj preciznosti operacijeseizvodeuviekoraka, odkojihsvaki rukuje
delovimaoperanada.Kod80386,jednostrukapreciznostodgovarakapaciteturegistaraoptenamene(32
bita),apostojeinaredbekojeradesa8bitnimi16bitnimvrednostima,kaoinekolikonjihkojekao
operandilirezultatkoristeregistarskiparedx:eax(ovanotacijaznaidaregistaredxsadribitevee,
aeax bitemanjeteine). 80386 spadaulittleendianprocesore,toznaidaseumemorijinalaziprvo
najnii,aposleviidelovirei.
Brojeviudvostrukojpreciznostiseusekcijipodatakamoguzadatinavienaina.Jedanbibioda
seniiiviideozasebno,jedanzadrugim,naveduuokviru.longdirektive,adrugijekorienje.quad
direktive:
a1: .long 20,10
a2: .quad 0xA00000014

#vrednost 4294967298010 = A0000001416


#vrednost 4294967298010 = A0000001416

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.

Sabiranje u dvostrukoj preciznosti


80386 naredbazasabiranjeje add. Onasabiraoperandeirezultatsmetauodredinioperand,
postavljajuipritomindikatorenavrednostikojeodgovarajurezultatu.Jojednanaredbazasabiranjeje
adc, koja pored operanadauzimauobzirivrednost indikatora c,koristei jekao poetni prenos na
najniojpoziciji.Sabiranjeuviestrukojpreciznostiseraditakotosenajmanjeznaajnereioperanada
saberu pomou add, dok se znaajnije rei sabiraju pomou adc, koristei na taj nain prenose iz
prethodnihsabiranja.Naredbaincpoveavaodredinioperandzajedan(meutim,neutienaindikator
c,patrebabitiobazrivkodkorienjaovenaredbezaraduviestrukojpreciznosti).

Rukovanje celim brojevima

Strana 21

Sabiranje neoznaenih brojeva


Operandi se u ovom primeru ne nalaze u registrima, ve su zapisani u odreene memorijske
lokacije. Naredbe koje ih upotrebljavaju pristupaju im koristei memorijsko ili direktno adresiranje.
Rezultatebitiuregistarskomparuedx:eax.
Prenos kod sabiranjaniih rei uzee se u obzirprilikom sabiranja viih. Prenos kod konanog
sabiranjauovomsluajuznaiizlazakvanopsega.Prematome,stanjeindikatoracposlesvihoperacija
moeseiskoristitikaoindikatorgreke.Ovdeesetoupotrebitizapostavljanjepromenljivegreska,uz
pomonaredbeuslovnogskokajnc(jumpifnocarry),kojojjeuslovzagrananjec=0.
a: .quad 0x8000
b: .long 0x8001,1
greska: .byte 0
...
movb $0, greska
movl a, %eax
addl b, %eax
movl a+4, %edx
adcl b+4, %edx
jnc kraj
incb greska
kraj:
movl $1, %eax
movl $0, %ebx
int $0x80

# a = 0x8000 (0x000080001)
# b = 0x100080001

Podrazumevasedaseprvideokdanalaziudatasekciji,adrugiutextsekciji.

Sabiranje oznaenih brojeva


Postupakjeveomaslianprethodnom:
a: .quad 0x8000
# a = 0x8000 (0x00008000)
b: .long 0x8001,1
# b = 0x100080001
greska:
.byte 0
...
movb $0, greska
movl a, %eax
addl b, %eax
movl a+4, %edx
adcl b+4, %edx
jno kraj
incb greska
kraj:
movl $1, %eax
movl $0, %ebx
int $0x80
Razlikajeutometosezadetekcijuizlaskavanopsegakoristiindikator o umestoindikatora c.
Shodnotome,upotrebljenajenaredbajno(jumpifnooverflow).
Postupakzaoduzimanjeudvostrukojpreciznostijesliansabiranju.Zaoduzimanjeniihdelovase
koristinaredbasub,doksezaoduzimanjeviihkoristisbb(subtractionwithborrow),kojaradiistotoi
sub,samotouobziruzimaivrednostindikatorac(dodajeganavrednostizvornogoperanda).Naredba
kojavriumanjivanjeoprandaza1jedec(istokaoinaredbainc,neutienaindikatorc).

3.6. Numeriki tipovi podataka na C-u i asembleru


SledeatabelailustrujeosnovnetipovepodatakaprogramskogjezikaCiodgovarajuedirektiveza
definisanjetipovapodatakanaasembleru.Utabelijetakoedatakolonasanazivomtipapodatkau
DDDdibageru.

Rukovanje celim brojevima


Veliina(biti)

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

unsigned short int

.word

halfwords

.long

words

unsigned int

.long

words

long long

.quad

giants

unsigned long long

.quad

giants

2147483648do2147483647 int

32

Asembler

Tabela 2: Numeriki tipovi podataka na C-u i asembleru

3.7. Domai zadatak


1. Napisati asemblerski program zaporeenjedvaoznaenabroja(a i b)udvostrukojpreciznosti.
Rezultatradaprogramatrebadasenaeuregistrueax,ito:
0 akojea=b
-1 akojea<b
1 akojea>b

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

# adresa niza u %eax


# raunanje adrese elementa sa indeksom 2
# 7 u %ebx

Ovdejeregistar eax iskorienkaoindirektniregistar.Adresakojoj esepristupitipredstavlja


sadrajregistraeax.
Ovadvaadresiranjasemoguiiskombinovati:
movl $niz, %ecx
movl $2, %eax
movl (%ecx, %eax, 4), %ebx

# adresa niza u %ecx


# indeks u %eax
# 7 u %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.

4.2. Nizovi brojeva


Nizovibrojevaebitipredstavljeninaprimeruprogramazasumiranjeelemenataniza.Naslici 7je
prikazanCprogramzasumiranjeelemenatanizaijisuelementioznaenicelibrojevi:

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

Varijanta 1 indeksno adresiranje


NELEM
niz:
suma:

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

Varijanta 2 indirektno adresiranje


Sekcijapodatakajeistakaouprethodnojvarijnti,paseneprikazuje:
main:
movl $niz, %esi
movl $0, %eax

#registar za indirektno adresiranje


#eax se koristi za raunanje sume

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

Varijanta 3 indirektno + indeksno adresiranje + optimizacija


Sekcijapodatakajeistakaouprvojvarijnti,paseneprikazuje:

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

Varijanta 4 indirektno + indeksno adresiranje + loop naredba


Sekcijapodatakajeistakaouprvojvarijnti,paseneprikazuje:
main:
movl $niz, %esi
movl $NELEM, %ecx
movl $0, %eax

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

Drugi primer brojanje dana sa odreenom temperaturom


Drugiprimersebavinizombrojevakojipredstavljajuzabeleenetemperatureutokujednegodine.
Zadatakjedaseuzadatompodintervaluprebrojedanikodkojihjetemperaturaunutarzadatogopsega.
Na slici 8 prikazan je C program za reavanje ovog problema. Duina niza dani odreena je
konstantomBROJ_DANA.Indeksiranjenizadaniradisesaosnovomnula(prvielementnizaimaindeks
nula),kaotojeuobiajenonaCu.Algoritamispitujevalidnostulaznihpodataka:

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

Slika 9: C program za izbacivanje razmaka sa poetka i kraja stringa


Izbacivanjeznakovarazmakasakrajastringasemoeobavitijednostavnimubacivanjemoznake
kraja stringa na odgovarajue mesto. Izbacivanje znakova razmaka sa poetka stringa podrazumeva
pomeranjesadrajastringazaodreenibrojpozicijakapoetku.

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

4.4. Naredbe za mnoenje i deljenje


Naredbazamnoenjeneoznaenihoperanadaje mul.Uzavisnostiodveliineoperanda,naredba
mulradisledee(operandmoebitipromenljiva/memorijskalokacijailiregistar):
mulb operand
mulw operand
mull operand

#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

#ax/operand -> al, ostatak -> ah


#dx:ax/operand -> ax, ostatak -> dx
#edx:eax/operand -> eax, ostatak -> edx

Izvravanjenaredbedivmoedovestidopojaveizuzetka.Ovosemoedesitiudvasluaja:

ukolikojevrednostoperandajednakanuli

ukolikojedobijenavrednostprevelikadastaneuodredite

Postojeinaredbekojerademnoenje(imul)ideljenje(idiv)oznaenihbrojeva,adetaljionjimase
mogunaiuglavi11(Pregledkorienihnaredbi).

Nizovi

Strana 29

4.5. Testiranje programa


Kadasenapieprogram,potrebnojenaravnoiproveritidalionispravnoradi.Razmotrimoprimer
programakojivrisumiranjeelemenataniza(Varijanta1,nastrani24).Ukolikojeulazuprogramzadat
sa:
NELEM
niz:
suma:

= 10
.long 1,2,3,4,5,6,7,8,9,10
.long 0

tadaerezultatradaprogramabitivrednost 55iona ebitismetenaupromenljivu suma.Na


osnovu ovog primera, mogli bismo rei kako je program ispravan. Meutim, testiranje ispravnosti
programasenemoezasnivatinasamojednomprimeru.Programsemoraistestiratizavierazliitih
ulaza,ividetidalidajeispravanrezultat.Pretpostavimodajeulazuprogramzadatsa:
NELEM
niz:
suma:

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

4.6. Domai zadaci


1. Napisatiasemblerskiprogramzasortiranjeniza16bitnihvrednosti.
2. Prepraviti program za brojanje dana tako da se umesto indeksnog adresiranja za pristupanje
elementimanizakoristiindirektnoadresiranje.

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.

5.1. Sistemski pozivi


Sistemskipoziviomoguujupozivanjeoperacijaoperativnogsistema.Kodsistemagdesukorisniki
isistemskiprostorstrogomeusobnoizolovani,onisuujednoijedininainzakomunikacijukorisnikih
programa sa okruenjem. Direktan pristup hardveru doputen je samo sistemskim procesima. ak i
tamo gde ovakva ogranienja ne postoje, sistemski pozivi su osnovni nivo apstrakcije hardvera oni
omoguujuizvravanjeoperacijabezpoznavanjadetaljafizikearhitekturesistema.
Ilustracije radi, razmotrimo operaciju prikaza teksta na ekranu korienjem direktnog pristupa
hardveru.Programkojielidaispietekstdirektnopristupajuivideomemorijimoradaznakojisetip
grafikekarticenalaziuraunaru,gdesenalazipoetakvideomemorije,kakojeonaorganizovana,koja
je rezolucijaekrana, koji su kodovi znakova i boja prilikom ispisa. Dalje, ako se prilikom upisivanja
preeispodposlednjelinijeekrana,sadrajvideomemorijesemorapomeritizajednulinijunavie,itd.
Korienjemsistemskihpoziva,sveovopadanateretdrajverakojirukujegrafikomkarticom.
Pod Linuxom na procesoru 80386, sistemskim pozivima se pristupa korienjem naredbe
softverskogprekida, int,savektorom 0x80.Procesor 80386seutokuizvravanjaovenaredbeponaa
slinokaokodprijemahardverskogprekida:sauvanastekusadrajstatusnogregistraiprogramskog
brojaa,pronaememorijskulokacijusaadresomobraivaaprekidaizaponenjegovoizvravanje.Za
razlikuodhardverskog,softverskiprekidsenemoezabraniti.
Prepozivanaredbeint,uregistareaxtrebapostavitibrojsistemskogpoziva,dokuregistreebx,
ecx,edx,esiieditrebapostavitieventualneargumentepoziva(sadrajovihregistara,kaoiregistra
ebp, ostajenepromenjennakonpovratkaizsistemskogpoziva).Brojargumenatazavisiodsistemskog
poziva koji se eli koristiti. Nakon izvrenja sistemskog poziva, registar eax sadri informaciju o
izvrenjupoziva.Negativanbrojoznaavagreku,doknulailipozitivanoznaavauspenoizvrenje.

5.2. Ulaz, izlaz i zavretak programa


Svakistartovaniprogramnaraspolaganjuima3unapredotvorenafajla: stdin (standardniulaz),
stdout(standardniizlaz)istderr(standardniizlazzagreke).
Sistemskipozivzaulaz(read)koristisledeeargumente:
eax3(brojsistemskogpozivazaulaz)
ebxdeskriptorfajla(zastandardniulaz,stdin,ovavrednostje0)
ecxadresaulaznogbafera
edxveliinabafera

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

izlazni kd (kd greke)

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

Naredba push prvosmanjuje esp za4,azatimnalokacijunakojupokazujenovavrednost esp


smeta izvorni operand, dok pop radi obrnuto: preuzima vrednost sa lokacije na koju pokazuje esp,
smetajeuodredinioperand,ipoveavaespza4.Moesevidetidaprilikompunjenjastekrasteka
niimadresama.Ilustracijeradi,efekatoperacijepushl $0prikazanjenaslici10.

394F88E2
CE4DA0B7
00000000

esp

BEB38325

Slika 10: Izgled 80386 steka pre i posle operacije pushl $0

6.1. Konvencija poziva potprograma


Prenosargumenataupotprogramiradsalokalnimpromenljivim(akopostoje)naasemblerskom
jeziku je mogue obaviti na razliite naine. Nain na koji odreeni vii programski jezik radi ovo
prevoenje naziva se njegovom pozivnom konvencijom (callingconvention). Pozivna konvencija

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

6.2. Stek frejm


Prostor za lokalne promenljive zauzima se na steku: pokaziva na vrh steka pomera se za
odgovarajuu vrednost, tako da upotreba steka unutar funkcije (recimo za dalje pozive) ne utie na
sadrajlokalnihpromenljivih.
Zapristupargumentimailokalnimpromenljivamakoristiseposebanpokazivakiregistarkojise
zovepokazivafrejma (framepointer). Frejm sadriargumente,povratnuadresu,zateenuvrednost
pokazivaafrejmailokalnepodatkefunkcije.Zateenavrednostpokazivaafrejmasestavljanastekna
poetku izvravanjafunkcijeirestaurira prepovratka, imesepozivajuojfunkcijiosiguravapristup
sopstvenomfrejmuponastavkunjenogizvravanja.80386kaopokazivafrejmakoristiregistarebp.

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

#uvanje zateenog FP-a


#postavljanje novog FP-a
#prostor za lokalnu promenljivu

Nakrajupotprogramasenalaziasemblerskikdkojiunitavafrejm:
movl %ebp, %esp
popl %ebp
ret

#brisanje lokalne promenljive


#vraanje prethodnog FP-a
...
12(%ebp) Drugiparametarfunkcije
8(%ebp) Prviparametarfunkcije
4(%ebp) Povratnaadresa(starieip)
(%ebp) Stariebp
-4(%ebp) Prvalokalnapromenljiva
-8(%ebp) Drugalokalnapromenljiva
...

Tabela 3: Pristup parametrima i lokalnim promenljivama


Argumentima na steku se u okviru potprograma pristupa korienjem ebp registra i baznog
adresiranja(tabela 3).Poto ebp registarpokazujenafiksnutakufrejma,uodnosunanjegasemoe
odreivatirelativnapozicija(offset)argumenatailokalnihpromenljivih:
movl 12(%ebp), %ebx
movl -4(%ebp), %ecx

#drugi parametar (b) -> ebx


#prva lokalna promenljiva (r) -> ecx

Potprogrami

Strana 36

Potopozivajuafunkcijastavljaargumentenastek,onaihmoraisklonitisasteka.Tosepostie
izmenomsadrajaespregistra.Pozivfunkcijesaslike11izveobisenasledeinain(pretpostavljaseda
suargumentia,bi*rezredomuregistrimaeax,ebxiecx):
pushl %ecx
pushl %ebx
pushl %eax
call nzd
addl $12, %esp

#trei argument -> stek


#drugi argument -> stek
#prvi argiment -> stek
#oslobaanje prostora na steku

Svih 5 gornjih naredbi (smetanje argumenata na stek, sm poziv asemblerskog potprogama i


oslobaanje zauzetog prostora na steku) predstavljaju ekvivalent poziva potprograma u viem
programskomjeziku.
Dibager DDD moe prikazati trenutni izgled steka korienjem opcije Memory iz menija Data.
Opcijeuprozorukojiseotvoritrebapodesitinasledeevrednosti:

Umestobroja20moesestavitibrojvrednostinastekukojese eleposmatrati,dokseumesto
octalmoestavitibilokojidrugipodranibrojnisistem.

6.3. Stek frejm i uvanje registara


Usituacijikadajepotrebnokoristitiiregistrekojipocdeclspecifikacijinisuslobodnizakorienje
(ebx, esi i edi), vrednosti tih registara se pre korienja moraju negde sauvati, a pre izlaska iz
potprograma ih treba restaurirati. Logino mesto za uvanje njihovih vrednosti je stek. Na primer,
ukolikoseupotprogramukojiimatrilokalnepromenljive,pored eax, ecx i edx,koristei ebx i esi,
tadabipoetakpotprogramatrebaodaizgledaovako:
pushl %ebp
movl %esp, %ebp
subl $12, %esp
pushl %ebx
pushl %esi

#uvanje zateenog FP-a


#postavljanje novog FP-a
#prostor za tri lokalne promenljive
#uvanje sadraja registra ebx
#uvanje sadraja registra esi

Preizlaskaizpotprogramatrebavratitivrednostisauvanihregistarauobrnutomredosledu:
popl
popl
movl
popl
ret

%esi
%ebx
%ebp, %esp
%ebp

#restauriranje sadraja registra esi


#restauriranje sadraja registra ebx
#brisanje lokalnih promenljivih
#vraanje prethodnog FP-a

6.4. Definisanje potprograma na gcc asembleru


Definisanjepotprogramanezahtevanikakvedodatnedirektive.Dovoljnojedasenaulaznutaku
potprograma postavi ulazna labela, i da se negde u telu potprograma nalazi naredba za povratak iz

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

6.5. Prenos argumenata po vrednosti i po adresi


Kada se potprogramu prosledi vrednost argumenta, ukoliko ona bude izmenjena u okviru
potprograma,taizmenaseneeodrazitinaoriginalniargument,potopotprogramrukuje lokalnom
kopijomvrednostiargumenta.Ovoodgovaraulaznimparametrima(prenoenjupovrednosti)kodviih
programskihjezika.
Dabiseizpotprogramamoglamenjativrednostnekogargumenta,potprogramutrebaproslediti
njegovu adresu. Ovo odgovara ulaznoizlaznim parametrima (prenoenje po adresi ili referenci) kod
viihprogramskihjezika.Uprimerunzd(Slika11)parametar*rezpredstavljaadresurezultata.Dabi
sepristupilovrednostinakojurezpokazuje,trebaiskoristitinekuvarijantuindirektnogadresiranja,na
primer:
movl 16(%ebp), %esi
movl $0, (%esi)

#trei parametar (adresa rezultata) -> esi


#postavljanje rezultata na 0

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

Primer 1 - Potprogram za sabiranje dva broja


Ulazupotprogramsudvevrednostipreneteprekosteka,aizlazjeprekoeaxregistra.Potprogram
nevriproveruprekoraenja.
#potprogram za sabiranje dva broja
#int saberi(int a, int b);
a: .long 123
b: .long 456
saberi:
#naziv potprograma
pushl %ebp
#poetak potprograma
movl %esp, %ebp
movl 8(%ebp), %eax
#telo potprograma
addl 12(%ebp), %eax
movl %ebp, %esp
#zavretak potprograma
popl %ebp
ret
main:
#glavni program
pushl b
#drugi argument -> stek
pushl a
#prvi argiment -> stek
call saberi
#poziv potprograma
addl $8, %esp
#oslobaanje prostora na steku
kraj:
movl $1, %eax
movl $0, %ebx
int $0x80

Primer 2 - Modifikacija prethodnog primera


Ulazupotprogramsudvevrednostipreneteprekosteka,arezultatseupisujenaadresukojaje
prenetakaotreiargument.

Potprogrami

Strana 39

#potprogram za sabiranje dva broja


#void saberi(int a, int b, int &rez);
rezultat:
.long 0
...
saberi:
#naziv potprograma
pushl %ebp
#poetak potprograma
movl %esp, %ebp
movl 8(%ebp), %eax
#telo potprograma
addl 12(%ebp), %eax
movl 16(%ebp), %ebx #adresa rezultata u %ebx
movl %eax, (%ebx)
#upisivanje zbira na zadatu adresu
movl %ebp, %esp
#zavretak potprograma
popl %ebp
ret
main:
#glavni program
pushl $rezultat
#adresa rezultata -> stek
pushl $123
#drugi argument -> stek
pushl $456
#prvi argiment -> stek
call saberi
#poziv potprograma
addl $12, %esp
#oslobaanje prostora na steku
kraj:
movl $1, %eax
movl $0, %ebx
int $0x80

6.6. Upotreba gcc-a za prevoenje i povezivanje (linkovanje)


asemblerskih (pot)programa
Iakojemoguedasenauuistojizvornojdatotecisaglavnimprogramom,potprogramiseobino
nalaze u zasebnim izvornim datotekama i prevode (kompajliraju) se zasebno. Nakon prevoenja se
povezuju(linkuju)saglavnimprogramomkakobisedobioizvrnioblik.Ovajpostupakomoguavadase
jednomnapisaniprevedenkodupotrebljavauvierazliitihprograma.Potprogramislinenamenese
obino arhiviraju u kolekcije potprograma koje se nazivaju biblioteke. Ukoliko se potuju pozivne
konvencijejezikaCprilikompisanjapotprograma,potprogramnapisannaasemblerumoedasepovee
saCprogramom.
Ukoliko se program sastoji iz, na primer, glavnog programa u jednom i nekih potprograma u
drugomilidrugimfajlovima,izvrnaverzijasemoedobitijednostavnimnavoenjemnazivasvihfajlova
odkojihonatrebadaseizgenerie:
gcc -g -o program program.S potprogram.S pomocni.S
Uovomsluaju,izvrnaverzijapotprogramasedobijaprevoenjemipovezivanjemkdakojise
nalaziu3fajla(program.S, potprogram.S i pomocni.S).Trebanaglasitidaseu samojednom od
ovihfajlovasmenaidirektiva.globl main,dokostalitrebadaiza.globldirektiveimajulabelekoje
treba da budu vidljive spolja, obino naziv potprograma. Na primer, ako je u nekom fajlu definisan
potprogrampodnazivomsaberi(samotajpotprogram),tadautomfajluovadirektivatrebadaglasi:
.globl saberi
Ukolikojeasemblerskiprogramilipotprogrampotrebnoprevestibezpovezivanja,kakobisedobio
tzv.objektnifajl,upotrebljavaseopcija-c:
gcc -c program.S -o program.o
Asemblerski program se moe povezati sa nekim ve prevedenim kdom, koji se u tom sluaju
nalazi u objektnom fajlu. U tom sluaju je dovoljno samo navesti sve fajlove od kojih treba da se
izgenerieizvrnaverzijaprograma:

Potprogrami

Strana 40

gcc -g -o program program.S potprogram.o pomocni.S


U ovom primeru, fajl potprogram.S jeunapred preveden i vri se povezivanje ve prevedenog
potprogramasaostatkomkda.Ukolikojepotprogram.Sprevedensaopcijom-g,tadaesemoivriti
dibagiranjeinjegovogkda.
Ukoliko je prevedeni program nastao povezivanjem vie potprograma, postavlja se pitanje kako
dibagirati kd odreenog potprograma, bez ulaenja u npr. glavni program. U tom sluaju, nakon
pokretanja DDD dibagera,dovoljnojeotvoritiodgovarajuifajlsaizvornimkdomkorienjemopcije
File/OpenSource.

Primer povezivanja asemblerskog potprograma i asemblerskog glavnog


programa
Pretpostavimodaimamodvafajlanadisku,jedankojisadripotprogramzasabiranjedvabrojai
kojisezovesabpp.S:
#potprogram za sabiranje dva broja
#int saberi(int a, int b);
.section .text
.globl saberi
saberi:
#naziv potprograma
pushl %ebp
#poetak potprograma
movl %esp, %ebp
movl 8(%ebp), %eax
#telo potprograma
addl 12(%ebp), %eax
movl %ebp, %esp
#zavretak potprograma
popl %ebp
ret
idrugikojiusebisadriglavniasemblerskiprogramikojisezoveglavni.S:
#glavni program za sabiranje dva broja
#int saberi(int a, int b);
.section .data
a: .long 123
b: .long 456
.section .text
.globl main
main:
pushl b
pushl a
call saberi
addl $8, %esp
kraj:
movl $1, %eax
movl $0, %ebx
int $0x80

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

Primer povezivanja asemblerskog potprograma i C glavnog programa


Pretpostavimodaimamoistipotprogramkaouprethodnomprimeru(sabpp.S),alidaovajput
imamoglavniCprogramufajluglavni.c:

Potprogrami

Strana 41

//glavni program za sabiranje dva broja


#include <stdio.h>
#deklaracija asemblerskog potprograma
int saberi(int a, int b);
int main()
{
int rez;
rez = saberi(8, 12);
printf("Rezultat za 8 i 12 je %d\n", rez);
}
Pri poetku C programasenalazi deklaracijaasemblerskefunkcije(potprograma). Ova linijaje
neophodnakakobiseasemblerskipotprogramnaispravannainpozivaoizCprograma(tanije,postoje
situacijekadaovonijeneophodnouraditi,alijemnogoboljapraksadasedeklaracijauveknapie).
Slino kao u prethodnom primeru, ova dva fajla se mogu spojiti u jedan izvrni fajl sledeim
pozivomgcca:
gcc -g -o saberi sabpp.S glavni.c
Kaorezultatesedobitiizvrnifajlsaberikojieusebiimatiasemblerskipotprogramizprvog
fajla i glavni C program iz drugog. Treba napomenuti da je ovo povezivanje mogue zato to je
asemblerskipotprogramnapisanpocdecldeklaracijizapozivanjepotprograma.

Primer povezivanja asemblerskog potprograma i glavnog programa u


objektnom fajlu
Pretpostavimo da imamo isti potprogram kao u prethodnim primerima (sabpp.S), ali da smo
glavniasemblerskiprogramiskompajliralikaoobjektnifajl,naprimer:
gcc -c glavni.S -o glavni.o
ili,alternativno,dasmoglavniCprogramiskompajliralikaoobjektnifajl:
gcc -c glavni.c -o glavni.o
Slinokao uprethodnim primerima, ova dvafajla semogu spojiti u jedanizvrni fajlsledeim
pozivomgcca:
gcc -g -o saberi sabpp.S glavni.o
Kaorezultatesedobitiizvrnifajlsaberikojieusebiimatiasemblerskipotprogramizprvog
fajlaiglavniprogramizdrugog.

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

6.8. Domai zadatak


1. Napravitipotprogramint uvecaj(int x)kojinaargumentdodaje1ivraadobijenibroj.
2. Napravitipotprogramint palindrom(char *str)kojiproveravadalijestringpalindrom.Ako
jeste,vratiti1,usuprotnomvratiti0.
3. Prepravitipotprogramzafaktorijeltakodaserezultatvraaprekoargumentaprenetogpoadresi.
Registareaxiskoristitizavraanjevrednostiogreci:ukolikodoedoprekoraenjaopsegaod32
bitaprilikommnoenja,ueaxvratiti1,inaevratiti0.

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

#postavljanje najnieg bita registra ax na 1


#promena vrednosti najnieg bita registra 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.

Negacija u dvostrukoj preciznosti


Negirati neku vrednost u ovom sluaju znai izraunati njen komplement2. Za negiranje u
jednostrukojpreciznosti80386imanaredbuneg,alizasluajdvostrukepreciznostiboljejepostupitipo
definiciji:komplement2nekevrednostijenjenkomplement1uveanzajedan:
notl
notl
addl
adcl

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

7.2. Naredbe za pomeranje i rotiranje


Pomeranje neke vrednosti za n bita u levo ekvivalentno je mnoenju te vrednosti sa 2n, dok je
pomeranjeudesnoekvivalentnocelobrojnomdeljenjusa2 n.Pomeranjemoebitilogikoiliaritmetiko.
Kodprvog,bitnajmanjeilinajveeteine(uzavisnostiodtogadalisepomeraulevoilidesno)dobija
vrednost nula. Kod drugog, pomeranje u levo je istovetno logikom, a pomeranje u desno zadrava
vrednost bita najvee teine. Ovime se uva znak u sluaju rada sa oznaenim brojevima. Osnovne
naredbezapomeranjesushl,shrisar.

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

#pomeranje eax za 1 mesto u levo


#pomeranje bx za cl mesta u desno

Prilikompomeranjaulevo,postavljenindikator csemoeuzetikaoindikatorizlaskavanopsega
odreditazasluajradasaneoznaenimvrednostima. Akosevrednosti tretirajukaooznaene,treba
proveravatistanjeindikatorao.
Pomeranjemudesnonemoeseprekoraitikapacitetodredita.Ovdepostojedvagraninasluaja:
logikopomeranjeneoznaenevrednostiiaritmetikopomeranjepozitivneoznaenevrednostieposle
najvienkoraka(gdejenveliinaodreditaubitima)svestivrednostnanulu,dokekodaritmetikog
pomeranjanegativneoznaenevrednostikrajnjavrednostbiti1.

Rukovanje bitima

Strana 45

Naredbezarotiranjesuprikazanenaslici 13. rol vrirotiranjeulevo,a ror rotiranjeudesno.


Rotiranjemulevosebitsanajviepozicijeuodreditudovodinanajniu,doksesviostalibitipomeraju
zajednupozicijuulevo.Analognotomeseradiirotiranjeudesno.Svetojereenozaoperandenaredbi
zapomeranjevaiiovde.

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

#rotiranje ax za jedno mesto u levo


#rotiranje ebx kroz c za cl mesta u desno

Pomeranje i rotiranje u dvostrukoj preciznosti


Utabeli4prikazanisuprogramikojipomerajuilirotirajuregistarskiparedx:eax.Nisuprikazani
jedinoekvivalentioperacijarclircr.
Operacija

Program

shl

shll $1, %eax


rcll $1, %edx

shr

shrl $1, %edx


rcrl $1, %eax

sar

sarl $1, %edx


rcrl $1, %eax

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

Tabela 4: Pomeranje i rotiranje u dvostrukoj preciznosti

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.

7.3. Mnoenje pomou sabiranja i pomeranja


Neto komplikovaniji algoritam za mnoenje pomou sabiranja je mnoenje pomou sabiranja i
pomeranja.Predstavljavernukopijualgoritmakojisekoristikodrunogmnoenjadvabinarnabroja.
Akoimamovrednostiaib,veliinenbita,njihovproizvodje
n 1

( a n1 2

+ a n2 2

n2

++ a 0 )( bn 1 2

n 1

n 2

+ b n2 2

++ b0 )

gdejeaivrednostbitanapozicijii(analognotomeibi).Proizvodsemoezapisatiiovako:

b0a + b12a++ bn 12n 1 a


Izzapisasevididajerezultatmogueizraunatipomousukcesivnihsabiranja.Usvakomkoraku
posleprvogvrednostaseudvostruuje.Udvostruavanjevrednostiseuasemblerumoeizvesti:

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

Postupakzapoinjesamoukolikosuobainiocarazliitaodnule.Izraz (b & 1) imaevrednost


jedanakojenajniibitpromenljivebjedinica(operator&oznaavabitoperacijulogikogI).Promenljiva
bseusvakomkorakupomerazajedanbitudesno(b = b >> 1).Naovajnaineistiizrazposluitiza
testiranjebitarastueteine.
Algoritamsemoeprevestiusledeiasemblerskiprogram:

Rukovanje bitima

Strana 47

movl $60, %ebx


movl $30, %eax
movl %eax, %ecx
xorl %eax, %eax
xorl %edx, %edx
xorl %esi, %esi
andl %ebx, %ebx
jz kraj
proveri:
jecxz kraj
testl $1,%ecx
jz uvecaj
addl %ebx, %eax
adcl %esi, %edx
uvecaj:
addl %ebx, %ebx
adcl %esi, %esi
shrl $1, %ecx
jmp proveri
kraj:
movl $1, %eax
movl $0, %ebx
int $0x80
Napomeneuzprimer:

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.

LogikoInekevrednosti sasamom sobom (and %ebx,%ebx)neepromenitituvrednost,ali e


80386 postaviti indikator z ukoliko je rezultat nula(to se moe desiti samo ukoliko je i sama
vrednostjednakanuli).

Naredbajz(jumpifzero)jealternativninazivzaje(jumpifequal),kojajepomenutaranije.

7.4. Domai zadatak


1. Napisatipotprogramkojikaoargumenteprima3vrednosti,a,bin(0<=n<=32),akaorezultatdaje
vrednostijihnnajniihbitaodgovaravrednostia,apreostalibitiodgovarajuvrednostib:
int Izmesaj(int a, int b, int n)

Kontrolna suma i paritet

Strana 48

8. Kontrolna suma i paritet


Kadasepodaciprebacujusajednograunaranadrugi,postavljasepitanjedalisuoniispravno
preneti.Uobiajeninainzaproverujedasenapodatkeprimeninekialgoritamkojiekaorezultatdati
jedaniliviekontrolnihbrojevakojiseprebacujuzajednosapodacima.Kadasepodaciprebacenadrugi
raunar, nanjihseprimeni istialgoritam,paseuporedetakodobijenikontrolnibrojevisaprenetim
kontrolnimbrojevima.Ukolikopostojerazlike,dolojedogrekeuprenosu.
Kontrolnibrojevisemoguraunatizasvepodatkezajedno(checksumkontrolnasuma),amogu
se raunati i za svaki posebno. Postoji mnogo algoritama koji se koriste u ove svrhe, od kojih
jednostavnijiomoguavajusamodetekcijugreaka,dokkomplikovanijiomoguavajuiispravakgreaka
usluajudaihnemaprevie(ovozavisiodkoliineredundantnihpodataka,odnosnokontrolnihbrojeva).
Jedan algoritam koji radi sa svakim podatkom posebno se zasniva na sledeem: posmatra se
binarnapredstavasvakogpodatkaposebnoiprebrojavasekolikojedinicaimaubroju(slika15).

1.
2.
3.
4.
5.

00101001
01010101
01010100
01100101
00011111

paritet
1
0
1
0
1

Slika 15: Paritet

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

Slika 16: Paritet na najznaajnijem bitu

Nedostatakovakvekontrolepodatakajetonemoeotkritigrekuukolikojeubrojupromenjen
paranbrojbita.
Drugavrstakontrolnihsumasuonekojeseodnosenapodatkekaocelinu.Jedanalgoritamkoji
radinatajnainsezasnivanasledeem:posmatrasebinarnapredstavasvihpodatakazajednoibrojise
kolikoimajedinicanasvakojteinskojpozicijiusvimbrojevima(slika17).

Kontrolna suma i paritet

Strana 49
1.
2.
3.
4.
5.

00101001
01010101
01010100
01100101
00011111
01010010

Slika 17: Vertikalni paritet


Ukoliko je broj jedinica paran, na odgovarajuem mestu u kontrolnoj sumi se stavlja 0, a u
suprotnomsestavlja1.Ovakvakontrolnasumasenazivai vertikalniparitet.Oigledannedostatak
ovakvekontrolnesumejeistikaoikodpariteta,atojedanemoedetektovatigrekuakosenajednoj
teinskojpozicijijaviparanbrojgreaka.
Asemblerskiprogramkojiraunakontrolnusumuzaniz32bitnihbrojevajedatunastavkuteksta.
br_elem = 6
niz: .long 0b10101010100101010001010100111111
.long 0b10101010110111110101010101000101
.long 0b11111111110000000001111111000000
.long 0b11101001010110100101101010101010
.long 0b00010101010100101010101010100101
.long 0b11000101001010001001000100101010
checksum:
.long 0
xorl %eax, %eax
#checksum
movl $1, %edx
#maska
sledeci_bit:
xorl %ecx, %ecx
#broja bita
xorl %esi, %esi
#broja elemenata niza
sledeci_el:
movl niz(,%esi,4), %ebx
andl %edx, %ebx
#provera vrednosti bita
jz bit_nula
incl %ecx
bit_nula:
incl %esi
cmpl $br_elem, %esi
#obraeni svi elementi?
jl sledeci_el
shrl $1, %ecx
#parnost
rcrl $1, %eax
shll $1, %edx
#pomeranje maske
jnc sledeci_bit
#obraeni svi biti?
movl %eax, checksum
kraj:
movl $1, %eax
movl $0, %ebx
int $0x80

8.1. Domai zadatak


1. Napisati program za proveru pariteta niza 8bitnih brojeva (bit na najznaajnijoj poziciji je bit
pariteta).Prvipodatakunizujebrojelemenataniza(neraunajuitajpodatak).

Konverzije brojeva iz internog oblika u znakovni oblik

Strana 50

9. Konverzije brojeva iz internog oblika u znakovni oblik


Dananji raunari interno (u registrima ili memorijskim lokacijama) predstavljaju brojeve u
binarnom obliku. Brojevi su zapisani kao nizovi bita, ija duina uglavnom odgovara kapacitetu
memorijskelokacije.Zakomunikacijusakorisnikomse,meutim,brojizinternepredstaveprevodiu
znakovni niz iji su elementi cifre. Takav znakovni zapis je promenljive duine i moe biti dui od
internog.Naprimer,zabeleenjebroja3133710uznakovnomoblikupotrebnojenajmanjepetbajtova(za
svakucifrupojedan),dokbiinterniobliku16bitnomregistruzauzimaodvabajta.
Konverzija iz znakovnog oblika u interni oblik je neophodna prilikom zadavanja brojeva jer
korisniktrebadaihzadauznakovnomobliku.Kadaprogramizvriobradu,rezultattrebaprikazatiu
znakovnomobliku(kojijerazumljivkorisniku), odnosnotrebaizvritikonverzijuizinternogoblikau
znakovnioblikunekojosnovi.
UnarednimprimerimaesezaznakovnizapisbrojevakoristitiosnovniASCIIkd,asvibrojevie
setretiratikaoneoznaeni.Znakovizacifredekadnogbrojnogsistemaimajukodoveod48do57.Akose
radisabrojnimosnovamaoddvadodeset,dobijanjevrednosticifrenaosnovunjenog ASCII kodase
svodinaoduzimanjekonstante48(kodazacifrunula)od ASCII kodacifre.Analognotomeseradii
obrnutpostupak.Kodveihbrojnihosnovakaocifreteineveeoddevetkoristesemalailivelikaslova,
tejeipostupakprilagoavanjasloeniji.

9.1. Konverzija celih dekadnih brojeva iz internog oblika u znakovni


oblik
Konverziju iz internog oblika u znakovni oblik celog broja odreene brojne osnove najlake je
obaviti uzastopnim deljenjem ulazne vrednosti osnovom odredinog brojnog sistema i pretvaranjem
ostatkasvakogdeljenjauzankovniekvivalent(tj.odgovarajuucifru).Algoritamsezavravakadasekao
rezultat deljenja dobije nula. S obzirom da se na ovaj nain dobija niz cifara zapisan obrnutim
redosledomuodnosunauobiajeni,elementenizatrebaobrnutidabisedobiokonaaniispravanzapis.
Uprogramunapisanompoovomalgoritmujeuvedenaasemblerskadirektiva.fillijijeformat:
.fill broj, veliina, vrednost
Ovadirektivasluidaseumemorijuupiebrojelemenataduineveliinabajtova(moebiti1,
2ili4)savrednouvrednost.Parametriveliinaivrednostsuopcioni(podrazumevanevrednosti
su1i0,respektivno).
Unastavkutekstajedatprogramzakonverzijuizinternogoblikauznakovnioblikcelogdekadnog
broja.
dec_br_max = 10
dec_br: .fill dec_br_max,1,0
...
movl $375000000, %eax
leal dec_br, %edi
movl $10, %ebx
dec_cifra:
xorl %edx, %edx
divl %ebx
addb $'0', %dl
movb %dl, (%edi)
incl %edi
andl %eax, %eax
jnz dec_cifra
movb $0, (%edi)
decl %edi
leal dec_br, %esi

#broj za konverziju
#baza
#neophodno zbog divl

#kraj algoritma?
#kraj stringa
#obrtanje niza

Konverzije brojeva iz internog oblika u znakovni oblik

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

9.2. Opti sluaj konverzije razlomljenih brojeva iz internog oblika u


znakovni oblik
Algoritamzakonverzijuizinternogoblikarazlomljenogbrojauznakovnioblikubilokojojosnovise
moepredstavitisledeimnizomkoraka:
1. Pomnoibrojsabazom
2. Izdvojiceodeobrojaizapiigakaocifruizlazneosnove
3. Akojeceodeobrojarazliitod0,oduzmigaodbroja
4. Akojebrojrazliitod0,idinakorak1,usuprotnomzavrikonverziju
Primer:konverzijavrednosti0.312510uvrednostuoktalnombrojnomsistemu
0.312510*8=2.5=2+0.5=>cifraizlazneosnoveje2,audaljuobraduidevrednost0.5
0.510*8=4.0=4+0.0=>cifraizlazneosnoveje4,postupakjezavren,0.312510=0.248
Ukolikobiuzeliuobzirusvojenuinternupredstavubrojeva(skaliranjesa10 9),tadabiraunica
izgledalaovako:
312500000*8=2500000000=2*109+500000000
500000000*8=4000000000=4*109+0
Prirealizacijiovogalgoritmauasembleru,trebaobratitipanjunatodaseuovomsluajuradisa
skaliranim brojevima, patometrebaprilagoditisveraunskeoperacije. Takoe, potosemoedobiti
beskonanaperiodinostuizlaznombroju,neophodnojeograniitibrojnjegovihcifara.

9.3. Domai zadatak


1. Napisatiprogramuasembleruzakonverzijucelogbrojaudvostrukojpreciznostiizinternogoblika
uznakovnidekadnioblik.

Konverzije brojeva iz znakovnog oblika u interni oblik

Strana 52

10. Konverzije brojeva iz znakovnog oblika u interni oblik


Prilikomkonverzijeizznakovnogoblikauinterniproveravasesledee:

Validnost pojedinanihcifara, u skladusabrojnom osnovom broja:cifravandozvoljenogopsega


predstavljagreku.

Kapacitetodreditazainternioblik:prekoraenjekapacitetajegreka.

Duinaizvornognizacifara:prazanniz(onajijijeprvielementNULbajt)setretirakaogreka.

Realniprogramizakonverzijuimalibiveibrojprovera.Naprimer,uobiajenojedaseznakovi
praznine(razmakitabulator)preprvecifre,kaoiizaposlednje,ignoriu.

10.1. Konverzija celih dekadnih brojeva iz znakovnog oblika u


interni oblik
Uopteuzev,svakibrojodncifara,zapisanupozicionombrojnomsistemusaosnovomb,moese
predstavitinasledeinain:

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

Konverzije brojeva iz znakovnog oblika u interni oblik

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

10.2. Konverzija razlomljenih dekadnih brojeva iz znakovnog oblika


u interni oblik
Akoseusvojiskaliranjesa10 9,tadaseulazninizznakovamoepredstavitikaoskaliranavrednost.
Zbog uvedenog naina predstavljanja razlomljenih brojeva, moe se primetiti da je konverzija iz
znakovnog dekadnog oblika razlomljenog broja u interni oblik identina prethodnom programu
(konverzijacelogbroja).Jedinidodatniuslovjedarezultatnesmebitiveiilijednakod109.
dec_br: .ascii "200000000\0"
greska: .byte 0
...
leal dec_br, %esi
movb $0, greska
xorl %eax, %eax
xorl %ebx, %ebx
movl $10, %ecx
dec_cifra:
movb (%esi), %bl
andb %bl, %bl
jz kraj_dec
subb $'0', %bl
jc i_greska
cmpb $9, %bl
ja i_greska
mull %ecx
andl %edx, %edx
jnz i_greska
addl %ebx, %eax
jc i_greska
cmpl $1000000000, %eax
jae i_greska
incl %esi
jmp dec_cifra

#baza
#kraj stringa?
#dobijanje cifre

#provera prekoraenja
#sledei znak

Konverzije brojeva iz znakovnog oblika u interni oblik


kraj_dec:
cmpl $dec_br, %esi
jne kraj
i_greska:
incb greska
kraj:
movl $1, %eax
movl $0, %ebx
int $0x80

Strana 54

#prazan string?

10.3. Opti sluaj konverzije razlomljenih brojeva iz znakovnog


oblika u interni oblik
Algoritamzakonverzijurazlomljenogbrojaubilokojojosnoviuosnovu10(kojase,skaliranasa
109, koristila kao interna predstava u prethodnim primerima) se moe predstaviti sledeim nizom
koraka:
1. Postavirezultatna0ipozicionirajsenaposlednjucifruubroju
2. Rezultatsaberisacifromipodelisabazom
3. Ukolikoimajocifara,preinaprethodnucifruiidinakorak2,usuprotnomzavrikonverziju
Primer:konverzijavrednosti0.128uvrednostudekadnombrojnomsistemu
R=0

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.

10.4. Domai zadaci


1. Napisatiprogramzakonverzijucelogdekadnogbrojauinternioblikudvostrukojpreciznosti.
2. Napisati program koji e sve cifre heksadecimalnog celog broja koje su zadate malim slovima
pretvoritiuvelikaslova.
3. Napisatiprogramuasembleruzakonverzijucelogoktalnogbrojauznakovnomoblikuubinarni
brojuznakovnomobliku.

Pregled korienih naredbi

Strana 55

11. Pregled korienih naredbi


Uovojglavijedatabecednipregledasemblerskihnaredbikojesukorieneuprogramimauovom
praktikumu. Za svaku naredbu su navedeni operandi koji se uz nju oekuju, pri emu oznaka src
oznaavaizvorni, dst oznaavaodredinioperand,dok cnt oznaavabrojakioperandkodnaredbiza
pomeranje. Uz svaku naredbu je dat i tablarni pregled uticaja na pojedine indikatore, pri emu je
notacijazauticajnapojedinaniindikatorsledea:

Nemapromene

Vrednostjenedefinisana

Vrednostsemenjauskladusarezultatom
(ukolikosedrugaijenenaglasi)

Vrednostsetestiratokomoperacije

0ili1

indikatorsepostavljananavedenuvrednost

Opisinaredbiudaljemtekstuvaeza32bitnizatienireimprocesora80386.

adc src, dst

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

Pregled korienih naredbi

Strana 56

Postavljadirectionindikatorna0.

cmp src, dst

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

# ax/operand -> al, ostatak -> ah


# dx:ax/operand -> ax, ostatak -> dx
# edx:eax/operand -> eax, ostatak -> edx

operand moebitiregistarilimemorija/promenljiva
Izvravanjenaredbeidivmoedovestidopojaveizuzetka.Ovosemoedesitiudvasluaja:

ukolikojevrednostoperandajednakanuli

ukolikojedobijenavrednostprevelikadastaneuodredite

Pregled korienih naredbi

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

imulw oper1, oper2 #oper1*oper2 -> oper2


imull oper1, oper2 #oper1*oper2 -> oper2
imulw const,oper1,oper2 #const*oper1 -> oper2
imull const,oper1,oper2 #const*oper1 -> oper2
Operandiimajusledeaogranienja:
operand moebitiregistarilimemorija
oper1

moebitikonstanta,registarilimemorija

oper2

moebitisamoregistar

const

moebitisamokonstanta

inc dst

Dodaje1naodredinioperand.

int dst
Generiesoftverskiprekid.

jxx dst

Uslovniskok.Odredinioperandjerastojanjeciljnenaredbeodnaredbekojasledinaredbuskoka
(ovorastojanjeasemblerraunaautomatskikadasekaooperandstavinekalabela).Ovihnaredbiima
vie,aosnovnesudateusledeimtabelama:

Pregled korienih naredbi

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

nije vee ili jednako

s<>o

jnl

nijemanje

s=o

jnle

nijemanjeilijednako

z=0is=o

je

jednako

z=1

jne

nijejednako

z=0

Pregled korienih naredbi

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.

lea src, dst

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.

mov src, dst

Pregled korienih naredbi

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.

rcl cnt, dst

M/?

TM

Pregled korienih naredbi

Strana 61

Rotiraodredinioperandkrozindikatorcarryulevozanavedenibrojmesta(neposrednioperandili
registarcl).Ukolikoserotirazavieodjednogmesta,indikatoroverflowjenedefinisan.

rcr cnt, dst

M/?

TM

Rotiraodredinioperandkrozindikatorcarryudesnozanavedenibrojmesta(neposrednioperand
iliregistarcl). Ukolikoserotirazavieodjednogmesta,indikatoroverflowjenedefinisan.

ret

Povratak iz potprograma. Povratna adresa se skida sa vrha steka, nakon ega se vrednost
pokazivaanavrhstekapoveaza4.

rol cnt, dst

M/?

Rotira odredini operand u levo za navedeni broj mesta (neposredni operand ili registar cl).
Ukolikoserotirazavieodjednogmesta,indikatoroverflowjenedefinisan.Indikatorcarryimavrednost
poslednjegbitaupisanognanajmanjeznaajnupoziciju.

ror cnt, dst

M/?

Rotira odredini operand u desno za navedeni broj mesta (neposredni operand ili registar cl).
Ukolikoserotirazavieodjednogmesta,indikatoroverflowjenedefinisan.Indikatorcarryimavrednost
poslednjegbitaupisanognanajvieznaajnupoziciju.
sar cnt, dst

M/?

Pomeraodredini operandudesnozanavedenibrojmesta(neposredni operandiliregistar cl).


Naznaajnijibitzadravasvojuvrednost.Ukolikosepomerazavieodjednogmesta,indikatoroverflow
jenedefinisan.Indikatorcarryimavrednostposlednjegbitaistisnutogsanajmanjeznaajnepozicije.

sbb src, dst

TM

Oduzima izvorni operand od odredinog i rezultat smeta u odredini operand. Prilikom


oduzimanja,zateeniprenosseuzimauobzir.

shl cnt, dst

M/?

Pomera odredini operand u levo za navedeni broj mesta (neposredni operand ili registar cl).
Najmanjeznaajnibitdobijavrednost0.Ukolikosepomerazavieodjednogmesta,indikatoroverflow
jenedefinisan.Indikatorcarryimavrednostposlednjegbitaistisnutogsanajvieznaajnepozicije.

Pregled korienih naredbi

shr cnt, dst

Strana 62
o

M/?

Pomeraodredini operandudesnozanavedenibrojmesta(neposredni operandiliregistar cl).


Naznaajnijibitdobijavrednost 0. Ukoliko sepomera zavie od jednogmesta, indikator overflow je
nedefinisan.Indikatorcarryimavrednostposlednjegbitaistisnutogsanajmanjeznaajnepozicije.

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

sub src, dst

Oduzima izvorni operand od odredinog i rezultat smeta u odredini operand. Prilikom


oduzimanja,zateeniprenosseneuzimauobzir.

test src, dst

VrioperacijulogikogIizmeukorespondentnihbitaizvornogiodredinogoperanda,postavlja
indikatoreuskladusatim,alinemenjaodredinioperand.

xchg src, dst

Zamenjujevrednostiizvornogiodredinogoperanda.

Pregled korienih naredbi

xor src, dst

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

Dodatak A: Adresiranja procesora Intel 80386

Strana 64

Dodatak A: Adresiranja procesora Intel 80386


Procesor 80386 podravavieadresiranjamemorije:direktno,indirektno,indeksno,neposrednoi
registarsko,kaoikombinacijeovihadresiranja.Optiformatadresiranjamemorijeje:
adresa(%baza, %indeks, mnoilac)
priemususvapoljaopciona.Adresamemorijskelokacijeseizraunavapoformuli
adresa + baza + mnoilac*indeks
Polje adresa morabitikonstanta, mnoilac morabitikonstantaizskupa{1,2,4,8},dok baza i
indeks moraju biti registri opte namene (pri emu se registar esp ne moe koristiti kao indeks).
Ukolikosenekoodpoljanenavede,podrazumevasedaje0,osimzamnoilacijajepodrazumevana
vrednost1.Trebaobratitiipanjunainjenicudakodnaredbisadvaoperanda,samojedanodnjihmoe
bitimemorijski.
Direktnoadresiranjeimasamopoljeadresa:
movl %eax, 0x1234
movl %eax, labela1

#eax -> lokacija 123416=466010


#eax -> lokacija labela1

Indirektnoadresiranjesadrisamopoljebaza:
movl %eax, (%ebx)

#eax -> lokacija ija je adresa u ebx

Baznoadresiranjesadripoljaadresaibaza:
movl %eax, 87(%ebx)

#eax -> lokacija ija je adresa ebx+87

Indeksnoadresiranjesadripoljaadresa,indeksieventualnomnoilac:
movl %eax, 1234(,%ecx)

#eax -> lokacija 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.

Dodatak B: Prevoenje programa korak po korak

Strana 65

Dodatak B: Prevoenje programa korak po korak


Prilikom prevoenja programa korienjem gcca, praktino se obavljaju tri koraka: makro
pretprocesiranje,prevoenjeasemblerskogkdauobjektniipovezivanjeobjektnogkdasasistemskim
bibliotekama.Svakiodovihkorakasemoeodraditiizasebno:
ZamakropretprocesiranjeasemblerskogkdasekoristiCpretprocesorgcca:
gcc -m32 -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
asembliranjesekoristikomandaas(GNUassembler)kojomsepozivaasembler:
as --gdwarf2 primer.s -o primer.o
Opcija--gdwarf2omoguavadibagiranjeprograma.Akojeprevoenjeprolobezgreaka,sistem
evratitikomandnipromptneispisujuinikakvedodatneporuke.Linkovanjeobavljaprogramld(GNU
linker):
ld primer.o -o primer
Linkerepovezatifajlprimer.o,nastaokaorezultatasembliranja,ikreiratiizvrnifajlprimer.

Dodatak C: Konverzije brojeva u binarnom znakovnom obliku

Strana 66

Dodatak C: Konverzije brojeva u binarnom znakovnom


obliku
Konverzija celih binarnih brojeva iz internog oblika u znakovni
oblik
Programna Cuzakonverzijuizinternogoblikauznakovnioblikcelogbinarnogbrojaiobrtanje
rezultujuegnizaprikazanjenaslici19.
Kodasemblerskeverzijeovogalgoritma,zabinarnizapisjepredvieno33bajta,tojedovoljnoza
brojujednostrukojpreciznostiizavrniNUL.Smprogramdatjeunastavkuteksta.
Program koristi specifinosti binarnog brojnog sistema, pa tako, deljenje sa 2 nije realizovano
pomou naredbe div, nego su iskoriene naredbe za pomeranje i rotiranje kako bi se ostatak pri
deljenjusa2direktnoprebaciouregistarbl.
#include <ctype.h>
extern const char *b;
char *s, *t;
s = t = (char *) b;
do {
*t++ = (r & 1) + '0';
r >>= 1;
} while (r);
*t-- ='\0';
while (s < t) {
char c = *s;
*s++ = *t;
*t-- = c;
}
Slika 19: Konverzija iz internog formata u binarni znakovni format

Asemblerskaverzijaprogramaizgleda:

Dodatak C: Konverzije brojeva u binarnom znakovnom obliku


bin_br_duz = 33
bin_br: .fill bin_br_duz,1,0
...
movl $31337, %eax
leal bin_br, %edi
bin_cifra:
shrl $1, %eax
rclb $1, %bl
andb $1, %bl
addb $'0', %bl
movb %bl, (%edi)
incl %edi
andl %eax, %eax
jnz bin_cifra
movb $0, (%edi)
decl %edi
leal bin_br, %esi
obrni:
cmpl %edi, %esi
jae kraj
movb (%esi), %ah
movb (%edi), %al
movb %al, (%esi)
movb %ah, (%edi)
incl %esi
decl %edi
jmp obrni
kraj:
movl $1, %eax
movl $0, %ebx
int $0x80

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

Konverzija razlomljenih binarnih brojeva iz internog oblika u


znakovni oblik
Razlomljenbroj,udecimalnomzapisuoblika

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.

Dodatak C: Konverzije brojeva u binarnom znakovnom obliku


bin_br_duz = 33
bin_br: .fill bin_br_duz,1,0
...
movl $375000000, %eax
leal bin_br, %edi
movl $32, %ecx
bin_cifra:
movb $'0', %dl
addl %eax, %eax
cmpl $1000000000, %eax
jb nije_vece
incb %dl
subl $1000000000, %eax
nije_vece:
movb %dl, (%edi)
incl %edi
andl %eax, %eax
jz kraj_bin
loopl bin_cifra
kraj_bin:
movb $0, (%edi)
kraj:
movl $1, %eax
movl $0, %ebx
int $0x80

Strana 68

#broj za konverziju
#max broj cifara

#1 ili 0?
#oduzimanje jedinice

#kraj algoritma?
#ima jo mesta u stringu?
#kraj stringa

Konverzija razlomljenih binarnih brojeva iz znakovnog oblika u


interni oblik
Binarnirazlomakoblika

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.

Dodatak C: Konverzije brojeva u binarnom znakovnom obliku

Strana 69

bin_br: .ascii "1000100010110100\0"


greska: .byte 0
...
leal bin_br, %esi
movb $0, greska
xorl %ebx, %ebx
xorl %ecx, %ecx
bin_cifra:
cmpl $32, %ecx
#vie od 32 cifre?
ja i_greska
movb (%esi), %al
andb %al, %al
#kraj stringa?
jz kraj_bin
subb $'0', %al
#izdvajanje cifre
jc i_greska
cmpb $1, %al
ja i_greska
shrb $1, %al
#ubacivanje cifre u broj
rcll $1, %ebx
jc i_greska
#provera prekoraenja
incl %esi
incl %ecx
jmp bin_cifra
i_greska:
incb greska
jmp kraj
kraj_bin:
jecxz i_greska
#prazan string?
xorl %eax, %eax
razl_poz:
shrl $1, %eax
#rezultat/2 -> rezultat
shrl $1, %ebx
#izdvajanje binarne cifre
jnc nije_jedan
addl $500000000, %eax
nije_jedan:
loopl razl_poz
kraj:
movl $1, %eax
movl $0, %ebx
int $0x80
Brojobraenihbinarnihcifaramorasepamtiti(ecx)jersezaproveruuslovakrajakonverzijene
moe iskoristiti nulta vrednost registra sa internim oblikom vrednosti, poto su vodee nule u
razlomljenombrojubitne.

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

Primer 1 - makro sistemskog poziva exit


.macro kraj_rada greska=$0
movl $1, %eax
movl \greska, %ebx
int $0x80
.endm
Pozivanjemakroakraj_radabezparametarabidalosledeusekvencuprograma:
movl $1, %eax
movl $0, %ebx
int $0x80
dokbipozivanjeistogmakroasaparametrom$3dalosledeusekvencuprograma:
movl $1, %eax
movl $3, %ebx
int $0x80

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

Primer 2 - makro za oznaeno celobrojno deljenje sa 10


Proizvod10xmoesenapisatiikao8x+2x.Potosu8i2stepenibroja2,mnoenjenjimasvodise
nauzastopnopomeranjeulevoilisabiranjeoperandasasamimsobom.Sledeimakromnoioznaeni
celobrojnioperandujednostrukojpreciznostibrojemdesetkoristeitakvorazlaganje.
.macro mnozi10o regmem
pushl %eax
movl \regmem, %eax
pushl %ebx
addl %eax, %eax
jo 1f
movl %eax, %ebx
addl %eax, %eax
jo 1f
addl %eax, %eax
jo 1f
addl %ebx, %eax
1:
popl %ebx
movl %eax, \regmem
popl %eax
.endm

#registar (osim eax) ili mem. Lokacija

Ovajmakroostavljarezultatmnoenjauregistruilimemorijskojlokacijinavedenojkaoargument
(jedinosenemoekoristitiregistareax).Sadrajsvihregistara(osimodredinog,akojekaoargument
navedenregistar)seuva.Usluajuizlaskavanopsegabiepostavljenindikatoro.

Primer 3 - makro za odreivanje tipa znaka


Kodobradestringovaestojepotrebnoispitivatitippojedinihznakova.NaCusuzatozaduene
funkcijedeklarisaneustandardnomzaglavlju <ctype.h>.Naprimer, isspace ispitujedalijeznak
delimiter(nekiodznakovazarazdvajanje),a isdigit proveravadalijeznakcifradekadnogbrojnog
sistema.Ovefunkcijeseestoimplementirajukaomakroi,dabisekodispitivanjavelikogbrojaznakova
izbegaotroakfunkcijskogpozivazasvakiobraenznak.
Efikasan metod ispitivanja zahteva postojanje tabele ija veliina u bajtovima odgovara broju
moguihznakova.Za8bitnitipcharovoznaiutroakod256bajtova.Svakibajtutabelijebitmaska
nastala kombinovanjem (pomou logikog ILI) konstanti za klase kojima pripada odgovarajui znak.
Konstantezapojedineklasesurazliitistepenibroja2.Lokacijabitmaskezaodreeniznakdobijase
indeksiranjemtabelenjegovimkodom,tojeoperacijasloenostiO(1).
Tabelabimogladaizgledaovako:

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

#8-bitni registar ili memorija

.macro isdigit character


isclass \character, _IS_DIG
.endm

#8-bitni registar ili memorija

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.

Dodatak E: Mainska normalizovana forma

Strana 73

Dodatak E: Mainska normalizovana forma


Primer mainske normalizovane forme
Mainskanormalizovanaformajenainpredstavljanjarealnihbrojevauraunaru.Sastojiseod
znaka,podeenogeksponentaifrakcije.Ukolikose,naprimer,usvojidasezaeksponentrezervie8bita
(IEEEstandardza32bitnumainskunormalizovanuformu),tadase32bitnavrednostmoeposmatrati
nasledeinain:

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

Slika 20: Broj u mainskoj normalizovanoj formi sa 8 bita za eksponent


Zaznakjerezervisananajviapozicijaubrojuimoeimativrednost0(pozitivno)ili1(negativno).
U sledeih 8 bita se nalazi podeeni eksponent. U ovom sluaju konstanta podeavanja iznosi
100000002, pa je vrednost upisanog eksponenta 112. Maksimalna vrednost podeenog eksponenta je
111111112,dokjeminimalna000000012(vrednost000000002jerezervisanazapredstavljanjenule).
Frakcijasepredstavljasapreostalih23bita,stimdasenajznaajnijacifrafrakcije(kojajeuvek1)
neupisuje,imesedobijaveatanost.Toznaidauovomprimeruvrednostfrakcijeustvariiznosi
1011111110000000000111112.

Izdvajanje delova mainske normalizovane forme


Prebilokojeoperacijesabrojevimaumainskojnormalizovanojformi,potrebnojeizdvojitidelove
odkojihseonisastoje:znak,eksponentifrakciju.Zatosekoristimaskiranjeipomeranje.Uprimerusa
slike 20, znak se moe izdvojiti maskiranjem najznaajnijeg bita. Eksponent se moe izdvojiti
maskiranjem bita na pozicijama od 23 do 30, pomeranjem dobijene vrednosti udesno za 23 mesta i
oduzimanjemkonstantepodeavanja.Frakcijasemoeizdvojitimaskiranjembitanapozicijamaod0do
22idodavanjempodrazumevanejedinicenapoziciju23.
Za neke operacije je zgodno ukljuiti znak broja u mainskoj normalizovanoj formi u izdvojenu
frakciju,parukovanjeznakom rezultatastavitiunadlenostaritmetikihnaredbiprocesora. Takoe,
posebnotrebavoditiraunaiovrednosti0(nula).

Operacije sa brojevima u mainskoj normalizovanoj formi


Prilikomobavljanjaoperacijasabrojevimaumainskojnormalizovanojformi,trebaimatinaumu
dajefrakcijaustvariskaliranrazlomljenbroj.Uprimerusaslike20,konstantaskaliranjaje223.Znak
semoetretiratiiliposebnoilisemoeukljuitiufrakciju.
Sabiranjeioduzimanjesesvodenasledeeoperacije:

dovoenjeeksponenatanaistuvrednost(manjisedovodinavrednostveeg,uzpomeranjefrakcije)

sabiranje,odnosnooduzimanjefrakcija

Dodatak E: Mainska normalizovana forma

Strana 74

Mnoenjesesvodinasledeeoperacije:

sabiranjeeksponenata

mnoenjefrakcija

deljenjerezultatakonstantomskaliranja
Deljenjesesvodinasledeeoperacije:

oduzimanjeeksponenata

mnoenjerezultatakonstantomskaliranja

deljenjefrakcija

Nakonobavljanjabilokojeodoperacija,neophodnojeobavitinormmalizacijurezultata,odnosno
obezbeditidasenajznaajnijacifraufrakcijinalazinaodgovarajuojpoziciji(uprimerusaslike20,toje
pozicija23).Ukolikoseprilikomnormalizacijemenjafrakcija,neophodnojemenjatiieksponent,takoda
vrednostbrojaostaneista.

Sastavljanje broja u mainskoj normalizovanoj formi


Kadajerezultatoperacijenormalizovan,moesespakovatiu32bitnibrojpostupkomobrnutimod
izdvajanjadelova.Pritometrebavoditiraunaioznakuizdvojenefrakcije,ukolikojeonukljuenunju
(utomsluajugatrebaizdvojiti).Zaprimersaslike 20,toznaidaseizfrakcijeobrienajznaajnija
jedinica,anaeksponentsedodakonstantapodeavanjaitavrednostsepomeriulevoza23pozicije.Ove
vrednostisezatim,upotrebomlogikihoperacija,zajednosavrednouznaka,iskombinujeujedinstvenu
32bitnu vrednost. Pri sastavljanju posebno treba obratiti panju na vrednost 0 (nula), poto se ona
drugaijetretira.

Domai zadatak
1. Napisati potprogram za konverziju stringa koji predstavlja binarnu decimalnu vrednost oblika
1011.011uvrednostumainskojnormalizovanojformisa10bitarezervisanihzaeksponent.
int BinStrToMNF(char* string, int* vrednost)
Povratnavrednostpotprogramaje0akonijebilogrekeprikonverziji,odnosno1akojeste.

Dodatak F: Shell skriptovi

Strana 75

Dodatak F: Shell skriptovi


Shellskriptovi(script;udaljemtekstuskriptovi)suprogramikojiseizvravajuuokvirushella.
To moe biti jednostavno niz komandi koje treba izvriti jednu za drugom, a koji se relativno esto
ponavlja.Skriptovimogubitiiznatnokomplikovanijiprogrami,poto bash podravamnogeelemente
strukturnogprogramiranja.

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

Dodatak F: Shell skriptovi

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:

Dodatak F: Shell skriptovi

Strana 77

[<razmak>operator<razmak>operand<razmak>] (za unarne operatore)


[<razmak>operand1<razmak>operator<razmak>operand2<razmak>] (za binarne)
Operandi mogu biti promenljive ili konstante (string ili brojevi). Neki od operatora su dati u
sledeojtabeli:
Operator

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:

Dodatak F: Shell skriptovi

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.

Dodatak F: Shell skriptovi

Strana 79

Specijalne shell promenljive


Promenljiva

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

Dodatak G: ASCII tabela

Strana 80

Dodatak G: ASCII tabela


Decimal Octal
------- ----000
000
001
001
002
002
003
003
004
004
005
005
006
006
007
007
008
010
009
011
010
012
011
013
012
014
013
015
014
016
015
017
016
020
017
021
018
022
019
023
020
024
021
025
022
026
023
027
024
030
025
031
026
032
027
033
028
034
029
035
030
036
031
037
032
040
033
041
034
042
035
043
036
044
037
045
038
046
039
047
040
050
041
051
042
052
043
053
044
054
045
055
046
056
047
057
048
060
049
061
050
062
051
063
052
064
053
065
054
066
055
067
056
070
057
071
058
072
059
073
060
074
061
075
062
076

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)

Dodatak G: ASCII tabela


Decimal Octal
------- ----063
077
064
100
065
101
066
102
067
103
068
104
069
105
070
106
071
107
072
110
073
111
074
112
075
113
076
114
077
115
078
116
079
117
080
120
081
121
082
122
083
123
084
124
085
125
086
126
087
127
088
130
089
131
090
132
091
133
092
134
093
135
094
136
095
137
096
140
097
141
098
142
099
143
100
144
101
145
102
146
103
147
104
150
105
151
106
152
107
153
108
154
109
155
110
156
111
157
112
160
113
161
114
162
115
163
116
164
117
165
118
166
119
167
120
170
121
171
122
172
123
173
124
174
125
175
126
176
127
177

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)

Dodatak H: este greke prilikom programiranja

Strana 82

Dodatak H: este greke prilikom programiranja


Prilikom pisanja asemblerskih programa se mora voditi rauna o tome da se kod takvog
programiranja pristupa hardveru na veoma niskom nivou i da asemblerski jezik nema mogunost
provereraznihtipovagreakakojemogubitiprijavljeneprilikomradasaprogramskimjezicimavieg
nivoa.
Tokomgodinauoenojedastudentinavebamaestopraveneketipinegrekeprilikompisanja
asemblerskihprograma.Uovompoglavlju ebitireioovimgrekama,kaoiogrekamakojemogu
nastatiprilikomkorienjaalataizkomandnelinije.

Editovanje jednog, a prevoenje drugog programa program ne radi kako treba


Pretpostavimo da postoje direktorijumi ~/vezba1/ i ~/vezba2/ i da se u oba nalazi fajl
program.S.Ukolikokorisnikimaueditoruotvorenfajl ~/vezba1/program.S,akomandnalinijaza
prevoenjesenalaziu ~/vezba2/,doiedosituacijedaseprogrammenja,alineradikakotreba.
Prilikom radasaalatimaizkomandnelinijetrebaobratitipanjunatodasekomandeizvravajuu
ispravnojputanji.

Prilikom prevoenja nije naveden naziv fajl a iza -o


Primerispravnogpozivanjakompajlerauzkorienjeopcije-oje:
gcc -g -o program program.S
Meutim,akosekompajlerpozovesa
gcc -g -o program.S program
onotoesedesitijedasepokuaprevoenjefajlaprogramidaserezultattogprevoenjanadiskupie
kao program.S,imeeefektivnoizvornikodbitiobrisan.Daseizvornikodnebiizgubio,korisnoje
uvekgadratiotvorenogueditoru,kakobisemogaoponovosnimitinadiskusluajuovakvegreke
(editorjeobinopodeendauvaprethodnuverzijutekstaprogramakaoprogram.S~).

Pokretanje dibagera ukoliko je bilo greaka prilikom prevoenja


Akojeprevoenjeprogramaprolobezgreke,tadaeizlaznakonpozivanja gccabitiprazani
tada ima smisla pokrenuti program u dibageru. Meutim, ako je bilo greaka prilikom prevoenja
(odnosno,akojebilonekogizlazaprilikompozivanjagcca),tadaizvrnifajlnijekorektan,iliakine
postoji.Utakvojsituacijinemasmislapokretatidibager,negojeprvopotrebnoispravitigreku/greke.

Pokretanje dibagera sa navoenjem izvornog umesto izvrnog fajla


Ukolikopostojiprogram.Sinjegovizvrnioblikprogram,tadasedibagerpozivasa:
ddd program
Meutim,akosedibagerpozovesa
ddd program.S
prozordibageraebitiprazan,potoprogram.Snijeizvrnifajl.

Nerazlikovanje znakova l (malo L)i 1, odnosno O (veliko o) i 0


Osobekojesetekupoznajusasintaksomasemblerskogjezikaponekadnenapraverazliku
izmeuznakoval(maloslovoL)i1(cifra1),atakoeiizmeuO(velikoslovoo)i0(cifra0):
mov1 $5, %eax
movb $O, %ah
Naravno,ovakvagrekaneeproinezapaenoodstranegcca:

Dodatak H: este greke prilikom programiranja

Strana 83

Error: no such instruction: `mov1 $5,%eax'


odnosno:
/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crt1.o: In
function `_start':
(.text+0x18): undefined reference to `main'
/tmp/cccund9p.o:(.text+0x1): undefined reference to `O'
collect2: ld returned 1 exit status

Smetanje naredbi u sekciju podataka program nee da se pokrene


Ukolikosenapieprogramkodkogasekdnalaziusekcijipodataka:
.section .text
.section .data
.globl main
main:
a
.long 1
b
.long 2
movl a, %eax
addl b, %eax
prilikom prevoenja se nee prijaviti nikakva greka (poto je u asembleru ovako neto dozvoljeno
uraditi),alisenakonprevoenjatakavprogramneemoipokrenuti,potonemanijednunaredbuu
sekcijikda.

Smetanje promenljivih u sekciju kda


Ukolikosenapieprogramkodkogasepromenljivenalazeusekcijikda:
.section .data
.section .text
.globl main
main:
a
.long 1
b
.long 2
movl a, %eax
addl b, %eax
prilikom prevoenja se nee prijaviti nikakva greka (poto je u asembleru ovako neto dozvoljeno
uraditi), ali e se nakon prevoenja i pokretanja takvog programa najverovatnije javiti greka
Segmentationfault, poto e se pokuati izvravanje ili menjanje naredbi nastalih prevoenjem
podataka.

U programu ne postoji .globl main ili main:


Ukoliko u programu ne postoji direktiva .globl main, ili ako nema labele main:, prilikom
prevoenjalinkereprijavitigreku:
/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crt1.o: In function
`_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status

Korienje konstante bez znaka $


Ukolikojeuprogramukoritenakonstantabezznaka$,naprimer:
movl 5, %eax
prilikomizvravanjatelinije,desiesegrekaSegmentationfault,potojeprogrampokuaodaitasa
lokacije5(direktnoadresiranje),umestodaradisakonstantom(neposrednoadresiranje).

Dodatak H: este greke prilikom programiranja

Strana 84

Dibager se zaglavio - beskonana petlja


Ukoliko u programu postoji beskonana petlja (ili petlja koja se veoma dugo izvrava), moe
izgledatikaodadibagerneradi:
petlja:
movl $0, %ecx
...
incl %ecx
cmpl $10, %ecx
jne petlja
Meutim,ukolikosepogledadonjidesniugao,moesevidetitrepuizelenikvadratkojioznaava
da se program trenutno izvrava (takoe se na trenutke moe videti i strelica koja oznaava tekuu
naredbu).Programkojijeupaoubeskonanupetljusemoeprekinutikomandomdibagera Interrupt
(nalazisenapanelusakomandama),pasemoeizvravatidaljekorakpokorakkakobiseotkrilotase
ustvaridesilo.

Istovremeno korienje registara koji se preklapaju za razliite namene


Razmotrimosituacijuukojojimamoprogramkojinetoraunasaregistromeax,ijoistovremeno
koristi,naprimer,registaraxzasmetanjenekeprovremenevrednosti:
movl $0, %eax
movw $1, %ax
incl %eax
cmpl $50, %eax
jne L1
movl $2, %ax
L1:
...
imseuaxupienovaprivremenavrednost,timeesepokvaritiiregistareax,odnosnorezultat
raunanja.Takoe,akosepromenivrednostregistraeax,toseautomatskiodraavainaax.Unajveem
brojusluajevane trebaistovremenokoristitii32bitni/16bitniregistarinjegoveniedelove(ukoliko
postoje).

Korienje registra ebp, odnosno esp za smetanje podataka


Moe se napisati asemblerski program koji eregistar esp, odnosno ebp koristiti za smetanje
podatakaikojieraditikadsepokreneizdibagera.Meutim,ovadvaregistraimajuiposebnunamenu
prilikomradasastekom.Potojejedanodciljevaovogkursapisanjeasemblerskihpotprogramakojise
moguukljuitiuprogramenapisaneuviimprogramskimjezicima,ovakvaupotrebaovihregistarasamo
moedovestidoneispravnogprograma.

Prebacivanje svih argumenata u registre odmah na poetku potprograma


Razmotrimo sluaj potprograma sa dva parametra koji se prenose po vrednosti i treeg koji se
prenosipoadresi,namenjenogzasmetanjerezultata.Potopristuptreem argumentupodrazumeva
nekuvarijantuindirektnogadresiranja,onseprekorienjamorasmestitiuregistar.Pretpostavimoda
susvatriargumentanapoetkupotprogramasmetenauregistre.Ukolikojeproraunsloeniji,lakose
moedesitida eupotprogramuponestati slobodnihregistara.Uovakvojsituaciji,smetanjeadrese
rezultata u registar odmah na poetku potprograma je pogreno, poto je ta adresa potrebna tek na
kraju,kadseproraunzavriinemapotrebedazauzimaregistartokomradaglavnogdelapotprograma.
Generalnopravilobibilodaseuregistresmetajuonevrednostikojesenajeekoristeupotprogramu,
itoneposrednoprenjihoveupotrebe.Akojenekiargumentprenetpovrednosti,akoristisenasvegapar
mesta,trebavidetidalisemoekoristitidirektnosasteka,bezsmetanjauregistar.

Sekcija za kd/podatke nazvana text/data (bez take)


Takaunazivimaasemblerskihdirektivajeobavezandeoimena,kaoibilokojedrugoslovo.Akose
izostavi, prevodilac esmatrati dajekorisnik hteodanapravi sopstvenusekcijusapodacima(to je

Dodatak H: este greke prilikom programiranja

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

Loe iskomentarisan kd / odsustvo komentara


Poto svi asemblerski programi veoma lie jedan na drugi na prvi pogled, ukoliko nisu
iskomentarisanikakotreba,veomalakoseposlenekogvremenamoezaboravitinjihovanamena,pa
trebapotroitivremekakobiseotkrilotajepisachteodakae(akikadjepisactaistaosoba).
Komentariukdutrebadaukratkimcrtamaopiupojedinecelineuprogramu,ilimestazakojase
smatra danisu jasna na prvi pogled (obino nema smisla komentarisati svaku liniju). Komentari ne
trebadaopisujuoiglednestvari.Loikomentarisamomogudadoprinesukonfuzijiprilikomkasnije
analize.

Dodatak H: este greke prilikom programiranja


#loe iskomentarisan kod
main:
movl $niz, %esi
movl $NELEM-1, %edi
movl $0, %eax
petlja:
addl (%esi, %edi, 4), %eax
decl %edi
jns petlja
kraj:
movl %eax, suma
movl $1, %eax
movl $0, %ebx
int $0x80

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

You might also like