You are on page 1of 84

Praktikum raunarskih vebi za predmet Arhitektura raunara Autori: arko ivanov Ivan Nejgebauer Miroslav Hajdukovi Novi Sad,

2006.

Sadraj I Sadraj 1. Uvod u korienje Linux operativnog sistema...................................... ......................... 1 1.1. Prijavljivanje na sistem....................... .................................................................... 1 1.2. Mogun osti Linux-a.................................................................... .............................1 1.3. Otvaranje shell-a (bash).................... ...................................................................... 2 1.4. Or ganizacija direktorijuma........................................................ ............................. 3 1.5. Osnovne komande bash-a..................... .................................................................. 3 Kretanje po stablu direktorijuma i listanje fajlova........................................ ............. 3 Manipulacija fajlovima i direktorijumima........................ .......................................... 4 Prikaz sadraja fajla i pretraivanje.. .........................................................................5 Alias -i.............................................................................. ............................................5 Preusmeravanje standardnog ulaza i izlaza i pajpovi................................................ 6 Izvravanje pr ograma u pozadini............................................................... ................ 6 1.6. Programi za manipulaciju fajlovima...................... ..................................................6 1.7. Tekst editori.......... ................................................................................ .................. 7 1.8. Korisni linkovi....................................... .................................................................. 7 2. Shell sk riptovi......................................................................... ....................................... 8 2.1. Jednostavni skriptovi............ ................................................................................ ...8 2.2. Promenljive........................................................... .................................................. 8 2.3. Upravljake strukture... ................................................................................ .......... 9 2.4. Petlje........................................................ ............................................................. 10 2.5. Domai zadac i............................................................................... ........................ 12 2.6. Korisni linkovi................................ ....................................................................... 12 3. As emblerski programi.............................................................. ....................................13 3.1. Programski model procesora Intel 803 86.............................................................13 3.2. AT&T sint aksa............................................................................ ...........................14 3.3. Naini adresiranja memorije.................... .............................................................14 3.4. Alati: pret procesor, asembler, linker, dibager............................................. .........15 3.5. Primer: izraunavanje NZD........................................ .......................................... 18 3.6. Domai zadaci.................. ................................................................................ ..... 19 4. Dvostruka preciznost. Nizovi........................................ ...............................................20 4.1. Neoznaeni i oznaeni brojevi .............................................................................. 2 0 4.2. Manipulacija bitima...................................................... ........................................ 20 Naredbe za pomeranje i rotiranje.... ........................................................................ 20 4.3. Definisanje podataka........................................................... ..................................22 4.4. Sabiranje u dvostrukoj preciznosti.... ................................................................... 22 4.5. Mnoen je i deljenje pomou sabiranja i oduzimanja....................................... ..... 24 4.6. Pomeranje i rotiranje u dvostrukoj preciznosti.................... .................................25 4.7. Negacija u dvostrukoj preciznosti...... ...................................................................26 4.8. Prime r: brojanje dana iz odreenog perioda godine......................................

...... 26 4.9. Domai zadaci...................................................... ................................................. 28 5. Potprogrami............. ................................................................................ .................... 29 5.1. Prenos argumenata preko registara.................. ................................................... 29 5.2. Prenos argumenata pr eko steka....................................................................... .... 30 5.3. Prenos argumenata po vrednosti i po adresi......................... ............................... 32 5.4. Rekurzija............................... ................................................................................ 32 5.5. Domai zadaci............................................................ ........................................... 33 6. Konverzije razliitih brojnih os nova u interni format.................................................. 34 6.1. Konverzija iz znakovnog oblika (ceo dekadni broj) u interni oblik............... ........ 34 6.2. Konverzija iz znakovnog oblika (razlomljeni dekadni broj) u int erni oblik...........36 6.3. Konverzija iz znakovnog oblika (razlomljeni binarni broj) u interni oblik............ 36 6.4. Opti suaj konverzije iz znakovnog oblik a (razlomljeni broj) u interni oblik..... 37 6.5. Domai zadaci................... ................................................................................ .... 38

Sadraj II 7. Konverzije iz internog formata u razliite brojne osnove.............. .............................39 7.1. Konverzija iz internog oblika u znakovni ob lik (ceo dekadni broj)....................... 39 7.2. Konverzija iz internog obl ika u znakovni oblik (ceo binarni broj)........................ 40 7.3. Konverzi ja iz internog oblika u znakovni oblik (razlomljeni binarni broj)............ 41 7.4. Opti sluaj konverzije iz internog oblika u znakovni oblik (razlomljeni broj) ..... 42 7.5. Domai zadaci....................................................... ................................................ 42 8. Kontrolna suma i paritet. ................................................................................ .............43 8.1. Domai zadatak............................................... ......................................................44 9. Ulaz, izlaz i makroi ................................................................................ ...................... 45 9.1. Sistemski pozivi................................. ....................................................................45 9.2. Ulaz , izlaz i zavretak programa...................................................... .....................45 9.3. Makroi............................................. ......................................................................47 9.4. Do mai zadaci....................................................................... ................................ 49 10. Asinhroni dogaaji........................ ............................................................................. 50 10.1. Prekidi.................................................................. ...............................................50 10.2. Signali................. ................................................................................ ................ 50 10.3. Domai zadatak.......................................... .........................................................52 11. Pregled korienih n aredbi.......................................................................... ..............53 12. Dodaci..................................................... ................................................................... 60 12.1. ASC II tabela....................................................................... ................................. 60

Uvod u korienje Linux operativnog sistema Strana 1 1. Uvod u korienje Linux operativnog sistema Operativni sistem (OS) Linux [1] je namenjen za razne hardverske platforme, izmeu ostalog i za Intel x86 platformu. Linux je pod GPL (General Public License) lic encom [2], to znai da je njegov izvorni kod svima dostupan i da se moe slobodno kor istiti, bez plaanja licence za njegovo korienje. Za Linux postoji vie razliitih distr ibucija. Distribucija predstavlja instalacionu verziju Linux-a, u kojoj se, pore d samog OS-a, nalaze i brojni programi. Firme i organizacije koje nude distribuc ije Linux-a u svojoj ponudi imaju kako besplatne, tako i komercijalne distribuci je. Neke od poznatijih distribucija su Mandrake, Debian, SuSE, RedHat, Knoppix [ 3]. Linux je savremen OS sa modernim grafikim okruenjem i podrkom za mnoge hardvers ke ureaje. Za njega su razvijene brojne aplikacije koje se obino isporuuju u okviru distribucije. 1.1. Prijavljivanje na sistem Linux se moe instalirati tako da koegzistira sa nekim ve postojeim OS-om na raunaru. Prilikom ukljuivanja raunara korisniku se nudi izbor koji od operativnih sistema e li da pokrene. Po pokretanju Linux-a od korisnika se oekuje da unese svoje korisn iko ime i lozinku, ime se prijavljuje na sistem (tzv. logovanje). Treba obratiti p anju na to da Linux pravi razliku izmeu malih i velikih slova (on je case sensitiv e). Tako, na primer, imena pera i Pera oznaavaju dva razliita korisnika. Nakon usp enog prijavljivanja, OS je spreman za rad. Na kraju rada neophodna je odjava sa o perativnog sistema. To se obavlja izborom opcije Logout iz sistemskog menija. Od javljivanje je neophodno, poto je korisnicima pod Linux-om dozvoljeno da manipuliu samo svojim fajlovima. Ako se raunar ostavi bez odjavljivanja, nekom drugom se d aje mogunost da pristupi fajlovima neodjavljenog korisnika. 1.2. Mogunosti Linux-a Grafiko okruenje Linux-a sadri radnu povrinu (desktop), ikone, menije, taskbar, stre licu mia. U distribuciji Linux-a stie i vei broj programa za razne primene. Tako, s tandardno se u distribucijama nalaze programi za rad sa elektronskom potom, inter netom, fajlovima, programi za putanje muzike i videa u razliitim formatima (mp3 i DivX su, naravno, podrani), programi za obradu grafike i zvuka, office paketi, pr ogrami za narezivanje CD-ova, programi za podeavanje sistema, razvojna okruenja, i gre i jo mnogo toga. Linux je takoe veoma zastupljen kao serverska platforma, naroi to na raunarima povezanim na internet. Veliki deo web stranica se nalazi pod upra vom programa Apache, ije je osnovno okruenje upravo Linux. Za Linux OS, kao i za s koro sav softver koji stie uz njega, se moe dobiti i izvorni kod, koji moe stii i u distribuciji, a moe se nai i na Internetu. Ovo daje mogunost krajnjim korisnicima d a promene delove koji im ne odgovaraju, naravno, pod pretpostavkom da su dovoljn o struni da urade tako neto. Ovo takoe daje mogunost programerima irom sveta da uestvu ju u razvoju Linux-a i programa iz njegove distribucije.

Uvod u korienje Linux operativnog sistema Strana 2 Slika 1: Linux sa KDE okruenjem 1.3. Otvaranje shell-a (bash) Komunikaciju sa korisnikom putem komandne linije omoguuje program koji se zove sh ell, i koji ima ulogu interpretera komandi. Najee korieni shell je bash (Bourne Again Shell), koji je obino podrazumevani shell u Linux distribucijama i koji e se i ov de koristiti. Jedan od naina pokretanja shell-a je posredstvom terminal emulatora . Terminal emulator se otvara klikom na njegovu ikonu u donjem delu ekrana, ime s e u okviru njega automatski pokree i bash. Nakon pokretanja bash-a, ispisuje se n jegov odziv, odnosno prompt. Podrazumevani izgled prompt-a je: [user@computer download]$.

Re user oznaava korisniko ime, computer je naziv raunara na kome je korisnik prijavlj download je naziv tekueg direktorijuma, a $ je oznaka da je prijavljen obian korisnik . Kada je prompt ispisan na ekranu, bash je spreman da prihvati komandu. Vano je uoiti da bash pravi razliku izmeu malih i velikih slova. bash pamti komande koje j e korisnik ranije kucao (tzv. istorija komandi). Broj zapamenih komandi se moe pod esiti. Sve ranije zapamene komande se mogu pregledati pritiskom na kursorske tast ere i . Ekran terminala se brzo popuni i tada se stari sadraj gubi zbog pomeranja linija teksta na gore. Ukoliko je potrebno videti prethodne sadraje ekrana, to se moe postii pritiskom na Shift+PgUp, odnosno Shift+PgDn. Alternativno, mogu se kor istiti i Shift+, odnosno Shift+. Jo jedna korisna mogunost bash-a je kompletiranje n aziva. Naime, dovoljno je otkucati prvih nekoliko slova neke komande i pritisnut i taster Tab. Nakon toga, ukoliko postoji samo jedna mogunost za komandu, ona e bi ti ispisana, a ako postoji vie, tada e biti ispisane alternative, pa korisnik moe o dabrati ta mu treba. Na primer, ako se otkuca hi, pa se pritisne Tab, na ekranu e se ispisati nekoliko komandi koje poinju

Uvod u korienje Linux operativnog sistema Strana 3 slovima hi. Ukoliko se otkuca i slovo s, nakon pritiska na Tab e se na ekranu ispisat i history, poto je to jedina komanda koja poinje sa his. Pored toga to se moe koristit i za nazive komandi i programa, kompletiranje naziva radi i sa nazivima direktor ijuma i fajlova. Kada se kuca naziv komande (prva re u liniji), pretrauju se podra zumevani direktorijumi (videti sledee poglavlje), dok se prilikom kucanja paramet ara komandi pretrauje tekui direktorijum. Do zavretka rada bash-a dovodi zadavanje komande exit ili pritisak na ctrl+d.

1.4. Organizacija direktorijuma Osnovni direktorijum u Linux-ovom fajl sistemu je root, ili koreni direktorijum i oznaava se sa /. Svi drugi direktorijumi se nalaze ispod njega. Od direktorijuma koji se nalaze u root-u, za obine korisnike je znaajno nekoliko njih. Direktorijum etc sadri razne konfiguracione fajlove, veinom u tekstualnom obliku. Direktorijum bi n sadri osnovne sistemske programe. Direktorijum usr sadri korisnike programe i sve to je potrebno za njihovo korienje (slike, dokumentacija, razni pomoni i konfiguracion i fajlovi). Kod Linux-a ne postoje posebne oznake ureaja (A:, C:, itd.). Direktor ijum mnt u sebi sadri putanje do ureaja koji se nalaze u sistemu, kao to su floppy di sk, CD-ROM, hard diskovi, flash diskovi. Ovo je samo podrazumevani direktorijum za uvezivanje ureaja (mount-ovanje), poto se ureaji mogu povezati na bilo koje mest o u hijerarhiji direktorijuma. Za korisnike je ipak najbitniji direktorijum home u kome se nalaze lini fajlovi za svakog od korisnika koji imaju nalog na sistemu. Svaki korisnik u ovom direktorijumu ima svoj poddirektorijum i obino je to jedino mesto u kome korisnici imaju pravo upisa, pored direktorijuma tmp. Svi ostali dir ektorijumi se mogu ili samo itati, ili im je pristup potpuno onemoguen. U svakom d irektorijumu se nalaze i dva specijalna poddirektorijuma: . oznaava tekui direktorij um, dok .. oznaava nadreeni direktorijum (parent), koji se nalazi iznad tekueg. Oba s e esto koriste u radu iz komandne linije. I korisnikov home direktorijum ima pose bnu oznaku ~ (tilda), koja se moe koristiti za pristup iz komandne linije. Kada se navodi putanja do nekog direktorijuma, nazivi pojedinih poddirektorijuma se razd vajaju sa /. Ovaj znak takoe mora stojati i izmeu poslednjeg naziva poddirektorijuma i naziva fajla. Kada se od Linux-a zatrai da pokrene neki izvrni fajl, ukoliko se ne navede tana putanja do njega, pretraie se podrazumevani direktorijumi za izvrne fajlove. Spisak ovih direktorijuma se nalazi u promenljivoj okruenja (environment variable) PATH. Treba napomenuti da se tekui direktorijum ne nalazi u ovom spisk u, tako da, ako treba pokrenuti program koji se nalazi u tekuem direktorijumu (a koji se ne nalazi u PATH-u), potrebno je kucati ./naziv_programa. 1.5. Osnovne komande bash-a Kretanje po stablu direktorijuma i listanje fajlova Komanda koja slui za po stablu direktorijuma je cd (change directory). Ukoliko se otkuca samo parametara, tekui direktorijum postaje home direktorijum korisnika. Kao r se moe navesti relativna ili apsolutna putanja do direktorijuma u koji ei. Na primer, ako je tekui direktorijum /home/pera/prvi/ a eli se prei u /home/pera/drugi/ moe se kucati apsolutna putanja cd /home/pera/drugi/ ili relativna cd ../drugi/ kretanje cd bez parameta se eli pr

Uvod u korienje Linux operativnog sistema Strana 4 Treba napomenuti da se u svakom trenutku kucanja putanje moe koristiti kompletira nje naziva pomou tastera Tab, ime se vreme kucanja moe znatno skratiti. Ukoliko je potrebno saznati punu putanju do tekueg direktorijuma, to se moe postii kucanjem ko mande pwd (print working directory). Prikaz sadraja tekueg direktorijuma (ili dire ktorijuma koji se navede kao parametar) omoguuje komanda ls (list). Ova komanda i ma puno opciija, od kojih e ove biti pomenute samo neke. Opcija -a omoguuje da se prikau i skriveni fajlovi i direktorijumi koji se standardno ne prikazuju (njihov a imena poinju takom), opcija -l (malo slovo L) omoguuje prikaz svih podataka o faj lovima i direktorijumima, dok opcija -d omoguava da se ispiu samo nazivi direktori juma, a ne i njihov sadraj. Ono to e prikazati komanda ls se moe dodatno filtrirati upotrebom doker znakova: Doker znak * ? [] Znaenje Zamenjuje bilo koji broj bilo kojih znakova Zamenjuje tano jedan bilo koji znak S lino sa ?, samo to se zamnjuje tano odreeni skup znakova. Na primer, [a-dps] bi bila zamena za jedan od sledeih znakova: a,b,c,d,p,s Tabela 1: Doker znaci bila: Tako, na primer, ako treba izlistati sve fajlove u tekuem direktorijumu koj i poinju sa pr, komanda bi ls pr* Ako treba izlistati sve fajlove u tekuem direktorijumu koji poinju sa a, b ili c, komanda bi bila: ls [a-c]*

Upotreba doker znakova nije ograniena samo na ls komandu. Oni se mogu koristiti sa bilo kojom komandom koja kao parametar prihvata naziv fajla ili direktorijuma. Za svaku komandu se moe dobiti spisak svih njenih opcija kucanjem komande i argum enta --help. Drugi nain dobijanja (detaljnije) pomoi za neku komandu je komanda ma n (manual). Na primer, za komandu ls uputstvo se moe dobiti kucanjem man ls. Preg ledanje uputstva se vri kursorskim tasterima, dok se izlazak postie pritiskom na t aster q. Ukoliko se u uputstvu trai neka posebna re, treba otkucati /, za pretragu unapred, odnosno ? za pretragu unazad, pa nakon toga re koja se trai. Ponovna pre traga za istom reju se ostvaruje kucanjem /, odnosno ?, nakon ega treba samo priti snuti Enter. Manipulacija fajlovima i direktorijumima Nazivi fajlova pod Linux-o m se mogu sastojati od slova (velikih i malih), brojeva i nekih specijalnih znak ova, kao to su -, _ ili .. U nazivu se moe nai i razmak (tada se naziv mora staviti r znakova navoda, ili, alternativno, ispred razmaka treba staviti \), ali se ipak preporuuje da se umesto razmaka koristi znak _. Znaci koje nikako ne treba koristit i u nazivima su !, &, $, ?, /, *, < i >. Razlog za ovo je to mnogi specijaln znaenje i upotrebu (neki su ve navedeni, a o nekima e biti rei kasnije). Jedna od o snovnih operacija pri radu sa fajlovima je njihovo kopiranje. To se postie komand om cp (copy). Osnovni oblik ove komande je: cp ta_se_kopira gde_se_kopira Ukoliko se kopira samo jedan fajl, tada se umesto parametra gde_se_kopira moe nav esti drugo ime za fajl, a u suprotnom mora biti naziv direktorijuma. Na primer, ako treba kopirati sve fajlove sa ekstenzijom .xyz iz home direktorijuma u tekui direktorijum, komanda bi bila: cp ~/*.xyz ./ Ukoliko treba obrisati jedan ili vie fajlova, koristi se komanda rm (remove). Na

primer, ako treba obrisati

Uvod u korienje Linux operativnog sistema sve fajlove koji poinju sa aaa, komanda b i bila: rm aaa* Strana 5 U veini distribucija je, iz razloga sigurnosti, podeeno da rm radi sa opcijom -i ( pomou alias-a), iji je efekat da se korisnik pita za brisanje svakog fajla ponaoso b. Ako takvih fajlova ima vie, korisnik e biti pitan za svaki. Ako svi fajlovi sig urno treba da budu obrisani, moe se dodati opcija -f. Meutim, sa ovom opcijom treb a biti obazriv jer se lako moe desiti da se obrie neto to nije trebalo obrisati. Na primer, ako se grekom umesto rm -f aaa* otkuca rm -f aaa * (razmak izmeu 'aaa' i ' *'), bie pobrisani svi fajlovi u direktorijumu. Nekad treba premestiti fajl sa je dnog mesta na drugo (tj. iskopirati ga na drugo mesto, a zatim obrisati original ). Ovo se postie komandom mv (move), ije korienje je slino komandi cp. Komanda mv se moe koristiti i za preimenovanje fajlova. Ukoliko je potrebno, novi prazan fajl s e moe kreirati komandom touch. Osnovna namena ove komande je da, ako fajl postoji , postavi njegovo vreme poslednje izmene na tekue vreme, a ukoliko fajl ne postoj i, tada se kreira novi prazan fajl. Novi direktorijum se moe kreirati komandom mk dir (make directory), dok se postojei direktorijum moe obrisati komandom rmdir (re move directory). Obe komande kao parametar prihvataju naziv direktorijuma. Treba obratiti panju na to da rmdir moe obrisati samo prazan direktorijum. Svaki fajl p od Linux-om ima pridruen skup atributa. Atributi predstavljaju prava koja korisni k moe imati nad fajlom. Korisnik moe imati prava itanja (r, read), pisanja (w, writ e) i izvravanja (x, execute). Komanda chmod slui za menjanje atributa fajla. Na pr imer, ako korisniku treba dati pravo izvravanja nekog fajla, to se moe postii sa: chmod u+x naziv_fajla Prikaz sadraja fajla i pretraivanje Za Linux se podrazumeva da termin standardni u laz oznaava ureaj sa koga stiu podaci, a da termin standardni izlaz oznaava ureaj na kome se podaci prikazuju. Veina komandi, ukoliko se drugaije ne navede, kao standa rdni ulaz koristi specijalni fajl koji odgovara tastaturi, a kao standardni izla z koristi specijalni fajl koji odgovara ekranu. Standardni ulaz i izlaz se mogu preusmeriti na druge fajlove. Sadraj tekstualnih fajlova se na ekranu moe prikazat i pomou nekoliko komandi. Prva je komanda cat (concatenate) ija je osnovna namena da spoji vie fajlova u jedan. Kao izlaz, cat koristi standardni izlaz, pa ako se napie cat naziv_fajla, dobie se ispis sadraja fajla na ekran. Ukoliko je tekst iole vei, samo e preleteti preko ekrana. Druga komanda, less, omoguava da se tekst list a u oba smera korienjem kursorskih tastera (izlazak je pomou tastera q). esto je pot rebno u tekstualnom fajlu nai red u kome se nalazi neki tekst, naroito kada su pro grami u pitanju. Komanda koja radi upravo to je grep. Na primer, ako treba nai sv e linije u fajlovima ispis1.pas i ispis2.pas koje sadre re 'writeln', komanda bi b ila: grep -i 'writeln' ispis[1-2].pas Opcija -i znai da se zanemaruje razlika izmeu velikih i malih slova. Ako se naziv fajla ne navede, tada se podrazumeva standardni ulaz. Komanda grep se moe koristi ti i za filtriranje izlaza drugih komandi. Na primer, komanda set otkucana bez p arametara prikazuje spisak svih promenljivih okruenja i njihovih vrednosti. Ukoli ko treba izdvojiti podatak o nekoj posebnoj promenljivoj, recimo PATH, moe se kor istiti set|grep PATH, poto promenljivih okruenja obino ima puno. Alias-i Jo jedna ko risna mogunost bash-a je definisanje alias-a, odnosno drugih imena za postojee kom ande. Na primer, ako se komanda ls -d *.xyz esto koristi, moe joj se dodeliti drug o ime, odnosno skraenica

Uvod u korienje Linux operativnog sistema kojom e se ta komanda pozivati: alias xyz='ls -d *.xyz' Strana 6 Sada, kada korisnik otkuca xyz, izvrie se upravo ls -d *.xyz. Ako se zada samo ali as bez parametara, na ekranu e se ispisati spisak svih trenutno postojeih zamena. Ako neku od zamena treba obrisati, to se moe uraditi pomou komande unalias. Preusm eravanje standardnog ulaza i izlaza i pajpovi Kada je potrebno da standardni ula z ne bude tastatura, odnosno da standardni izlaz ne bude ekran, nego, na primer, neki fajl ili tampa, tada se koristi preusmeravanje. Simbol koji se koristi za pr eusmeravane standardnog ulaza je '<', a za preusmeravanje standardnog izlaza je >, odnosno >>. Ono to se daleko ee koristi je preusmeravanje izlaza. Na primer, u direkt orijumu /home/pera/mp3/ se nalazi puno mp3 fajlova. Ako je potrebno poslati neko me spisak mp3 fajlova, isti se moe dobiti sa: ls ~/mp3/ >spisak.txt Ovime se u tekuem direktorijumu formira tekstualni fajl spisak.txt u kome se nala zi izlaz komande ls ~/mp3. Ako, na primer, postoji jo jedan direktorijum sa muzik om, iji sadraj elimo dodati na prethodni, /home/pera/wav/, komanda ls ~/wav/ >spisak.txt bi prebrisala prethodni sadraj i upisala novi. Ukoliko prethodni sadraj treba da o stane, a da se novi doda iza njega, tada umesto simbola > treba koristiti >>: ls ~/wav/ >>spisak.txt Jo jedna mogunost koja postoji je da se standardni izlaz jedne komande direktno pr eusmeri na standardni ulaz druge komande. Ovo se naziva pajp (pipe) i oznaava se sa |. Na primer, ako treba pregledati sadraj direktorijuma sa puno fajlova, moe se o tkucati: ls|less Ovime se izlaz komande ls umesto na ekran, prosleuje komandi less koja nakon toga vri ispis. Jedan komplikovaniji primer slanja spiska pesama bi mogao glasiti ova ko: korisnik iz nekog razloga ne eli da osoba kojoj alje spisak pesama vidi da on ima i pesme grupe XXX. Dalje, u direktorijumu sa mp3 fajlovima se nalazi i dosta poddirektorijuma, a i fajlova koji nisu mp3 i ije nazive i ne treba slati. Traeni spisak se moe dobiti, na primer, sa: ls -R ~/mp3/|grep -i '.mp3'|grep -v -i 'xxx' >spisak.txt Opcija -R komande ls znai da se lista sadraj direktorijuma i svih njegovih poddire ktorijuma. Opcija -v komande grep znai da se izdvajaju sve linije koje ne sadre za datu re. Gornje komande rade sledee: prvo komanda ls izlista sve fajlove u mp3 dir ektorijumu i njegovim poddirektorijumima; izlaz komande ls se alje prvoj grep kom andi koja izdvaja samo one linije u kojima se nalazi tekst .mp3; izlaz prve grep k omande se alje drugoj grep komandi koja izbacuje sve linije u kojima se pominje r e xxx, a zatim se tako preraeni spisak upisuje u fajl spisak.txt. Izvravanje programa u pozadini Ukoliko se na kraju komande stavi znak &, komanda e se izvravati u poz adini. Ovime shell i dalje ostaje dostupan za interaktivni rad. 1.6. Programi za manipulaciju fajlovima Pored manipulacije fajlovima iz komandne linije, Linux ima i mogunost manipulacij e fajlovima u grafikom okruenju, korienjem mia. Postoji dosta programa za tu svrhu, a koji je podrazumevano instaliran zavisi od distribucije do distribucije. Na pri mer, uz grafiko okruenje KDE stie i program konqueror koji se moe koristiti kako za manipulaciju fajlovima, tako i za pristup internetu. Ima mogunost rada sa vie dire ktorijuma odjednom i podrava sve standardne operacije nad fajlovima i direktoriju mima. Druga vrsta

Uvod u korienje Linux operativnog sistema Strana 7 programa je bazirana na izgledu Norton Commander-a i Dos Navigator-a za DOS oper ativni sistem, odnosno Total Commander-a za Windows. U ovu grupu spada Midnight Commander koji se standardno isporuuje u Slika 2: konqueror browser Slika 3: Midnight Commander skoro svim distribucijama i koji se izvrava u tekstualnom reimu. Postoji vie progra ma tipa commander-a koji se izvravaju u grafikom reimu, a jedan od njih je i worker , koji se obino ne isporuuje u Linux distribucijama, ali se moe nai na http://www.bo omerangsworld.de/worker. Treba pomenuti i XNC, Gnome Commander (dolazi u distrib ucijama koje isporuuju Gnome grafiko okruenje), Krusader, itd. Poto je mc (Midnight Commander) jedini koji je prisutan u mnogim distribucijama, on se preporuuje kori snicima naviknutim na commander-e. 1.7. Tekst editori Standardni Linux-ovi tekst editori za profesionalno korienje su vi i emacs. Pored njih postoji i mnotvo drugih tekst editora, kao to su kwrite,nedit i gedit. Oba se izvravaju u grafikom okruenju i podravaju standardne preice sa tastature za rad sa t ekstom, tako da se novi korisnici mogu lako snai. Ovo su ujedno i preporueni edito ri za vebe iz Arhitekture raunara. 1.8. Korisni linkovi Vie o Linux-u se moe nai na stranicama The Linux Documentation Project [4], dok se detaljnije uputstvo za bash moe nai na njegovoj zvaninoj stranici [5]. [1]http://ww w.linux.org, http://www.kernel.org [2]http://www.gnu.org/licenses/licenses.html [3]http://www.mandrakelinux.com, http://www.debian.org, http://www.suse.com, htt p://www.knoppix.org, http://www.redhat.com/ [4]www.tldp.org [5]www.gnu.org/softw are/bash/bash.html

Shell skriptovi Strana 8 2. Shell skriptovi Shell skriptovi (script; u daljem tekstu skriptovi) su programi koji se izvravaju u okviru shell-a. To moe biti jednostavno niz komandi koje treba izvriti jednu za drugom, a koji se relativno esto ponavlja. Skriptovi mogu biti i znatno kompliko vaniji programi, poto bash podrava mnoge elemente strukturnog programiranja. 2.1. Jednostavni skriptovi Skript je (skoro) obian tekstualni fajl koji se moe otkucati u bilo kom tekst edit oru. Na poetku svakog skripta treba da stoji sledei tekst: #!/bin/bash ili #!/bin/sh Prva dva znaka predstavljaju tzv. magini broj (magic number), specijalnu oznaku n a poeku svakog izvrnog fajla koja odreuje njegov tip. U ovom sluaju, re je o skriptu. Ostatak linije je putanja do programa koji e izvriti skript. Prvi primer kae da e s e koristiti bash, a drugi da e se koristiti sh (stariji shell, sa kojim je bash k ompatibilan). Inae, oznaka # predstavlja oznaku za komentar, pa se sve posle # pa do kraja linije smatra komentarom i ne izvrava se. Ispod ove linije se standardno st avlja red sa komentarom koji opisuje ta skript radi, a nakon toga se stavljaju na redbe. Na primer, treba u jednom skriptu objediniti prelazak u home direktorijum i njegovo listanje na ekranu. Nazovimo ga hl: #!/bin/bash #prelazak u home direktorijum i njegovo listanje echo Prelazak u hom e direktorijum i njegovo listanje cd # prelazak u home direktorijum ls -l #lista nje direktorijuma Skript se moe kreirati, na primer, kucanjem gedit hl, nakon ega treba otkucati gor nji program. 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 Sada se ne mora kucati bash hl, nego je dovoljno samo ./hl 2.2. Promenljive Promenljive u skriptovima se jednostavno definiu. Dovoljno je samo u telu skripta napisati: ime_promenljive=vrednost Ono na ta treba obratiti panju je da ni sa leve ni sa desne strane znaka = ne sme bi ti razmaka. Kada se promenljiva eli koristiti, tada se pie $ime_promenljive, ime se p ristupa njenoj vrednosti. Znaci navoda nisu obavezni, ali se preporuuju. Ukoliko je potrebno da se odmah nakon naziva promenljive nae neki tekst tada se koristi z apis ${ime_promenljive}tekst. Generalno, sve promenljive su string tipa, jedino to bash dozvoljava osnovne raunske operacije ukoliko su svi znaci u stringu cifre (c eli brojevi). Kod definisanja promenljivih, ukoliko string sadri razmak, mora se staviti pod znake navoda. Primeri: x=2 ime_i_prezime=Pera Peric ime=Pera prezime=Peric

Shell skriptovi Strana 9 Posebna vrsta promenljivih su one koje se u skriptu koriste kao ulazni parametri . Nazivaju se i pozicioni parametri, poto im je vrednost vezana za poziciju prosl eenog argumenta. Njihova imena su $0, $1, ... $9. Na primer, ako se skript zove x yz, tada e prilikom poziva xyz 1 pera peric mika 123 456 promenljive $0 do $5 imati sledee vrednosti: $0=xyz, $1=1, $2=pera peric, $3=mika, $4=123, $5=456 dok e ostale biti prazne. Postoji i posebna promenljiva $# koja sadri broj preneti h argumenata, kao i $* koja u sebi sadri sve prosleene argumente. Koriste se isto kao i obine promenljive. Vrednosti pozicionih parametara (svih osim prvog) se mog u pomerati ulevo pomou komande shift. Tako, nakon izvrenja komande shift, vrednost i promenljivih iz prethodnog primera bi bile: $0=xyz, $1=pera peric, $2=mika, $3=123, $4=456 dok bi ostale bile prazne. Ovo je korisno ako bi skript morao da prima nedefinis ani broj parametara, da bi se svi mogli obraditi u nekoj petlji. 2.3. Upravljake strukture Osnovna upravljaka strukutira je if, koja postoji u nekoliko varijanti. Najjednos tavija varijanta je: if <uslov> then <naredbe> fi Opciono, moe se dodati i else deo: if <uslov1> then <naredbe1> else <naredbe2> fi Proirena verzija omoguava viestruke upite: if <uslov1> then <naredbe1> elif <uslov2> then <naredbe2> elif ... fi Kao naredbe se mogu staviti bilo koje naredbe koje se mogu izvriti u bash-u. Uslo v takoe moe biti bilo koja naredba, pri emu se smatra da je uslov taan ako je povrat na vrednost naredbe 0 (nula), dok se bilo koja druga vrednost smatra za netano. U slov moe imati i sledei oblik: [<razmak>operator<razmak>operand<razmak>] (za unarne operatore) [<razmak>operand 1<razmak>operator<razmak>operand2<razmak>] (za binarne) Operandi mogu biti promenljive ili konstante (string ili brojevi). Neki od opera tora su dati u sledeoj tabeli:

Shell skriptovi Strana 10 Operator -n -z -d -f -eq -ne = != -lt -gt -le -ge Vrsta Vraa vrednost tano ako ... unarni operand nije prazan unarni operand je prazan unarni postoji direktorijum i je je ime operand unarni postoji fajl ije je ime operand binarni su operandi celi brojevi i ako su isti binarni su operandi celi brojevi i ako su razliiti binarni operandi su jednaki (posmatrani kao stringovi) binarni operandi su razliiti (pos matrani kao stringovi) binarni operand 1 je manji od operanda 2 (celi brojevi) b inarni operand 1 je vei od operanda 2 (celi brojevi) binarni operand 1 je manji i li jednak operandu 2 (celi brojevi) binarni operand 1 je vei ili jednak operandu 2 (celi brojevi) Tabela 2: Operatori bash-a Na primer, treba proveriti da li je skriptu prosleen tano jedan parametar koji je ceo broj i koji je vei od 3, pa ako jeste, vratiti tu vrednost uveanu za 1: #!/bin/bash #primer za if if [ "$#" -ne 1 ] #provera da li postoji tacno 1 param etar 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

Komanda exit slui da se OS-u vrati kd greke. Po konvenciji, ako nema greke, sistemu se vraa kd nula, dok se u sluaju greke vraa kd razliit od nule. Posebna promenljiva $? u sebi sadri kd greke poslednje izvrene naredbe. Aritmetiki izrazi se navode u dvostr ukim malim zagradama ispred kojih stoji znak $. 2.4. Petlje Prva petlja koja e biti pomenuta je for. Njen osnovni oblik je: for brojacka_promenljiva in lista_vrednosti do <naredbe> done Lista vrednosti je lista stringova razdvojenih razmacima. U primeru:

Shell skriptovi #!/bin/bash #for petlja for boja in crvena zelena plava do echo "Jedna od boja j e $boja" done Strana 11 na ekranu e se ispisati: Jedna od boja je crvena Jedna od boja je zelena Jedna od boja je plava Argument u listi vrednosti moe biti i naziv fajla ili direktorijuma, u kome se mo gu nai i doker znaci. U tom sluaju for komanda e za vrednost brojake promenljive uzim ati sve nazive fajlova koji se slau sa argumentom. Na primer, treba napisati skri pt koji e pretraiti sve txt fajlove u tekuem direktorijumu i ispisati koliko puta s e zadata re nalazi u svakom od njih: #!/bin/bash #for petlja, primer 2 for fajl in *.txt #prolazak kroz sve txt fajlo ve do if [ -f $fajl ] n=$(grep -c -i "$1" "$fajl") #n dobija vrednost izlaza koman de 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 pojavljuj e $n puta" fi fi done Konstrukcija promenljiva=$(komanda) se naziva zamena komandi (command substituti on) i omoguava da se izlaz komande unutar zagrade dodeli promenljivoj. Opcija -c komande grep znai da e se vratiti broj pojavljivanja rei u fajlu, a onda e u skriptu taj broj biti dodeljen promenljivoj n. Dalje se proverava vrednost promenljive n i u zavisnosti od toga se ispisuje odgovarajua poruka. Druga petlja koja e biti pomenuta je while. Njen oblik je: while <uslov> do <naredbe> done Uslov se definie isto kao kod if komande. Znaenje je da se telo petlje izvrava dok god je uslov taan. Na primer, ispis prvih n brojeva bi izgledao ovako: #!/bin/bash #for petlja, primer 2 x=1 while [ "$x" -le "$1" ] do echo -n "$x " x =$(($x+1)) done Opcija -n komande echo znai da se nakon ispisa nee prei u novi red. Tako, na primer , ako bi se skript pozvao sa argumentom 5, izlaz bi bio 1 2 3 4 5.

Shell skriptovi Strana 12 2.5. Domai zadaci 1. Izmeniti skript primer za if tako da moe primiti dva argumenta, pri emu je drugi opcioni i predstavlja vrednost za koju e se uveavati prvi 2. Izmeniti skript for pe tlja, primer 2 tako da kao argument prima i ekstenziju fajlova koje treba pretrait i 3. Dopuniti gornja dva skripta proverama parametara, i u sluaju neke greke ispis ati odgovarajuu poruku i vratiti kd greke OS-u (ako nema greke, vratiti nulu) 2.6. Korisni linkovi Na sledeim web stranicama se moe nai vie detalja vezanih za pisanje skriptova: http: //www.tldp.org/LDP/abs/html/ http://tille.xalasys.com/training/bash/

Asemblerski programi Strana 13 3. Asemblerski programi 3.1. Programski model procesora Intel 80386 Intel 80386 je 32-bitni mikroprocesor CISC arhitekture i pripada familiji proces ora x86. Ovaj procesor spada u little endian procesore. Unazad je kompatibilan s a procesorima iz familije x86, pa u sebi sadri 8-bitne, 16-bitne i 32-bitne regis tre (slika 4). Registri opte namene 31 16 15 ah bh ch dh bp si di sp 8 7 al bl cl dl 0 16-bit ax bx cx dx 32-bit eax ebx ecx edx ebp esi edi esp Segmentni registri 15 cs ss ds es fs gs 31 .. 12 Status registri 31 eip eflags 11 10 9 o d i 8 t 7 s 6 z 5 0 4 a 3 0 2 p 1 1 0 c 0 0 interrupt direction overflow aux carry Slika 4: Osnovni registri procesora Intel 80386 Registri opte namene (eax, ebx, . ..) su specifini po tome to se kod njih moe pristupiti njihovom manje znaajnom delu kao posebnom 16-bitnom registru. Tako, na primer, manje znaajnih 16 bita registra eax predstavlja 16-bitni registar ax. Dalje, kod registara ax, bx, cx i dx se m oe posebno posmatrati njihov manje i vie znaajan bajt. Za registar ax, vie znaajan ba jt predstavlja registar ah, a manje znaajan bajt predstavlja registar al (analogn o za ostale registre). Registri opte namene esi (source index) i edi (destination index) imaju specijalnu namenu kod naredbi za rad sa nizovima, kao i za neke nai ne adresiranja. Registri opte namene esp (stack pointer) i ebp (base pointer) ima ju specijalnu namenu kod naredbi koje koriste stek. Segmentni registri u sebi sa dre bazne adrese segmenata memorije: cs (code segment) sadri adresu parity carry zero trap sign

Asemblerski programi Strana 14 poetka segmenta naredbi, ds (data segment) sadri adresu poetka osnovnog segmenta po dataka, ss (stack segment) sadri adresu poetka segmenta steka, dok su es, fs i gs dodatni segmentni registri koji se koriste za manipulaciju podacima. Statusni re gistri su dostupni samo pomou specijalnih naredbi. Registar eflags u sebi sadri fl egove (logike promenljive) ije vrednosti zavise od rezultata izvravanja naredbi. Od znaaja e biti sledei flegovi: c (carry), z (zero), s (sign), d (direction), i o (o verflow). Registar eip (instruction pointer) u sebi sadri adresu naredbe (u okvir u segmenta naredbi) koja e se sledea izvriti. Skup naredbi 80386 je neortogonalan: ne prihvataju sve naredbe sve vrste operanada. Ovo je velikim delom posledica inj enice da je 80386 projektovan s ciljem da bude kompatibilan sa ranijim Intelovim mikroprocesorima iz x86 familije. 3.2. AT&T sintaksa Za familiju procesora x86 postoje dve sintakse pisanja naredbi. Jedna je Intel-o va, a druga je AT&T. Osnovne karakteristike AT&T sintakse su sledee: Labela se definie navoenjem imena labele iza koga sledi dvotaka. Neposredni operand i imaju prefiks '$', nakon ega sledi broj ili naziv labele. Ukoliko se ispred kon stante ili labele ne navede '$', tada se koristi direktno adresiranje. Podrazume vani format brojeva je dekadni. Ako treba uneti broj u heksadecimalnom obliku, p refiks je '0x', za oktalne brojeve prefiks je '0', dok je za brojeve u binarnom obliku prefiks '0b'. Registarski operandi imaju prefiks '%'. Ukoliko naredba ima dva operanda, prvo ide izvorni operand, pa odredini. Sve naredbe koje barataju p odacima imaju sufiks 'b', 'w' ili 'l' (malo L), ime se definie da li se naredba od nosi na bajt (byte, 8 bita), re (word, 16 bita) ili dvostruku re (long, 32 bita). Ukoliko se sufiks ne navede, bie odreen na osnovu odredinog operanda (ovo nije prob lem kod registarskog adresiranja, ali jeste kod memorijskog). Na primer, kod nar edbe: movw $10, %ax slovo w u nazivu oznaava da je u pitanju naredba koja se odnosi na re. Izvorni ope rand je neposredni (vrednost 10 dekadno), a odredini je registarski (registar ax) . Slino, u primeru: movb %ch, %al slovo b u nazivu oznaava da je u pitanju naredba koja se odnosi na bajt. Izvorni operand je registarski (registar ch), a odredini operand je takoe registarski. 3.3. Naini adresiranja memorije Pored neposrednog i registarskog adresiranja, procesor 80386 podrava vie naina adre siranja memorije: direktno, indirektno, indeksno, kao i kombinacije ovih adresir anja. Opti format adresiranja memorije je: adresa(%baza, %indeks, mnoilac) pri emu su sva polja opciona. Adresa memorijske lokacije se izraunava po formuli adresa + baza + mnoilac*indeks Polje adresa mora biti konstanta, mnoilac mora biti konstanta iz skupa {1,2,4,8}, dok baza i indeks moraju biti registri opte namene (pri emu se registar esp ne moe koristiti kao indeks). Ukoliko se neko od polja ne navede, podrazumeva se da je 0, osim za mnoilac ija je podrazumevana vrednost 1. Treba obratiti i panju na injen icu da kod naredbi sa dva operanda, samo jedan od njih moe biti memorijski.

Asemblerski programi Direktno adresiranje ima samo polje adresa: movl %eax, 0x1234 movl %eax, labela1 #eax -> lokacija 123416=466010 #eax -> loka cija labela1 #eax -> lokacija ija je adresa u ebx #eax -> lokacija ija je adresa e bx+87 #eax -> lokacija 1234+ecx Strana 15 Indirektno adresiranje sadri samo polje baza: movl %eax, (%ebx) Bazno adresiranje sadri polja adresa i baza: movl %eax, 87(%ebx) Indeksno adresiranje sadri polja adresa, indeks i eventualno mnoilac: movl %eax, 1234(,%ecx) Vrednosti za mnoilac vee od 1 su pogodne za rad sa nizovima iji su elementi veliine 2, 4 ili 8 bajtova. Na primer, ako je definisan niz nizrec iji su elementi veliine 2 bajta, drugom elementu se moe pristupiti sa: movl $1, %ecx movw nizrec(,%ecx,2), %ax #prvi element ima indeks 0 #vrednost sa lokacije nizrec + ecx*2 -> ax 3.4. Alati: pretprocesor, asembler, linker, dibager Asemblerski program se prvo pie editorom i snima u fajl sa ekstenzijom S (u ovom odeljku fajl e se zvati primer.S). Za makro pretprocesiranje asemblerskog koda se koristi C pretprocesor gcc-a (GNU Compiler Collection): gcc -E proba.S -o proba.s Opcija -E omoguava da se dobije izlaz pretprocesora, dok opcija -o slui za zadavan je naziva izlaznog fajla. Ukoliko usluge pretprocesora nisu potrebne, ovaj korak se moe preskoiti. Za asembliranje se koristi komanda as (GNU assembler): as --gdwarf2 primer.s -o primer.o Opcija --gdwarf2 omoguava dibagiranje programa. Ako je prevoenje prolo bez greaka, s istem e vratiti komandni prompt ne ispisujui nikakve dodatne poruke. Linkovanje ob avlja program ld (GNU linker): ld primer.o -o primer Linker e povezati fajl primer.o, nastao kao rezultat asembliranja, i kreirati izv rni fajl primer. Program gcc omoguava da se automatski izvre svi programi neophodni za dobijanje izvrnog fajla. U tom sluaju, ukoliko se gcc pozove na sledei nain: gcc -g -o primer primer.S tada e automatski biti pozvani pretprocesor, asembler i linker. Opcija -g omoguava dibagiranje programa. Na poetku asemblerskih programa, sa kakvima e se raditi u t oku ovog kursa (i koji e biti asemblirani korienjem automatskog pozivanja svih alat a), treba da stoji sledee: #program radi to i to ... #autor: Pera Peric, E1234 .section .data .section .tex t .globl main main: U prvih par linija u okviru komentara se nalazi kratak opis programa i par osnov nih podataka o fajlu (autor, datum i slino). Treba obratiti panju na to da se ne p rave komentari u stilu #1234 (broj koji se nalazi odmah nakon oznake '#'), poto t akve oznake asembler koristi interno prilikom asembliranja programa. Sledea linij a (.section .data) predstavlja direktivu (ili pseudonaredbu) asembleru i oznaava poetak segmenta podataka. Nakon nje sledi direktiva koja oznaava poetak segmenta na redbi (.section .text). U okviru

Asemblerski programi Strana 16 segmenta naredbi se definie ulazna naredba programa kao spoljanja referenca (.glob l) koja mora biti obeleena labelom main. Na kraju programa treba da se nalazi: kraj: nop Dibager slui za kontrolisano izvravanje programa, i unutar njega se mogu stalno pr atiti i menjati sadraji registara i flegova i postavljati prekidne take. Dibager s e zove DDD (Data Display Debugger) i predstavlja grafiko okruenje za gdb (GNU Debu gger), osnovni dibager koji radi iz komandne linije. DDD se poziva komandom: ddd primer Slika 5: DDD dibager Na slici je prikazan izgled glavnog prozora dibagera. Na ov om kursu je koriena izmenjena verzija DDD dibagera 3.3.11. Izmenje su nainjene radi lakeg rada sa asemblerskim programima. Glavni prozor je podeljen na nekoliko pan ela i prozora. Panel (1) sadri izvorni kod programa. Prozor (2) sadri komande veza ne za izvravanje programa. Prozor (3) sadri trenutne vrednosti registara. Panel (4 ) sadri vrednosti koje je korisnik odabrao da prikazuje (kada takvih vrednosti ne ma, panel se ne prikazuje). Panel (5) sadri komandnu liniju gdb-a (tu se moe videt i tekstualni oblik svih komandi zadatih u DDD-u), dok panel (6) sadri izgled prog ramskog koda u memoriji. Ukoliko nakom pokretanja dibagera prozor sa registrima nije ukljuen, treba ga ukljuiti odabirom opcije Registers menija Status. Pre pokre tanja programa, prvo to treba uraditi je da se postavi taka prekida (breakpoint) n a poslednju liniju u programu (trebalo bi da je kraj: nop). Taka prekida predstav lja mesto na kome e se zaustaviti izvravanje programa kad se on pokrene. Mesto do kog se stiglo u izvravanju programa je obeleeno zelenom

Asemblerski programi Strana 17 strelicom i predstavlja naredbu koja e se sledea izvriti. Taka prekida se moe postavi ti na vie naina: kursor se postavi na poetak linije, pa se miem klikne na dugme Break (ukoliko u to j liniji ve postoji taka prekida, dugme menja naziv u Clear, to znai uklanjanje take prekida) klikne se desnim dugmetom mia na poetak linije, pa se iz menija odabere S et Breakpoint dvoklik miem na poetak linije Taka prekida se moe iskljuiti ili preko dugmeta Clear, ili izborom opcije Delete Br eakpoint iz menija koji se dobija desnim klikom mia na taku prekida. Prozor (2) sa dri vie komandi koje se koriste prilikom izvravanja programa, a od koristi e biti sl edee: Run pokree program od poetka. Izvravanje se zaustavlja kad se naie na taku prekida. S tepi i Nexti izvravaju tekuu naredbu i nakon toga ponovo zaustavljaju izvravanje pr ograma. Koriste se za izvravanje programa korak po korak. Razlika izmeu ove dve ko mande se ogleda kod poziva potprograma: Stepi izvrava potprogram korak po korak, dok Nexti izvri ceo potprogram i zaustavlja se na naredbi koja sledi naredbu pozi va potprograma. Cont nastavlja izvravanje programa do sledee take prekida. Kill pre kida izvravanje pokrenutog programa. Ukoliko se klikne na neki od registara u Registers prozoru, njegovo ime se pojav ljuje u liniji (7) koja se nalazi ispod menija. Na primer, ako se klikne na regi star eax, u liniji (7) se pojavljuje tekst '$eax'. Ako se sada klikne na dugme D isplay, u panelu (4) e se prikazati polje sa sadrajem registra eax u oznaenom dekad nom 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 neoznaenih dekadnih vrednosti treba staviti '/u'. Nazivi regist ara se u liniju (7) mogu unositi i runo, samo ispred naziva registra treba stavit i prefiks '$'. Prikazane vrednosti na panelu (4) se mogu obrisati klikom na vred nost, a zatim klikom na dugme Undisp. Da bi se promenila vrednost u registru, u liniju (7) treba postaviti njegovo ime (zajedno sa prefiksom '$') i kliknuti na dugme Set. Nakon toga, u prozoru koji se otvori se moe upisati vrednost koja e se upisati u registar. Ukoliko se vrednost navede bez prefiksa, smatrae se da je u d ekadnom obliku, dok se prefiks '0x' koristi za heksadecimalne vrednosti. Prikaz pojedinih flegova iz eflags registra, kao i vrednosti 8-bitnih i 16-bitnih regis tara se moe postii klikom na odgovarajue dugme na panelu (8). Napomena: vrednosti f legova i registara prikazanih preko ovog panela se ne mogu menjati. 32-bitne i 1 6-bitne promenljive se mogu prikazati tako to se u liniju (7) postavi njihovo ime , a zatim se klikne na dugme Display. 8-bitne promenljive se mogu prikazati post avljanjem njihovog imena u liniju (7) i klikom na odgovarajue dugme na panelu (9) : ByteHex e vrednost prikazati kao heksadecimalnu, ByteDec kao oznaenu dekadnu, a ByteUns kao neoznaenu dekadnu (Napomena: ovako prikazane 8-bitne vrednosti se ne mogu menjati). Stringovi se prikazuju postavljanjem njihovog imena u liniju (7) i klikom na dugme String na panelu (9). Panel (9) sadri i najee koriene opcije panela (2). Promena 32-bitnih i 16-bitnih promenljivih se ostvaruje postavljanjem njiho vog imena u liniju (7) i klikom na dugme Set. 8-bitne promenljive se ne mogu men jati na ovaj nain. DDD omoguava i prikaz sadraja nizova. Za 32-bitne i 16-bitne niz ove je dovoljno iza naziva niza staviti sufiks '@n', gde je n broj lanova niza ko je treba prikazati. Na primer, ako se niz zove nizrec i ima 5 lanova, u liniju (7 ) treba upisati nizrec@5 i kliknuti na dugme Display. Ukoliko je potrebno prikaz ati sadraj memorije koji je odreen nekim tipom adresiranja, kao na primer:

movw nizrec(,%ecx,2), %ax tada treba izraz nizrec(,%ecx,2) postaviti u liniju (7) (na primer, obeleiti ga m iem), a zatim odabrati opciju Memory iz menija Data. U dijalogu koji e se otvoriti treba odabrati broj elemenata koji se eli prikazati, brojni sistem u kome se ele prikazati vrednosti i veliinu jednog elementa (u poslednjem polju e se

Asemblerski programi Strana 18 nai izraz koji odreuje memorijsku lokaciju). Na primer, ukoliko treba prikazati je dan podatak na koga ukazuje gornji izraz, u prvo polje bi se upisalo 1, u drugom b i se odabrao brojni sistem, na primer hex, a u treem bi se odabrala opcija halfwords (2) koja oznaava podatke veliine 2 bajta, poto instrukcija movw radi sa 2-bajtnim v rednostima. Nakon klika na dugme Display, traeni podatak bi se prikazao u panelu (4). 3.5. Primer: izraunavanje NZD Na slici 6 prikazan je algoritam za izraunavanje najveeg zajednikog delioca za dva prirodna broja. a := 12; b := 8; while a b do if a > b then a := a b else b := b a; (a) a = 12; b = 8; while (a != b) if a > b then a -= b; else b -= a; (b) Slika 6: Algoritam za izraunavanje NZD: (a) pseudokod i (b) C kd Predstavljen kao niz koraka, algoritam bi glasio: 1. Smesti vrednost 12 u promen ljivu a 2. Smesti vrednost 8 u promenljivu b 3. Uporedi a i b. Ako su jednaki, p rei na korak 9 4. Uporedi a i b. Ako je a vee od b, prei na korak 7, inae prei na sle dei korak 5. Oduzmi a od b i rezultat smesti u b 6. Prei na korak 3 7. Oduzmi b od a i rezultat smesti u a 8. Prei na korak 3 9. Kraj algoritma Varijanta 1. Doslov an prevod algoritma u asembler Koriste se sledee naredbe: mov. Smetanje izvornog operanda u odredini. U ovom programu se koriste registarski i neposredni operandi. Na primer, movl 12, %eax e smestiti broj 12 (neposredni o perand, kodiran kao deo naredbe) u registar eax. Naredba mov ne utie na flegove. cmp. Poreenje operanada. Tehniki, ovom naredbom se od odredinog operanda oduzima iz vorni, ali se pri tom sadraj odredita ne menja, ve se samo auriraju flegovi: u ovom sluaju zanimaju nas fleg z (zero), koji se postavlja ako je rezultat nula, i c (c arry), koji se postavlja u sluaju prenosa sa najznaajnije pozicije. je, ja, jmp. R elativni skokovi. Prva dva su uslovna. Do skoka je (jump if equal) dolazi ako vai z=1, a do skoka ja (jump if above) dolazi ako vai c=0 i z=0. Naredba jmp je bezu slovni skok. Naredbe skoka ne utiu na flegove. sub. Oduzimanje izvornog operanda od odredinog. Rezultat se smeta u odredite. Prilikom

Asemblerski programi oduzimanja se ne uzima u obzir vrednost flega c. Naredba su b menja flegove. Strana 19 nop. Instrukcija koja ne radi nita, ovde je potrebna samo zbog postavljanja take p rekida movl $12,%eax #12->eax movl $8,%ebx #8->ebx uporedi: cmpl %ebx,%eax je kraj #sko k ako eax=ebx cmpl %ebx,%eax ja vece #skok ako eax>ebx subl %eax,%ebx #ebx-eax-> ebx jmp uporedi vece: subl %ebx,%eax #eax-ebx->eax jmp uporedi kraj: nop Varijanta 2. Slino prvoj varijanti, s tim da se uzima u obzir injenica da naredbe skoka ne utiu na flegove, pa je drugo poreenje nepotrebno. movl $12,%eax movl $8,%ebx uporedi: cmpl %ebx,%eax je kraj ja vece subl %eax,%eb x jmp uporedi vece: subl %ebx,%eax jmp uporedi kraj: nop Varijanta 3. Optimizovana verzija. Za algoritam nije bitno da li se vea vrednost nalazi u eax ili ebx (jer se to proverava u svakoj iteraciji). Zbog toga se u sl uaju da je ebx vee od eax sadraj ovih registara moe meusobno zameniti (kao rezultat z amene, eax e biti vee od ebx), i zatim uraditi oduzimanje ebx od eax. Zamenu sadraj a radi naredba xchg. Ovde se koriste registarski operandi. Naredba ne utie na fle gove. movl $12,%eax movl $8,%ebx uporedi: cmpl %ebx,%eax je kraj ja vece xchgl %eax,%e bx #eax<->ebx vece: subl %ebx,%eax jmp uporedi kraj: nop 3.6. Domai zadaci 1. Napisati asemblerski program koji e sabrati prvih n prirodnih brojeva. Vrednos t n se nalazi u registru ecx, dok zbir treba da bude u registru eax. 2. Napisati program koji poredi vrednosti u registrima ebx i ecx i na osnovu rezultata poree nja, u regaistar eax stavlja: 1 ako ebx>ecx 0 ako ebx=ecx 0xffffffff ako ebx<ecx

Dvostruka preciznost. Nizovi Strana 20 4. Dvostruka preciznost. Nizovi 4.1. Neoznaeni i oznaeni brojevi Procesor 80386 omoguava rad sa neoznaenim i sa oznaenim celim brojevima. Da li e se broj u nekom registru smatrati za oznaeni ili neoznaeni zavisi iskljuivo od program a i naina na koji se koriste flegovi. Veliina operanada kojima procesorske naredbe mogu direktno manipulisati obino je ograniena kapacitetom mainskih rei, tj. regista ra. Za operande u toj veliini se kae da su u jednostrukoj preciznosti. Neoznaeni br oj u jednostrukoj preciznosti kod 80386 procesora moe imati vrednosti iz opsega o d 0 do 232-1. Oznaeni brojevi se predstavljaju u komplement 2 predstavi, to znai da je opseg oznaenih brojeva u jednostrukoj preciznosti kod 80386 od -231 do 231-1. Ako program treba da radi sa neoznaenim brojevima, koristi se fleg c (carry), ko ji predstavlja prenos kod operacija sa neoznaenim brojevima. Za rad sa oznaenim br ojevima se koristi fleg o (overflow), koji predstavlja prenos kod operacija sa o znaenim brojevima. 4.2. Manipulacija bitima Za manipulaciju bitima su zaduene logike naredbe procesora 80386. Sve logike naredb e utiu na flegove. Osnovne logike naredbe su and (logiko I), or (logiko ILI), xor (e kskluzivno ILI) i not (logiko NE). Prve tri obavljaju logiku operaciju nad parovim a korespondentnih bita izvornog i odredinog operanda. Naredba not ima samo jedan operand i obavlja operaciju nad njegovim bitima. Ove naredbe se esto koriste i za tzv. maskiranje, odnosno proveravanje ili postavljanje pojedinih bita. Na prime r, ako treba najnii bit registra eax postaviti na 0, to se moe postii naredbom: andl $0xfffffffe, %eax Broj 0xfffffffe se u ovom sluaju naziva maska, poto slui za izdvajanje (maskiranje) najnieg bita. Binarno, taj broj ima sve jedninice, osim na najmanje znaajnoj pozi ciji. Na slian nain se naredba or moe iskoristiti za postavljanje nekog bita na vre dnost 1, dok se za promenu vrednosti nekog bita moe iskoristiti naredba xor. Prov era da li neki bit ima vrednost 0 ili 1 se moe uraditi izdvajanjem tog bita pomou naredbe and i provere dobijenog rezultata. Na primer, ako treba proveriti da li je najnii bit registra eax 0 ili 1, moe se pisati: andl $1, %eax Nakon ovoga, ako se u registru eax nalazi 0, tada je vrednost najnieg bita bila 0 , a ako se u registru eax nalazi vrednost razliita od 0, tada je vrednost najnieg bita bila 1. Kod ove provere je nezgodno to to se vrednost odredinog operanda menj a. Upravo za ovakve provere postoji naredba test. Radi isto to i and, ali ne smeta rezultat u odredini operand, nego samo postavlja flegove u zavisnosti od dobijen og rezultata. Komplement 2 nekog broja se moe dobiti naredbom neg, koja predstavl ja kombinaciju naredbe not i dodavanja jedinice rezultatu. Naredbe za pomeranje i rotiranje Pomeranje neke vrednosti za n bita u levo ekvivalentno je mnoenju te vrednosti sa 2n, dok je pomeranje u desno ekvivalentno celobrojnom deljenju sa 2 n. Pomeranje moe biti logiko ili aritmetiko. Kod prvog, bit najmanje ili najvee teine (u zavisnosti od toga da li se pomera u levo ili desno) dobija vrednost nula. K od drugog, pomeranje u levo je istovetno logikom, a pomeranje u desno zadrava vred nost bita najvee teine. Ovime se uva znak u sluaju rada sa oznaenim brojevima. Osnovn e naredbe za pomeranje su shl, shr i sar. Na slici 7 prikazano je dejstvo 80386 naredbi za pomeranje. Odredini operand moe biti registar ili memorijska lokacija. Naredbe za pomeranje prihvataju jo jedan operand, koji odreuje broj pozicija za ko je e pomeranje biti obavljeno. Ovaj operand je ili neposredni, ili se uzima iz re gistra cl. U sluaju pomeranja za vie pozicija, fleg c e biti postavljen prema vredn osti poslednjeg istisnutog bita.

Dvostruka preciznost. Nizovi Strana 21 31 101 carry shl 0 carry shr 0 carry sar (a) 110 010 01 operand 0 carry 101 0 (b) 010 1 10 1 10 1 Slika 7: Naredbe za pomeranje: princip rada (a) i primer pomeranja za 1 mesto (b ) Primeri: shll $1, %eax shrw %cl, %bx #pomeranje eax za 1 mesto u levo #pomeranje bx za cl mesta u desno Prilikom pomeranja u levo, postavljen fleg c se moe uzeti kao indikator prekoraenj a kapaciteta odredita za sluaj rada sa neoznaenim vrednostima. Ako se vrednosti tre tiraju kao oznaene, treba proveravati stanje flega o. Pomeranjem u desno ne moe se prekoraiti kapacitet odredita. Ovde postoje dva granina sluaja: logiko pomeranje neo znaene vrednosti i aritmetiko pomeranje pozitivne oznaene vrednosti e posle najvie n koraka (gde je n veliina odredita u bitima) svesti vrednost na nulu, dok e kod arit metikog pomeranja negativne oznaene vrednosti krajnja vrednost biti -1. Naredbe za rotiranje su prikazane na slici 8. rol vri rotiranje u levo, a ror rotiranje u d esno. Rotiranjem u levo se bit sa najvie pozicije u odreditu dovodi na najniu, dok se svi ostali bitovi pomeraju za jednu poziciju u levo. Analogno tome se radi i rotiranje u desno. Sve to je reeno za operande naredbi za pomeranje vai i ovde. Uz prethodno navedene, postoje i dve naredbe za rotiranje kroz fleg c, rcl i rcr. R azlika u odnosu na rol i ror je u tome to se na najniu ili najviu poziciju dovodi b it iz flega c. Primeri: rolw $1, %ax rcrl %cl, %ebx #rotiranje ax za jedno mesto u levo #rotiranje ebx k roz c za cl mesta u desno

Dvostruka preciznost. Nizovi 31 101 carry rol carry ror carry rcl carry rcr 010 01 110 01 operand Strana 22 0 carry 101 0 011 1 10 1 010 1 10 1 (a) (b) Slika 8: Naredbe za rotiranje: princip rada (a) i primer rotiranja za 1 mesto (b) 4.3. Definisanje podataka Podaci se smetaju u segment podataka. Za smetanje razliitih vrsta podataka, koriste se razliite direktive, a najvanije su prikazane u sledeem primeru: .section .data duga_rec: .long 0xffff1234 rec: .word 0xff56, 2, 50 bajt: .byte 0 xff, 100 Iza odgovarajue direktive se moe navesti i vie vrednosti odvojenih zarezima. Ispred definicije podatka stoji labela, ime se omoguava da se podatku pristupa preko lab ele. Labela je samo zamena za adresu na kojoj se podatak nalazi. Primeri: movl duga_rec, %eax movw %ax, rec movl $bajt, %eax konstanta = vrednost #0xffff1 234 -> eax #0x1234 -> rec #adresa labele bajt -> eax Konstante se definiu na sledei nain: Ovako se praktino definie labela koja pokazuje n a unapred zadatu adresu. Ovakva konstanta se koristi kao neposredni operand ili kao poetna vrednost kod definisanja promenljivih: max_vrednost = 20 vrednost: .long max_vrednost ... movl $max_vrednost, %eax 4.4. Sabiranje u dvostrukoj preciznosti Prilikom rada u viestrukoj preciznosti operacije se izvode u vie koraka, od kojih svaki radi sa delovima

Dvostruka preciznost. Nizovi Strana 23 operanada. Kod 80386, jednostruka preciznost odgovara kapacitetu registara opte n amene - 32 bita, a postoje i naredbe koje rade sa 8-bitnim i 16-bitnim vrednosti ma, kao i nekoliko njih koje kao operand ili rezultat koriste registarski par ed x:eax (ova notacija znai da registar edx sadri bite vee, a eax bite manje teine). 80 386 spada u little endian procesore, to znai da se u memoriji nalazi prvo najnii, a posle vii delovi rei. 80386 naredba za sabiranje je add. Ona sabira operande i re zultat smeta u odredini, postavljajui pri tom flegove na vrednosti koje odgovaraju rezultatu. Jo jedna naredba za sabiranje je adc, koja pored operanada uzima u obz ir i vrednost flega c, koristei je kao poetni prenos na najnioj poziciji. Sabiranje u viestrukoj preciznosti se radi tako to se najmanje znaajne rei operanada saberu p omou add, dok se znaajnije rei sabiraju pomou adc, koristei na taj nain prenose iz pre thodnih sabiranja. Naredba inc poveava odredini operand za jedan. Varijanta 1. Sab iranje neoznaenih brojeva. Operandi se u ovom primeru ne nalaze u registrima, ve s u zapisani u odreene memorijske lokacije. Naredbe koje ih upotrebljavaju pristupa ju im koristei memorijski ili direktni nain adresiranja. Rezultat e biti u registar skom paru edx:eax. Prenos kod sabiranja niih rei uzee se u obzir prilikom sabiranja viih. Prenos kod konanog sabiranja u ovom sluaju znai prekoraenje kapaciteta. Prema tome, stanje flega c posle svih operacija moe se iskoristiti kao indikator greke. Ovde e se to upotrebiti za postavljanje memorijske promenljive greska, uz pomo nar edbe uslovnog skoka jnc (jump if no carry), kojoj je uslov za grananje c=0. a_donji: a_gornji: b_donji: b_gornji: greska: .long .long .long .long .byte 0x80 00 0 0x8001 1 0 movb $0, greska movl a_donji, %eax addl b_donji, %eax movl a_gornji, %edx adcl b _gornji, %edx jnc kraj incb greska kraj: nop Podrazumeva se da se prvi deo koda nalazi u data sekciji, a drugi u text sekciji . Varijanta 2. Sabiranje oznaenih brojeva. Postupak je veoma slian prethodnom: a_donji: a_gornji: b_donji: b_gornji: greska: .long .long .long .long .byte 0xff ff 0xffff 2 0 0 movb $0, greska movl a_donji, %eax addl b_donji, %eax movl a_gornji, %edx adcl b _gornji, %edx jno kraj incb greska kraj: nop Razlika je u tome to se za detekciju prekoraenja kapaciteta koristi fleg o umesto flega c. Shodno tome, upotrebljena je naredba jno (jump if no overflow). Postupa k za oduzimanje u dvostrukoj preciznosti je slian sabiranju. Za oduzimanje niih de lova se

Dvostruka preciznost. Nizovi Strana 24 koristi naredba sub, dok se za oduzimanje viih koristi sbb (subtraction with borr ow), koja radi isto to i sub, samo to u obzir uzima i vrednost flega c (dodaje ga na vrednost izvornog operanda). 4.5. Mnoenje i deljenje pomou sabiranja i oduzimanja Mnoenje pomou sabiranja je trivijalna operacija. Ukoliko treba pomnoiti dva broja a i b, prvo se rezultat postavi na nulu, a zatim se b puta na rezultat doda vredn ost a. Deljenje pomou oduzimanja je slino, treba izbrojati koliko puta se broj b m oe oduzeti od broja a: r = 0; a = 3; b = 8; for (;a > 0;a--) r += b; (a) r = 0; a = 8; b = 3; while (a > b) { a -= b; r++; } (b) Slika 9: Mnoenje pomou sabiranja (a) i deljenje pomou oduzimanja (b) Neto komplikovaniji algoritam za mnoenje je mnoenje pomou sabiranja i pomeranja. Pre dstavlja vernu kopiju algoritma koji se koristi kod runog mnoenja dva binarna broj a. Ako imamo vrednosti a i b, veliine n bita, njihov proizvod je gde je ai vredno st bita na poziciji i (analogno tome i bi). Proizvod se moe zapisati i ovako: a n1 2n1 an2 2n2 a 0 bn1 2n1 bn2 2n2 b0

b0a b 12a b n12n1 a Iz zapisa se vidi da je rezultat mogue izraunati pomou sukcesivnih sabiranja. U sva kom koraku posle prvog vrednost a se udvostruuje. Udvostruavanje vrednosti se u as embleru moe izvesti: Pomeranjem svih bita vrednosti za jednu poziciju u levo; najnii bit dobija vredno st nula. Sabiranjem vrednosti sa samom sobom, to e se koristiti u ovom primeru s o bzirom da je sabiranje u dvostrukoj preciznosti ve opisano. 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 10: Algoritam za mnoenje pomou sabiranja i pomeranja Na slici 10 prikazan je algoritam u C-u za mnoenje brojeva na opisani nain. Postup ak se zapoinje samo ukoliko su oba inioca razliita od nule. Izraz (b & 1) imae vredn ost jedan ako je najnii bit promenljive b jedinica (operator & oznaava bit-operaci ju logikog I). Promenljiva b se u svakom koraku pomera za jedan bit u desno (b = b >> 1). Na ovaj nain e isti izraz posluiti za testiranje bitova rastue teine. Algori tam se moe prevesti u sledei asemblerski program:

Dvostruka preciznost. Nizovi movl $60, %ebx movl $30, %eax movl %eax, %ecx xorl %eax, %eax xorl %edx, %edx xo rl %esi, %esi andl %ebx, %ebx jz kraj proveri: jecxz kraj testl $1,%ecx jz uveca j addl %ebx, %eax adcl %esi, %edx uvecaj: addl %ebx, %ebx adcl %esi, %esi shrl $ 1, %ecx jmp proveri kraj: nop Strana 25 Napomene uz primer: Program prihvata 32-bitne neoznaene parametre u registrima ebx i eax, a rezultat je neoznaen 64-bitni broj u registarskom paru edx:eax. Do prekoraenja kapaciteta u rezultatu ne moe doi, pa se taj sluaj i ne proverava. Vrednost koja se u toku algo ritma 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, us led neortogonalnosti skupa naredbi 80386, za ecx je vezana specijalna naredba je cxz, uslovni skok iji je uslov za grananje ecx=0 i koji se u programu moe dobro is koristiti. Ova naredba postoji i za registar cx i njen naziv je jcxz. Ekskluzivn o ILI neke vrednosti sa samom sobom (xor %eax,%eax) daje rezultat 0, to se moe isk oristiti za anuliranje sadraja registara. Ovo je ekvivalentno sa mov $0,%eax, s t im to se prva naredba bre izvrava. Logiko I neke vrednosti sa samom sobom (and %ebx, %ebx) nee promeniti tu vrednost, ali e 80386 postaviti fleg z ukoliko je rezultat nula (to se moe desiti samo ukoliko je i sama vrednost jednaka nuli). Naredba jz ( jump if zero) je alternativni naziv za je (jump if equal), koja je pomenuta rani je. 4.6. Pomeranje i rotiranje u dvostrukoj preciznosti U tabeli 3 prikazani su programi koji pomeraju ili rotiraju registarski par edx: eax. Nisu prikazani jedino ekvivalenti operacija rcl i rcr.

Dvostruka preciznost. Nizovi Strana 26 Operacija shl shr sar Program shll $1, %eax rcll $1, %edx shrl $1, %edx rcrl $1, %eax sarl $1, %edx rcrl $1, % eax shll rcll rcrl roll shrl rcrl rcll rorl $1, $1, $1, $1, $1, $1, $1, $1, %eax %edx %eax %eax %edx %eax %edx %edx rol ror Tabela 3: Pomeranje i rotiranje u dvostrukoj preciznosti Operacije rotiranja se mogu izvesti i drugaije. Na primer, program za rotiranje u levo mogao bi da glasi: shll $1, %eax rcll $1, %edx jnc nije_jedan orl $1, %eax nije_jedan: ... (ime se eksplicitno testira stanje flega c i postavlja najnii bit eax ako je c pos tavljen). Implementacija iz tabele 3 je namerno uraena tako da ne sadri naredbe us lovnog skoka. 4.7. Negacija u dvostrukoj preciznosti Negirati neku vrednost u ovom sluaju znai izraunati njen komplement 2. Za negiranje u jednostrukoj preciznosti 80386 ima naredbu neg, ali za sluaj dvostruke precizn osti bolje je postupiti po definiciji: komplement 2 neke vrednosti je njen kompl ement 1 uvean za jedan: notl notl addl adcl %eax %edx $1, %eax $0, %edx Navedeni program negira vrednost u registarskom paru edx:eax. Naredba not rauna k omplement 1 odredinog operanda. U ovom sluaju je svejedno kojim e se redom kompleme ntirati nia i via re 64-bitne vrednosti. Korienjem naredbe neg, program bi se mogao n apisati na sledei nain: negl %edx negl %eax sbbl $0, %edx Vrednost vie rei se smanjuje za jedan ako se prilikom negiranja eax postavi fleg c (tj. ako eax promeni znak), to e se desiti za sve vrednosti eax osim nule. Ova va rijanta jeste kraa, ali ima tu manu to ne postavlja fleg o u sluaju prekoraenja kapa citeta (do koga dolazi za vrednost 263). 4.8. Primer: brojanje dana iz odreenog perioda godine Primer pretpostavlja postojanje tabele prosenih dnevnih temperatura iz nekog dela godine. Zadatak je da

Dvostruka preciznost. Nizovi se u zadatom intervalu prebroje dani kod kojih je t emperatura unutar zadatog opsega. Strana 27 Na slici 11 prikazan je C program za reavanje ovog problema. Duina niza dani odreen a je konstantom BROJ_DANA. Indeksiranje niza dani radi se sa osnovom nula (prvi element niza ima indeks nula), kao to je uobiajeno u C-u. Algoritam ispituje valid nost ulaznih podataka (da li je indeks prvog dana pozitivan? da li je indeks pos lednjeg dana manji od ukupnog broja dana? da li je indeks prvog dana manji ili j ednak indeksu poslednjeg?); ako bilo koja od ovih provera ne uspe, postavlja se globalna promenljiva greska. #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 11: Algoritam za brojanje dana sa temperaturom u zadatim granicama Asemblerski ekvivalent dat je u nastavku teksta. Izmene u odnosu na dati algorit am su smanjen broj dana (na sedam), da asemblerski program ne bi bio predugaak (s utina algoritma se ovime ne menja) i to to u asemblerskom programu nije odraena vein a provera. .section .data broj_dana = 7 g_donja: g_gornja: d_prvi: d_poslednji: broj_d: gre ska: dani: .long .long .word .word .word .byte .long .long .long .long .long .lo ng .long -1 3 1 5 0 0 5 -1 2 4 -2 -3 3 .section .text .globl main main: xorl %ebx, %ebx movw d_prvi, %bx testw $0x8000, %bx

Dvostruka preciznost. Nizovi jnz i_greska xorl %ecx, %ecx movw d_poslednji, %cx subl %ebx, %ecx incl %ecx mov w $0, broj_d jedan_dan: movl dani(,%ebx,4), %eax cmpl g_donja, %eax jl van_opseg a cmpl g_gornja, %eax jg van_opsega incw broj_d van_opsega: incl %ebx loopl jeda n_dan jmp kraj i_greska: incb greska kraj: nop Strana 28 Napomene uz primer: Negativnost vrednosti utvruje se testiranjem njenog najvieg bita (u sluaju 16-bitni h vrednosti, testira se sa 0x8000). Pojedinanim vrednostima niza pristupa se pomou indeksnog adresiranja. Kao broja iteracija glavne petlje programa (koja poinje la belom jedan_dan) koristi se registar ecx. Zbog neortogonalnosti skupa naredbi 80 386, za njegovo smanjivanje, testiranje i uslovno grananje mogue je koristiti spe cijalnu naredbu loop. U ovom sluaju, loop jedan_dan bilo bi ekvivalentno nizu nar edbi decl %ecx jnz jedan_dan Obratite panju na korienje 16-bitnih i 32-bitnih registara (na primer, paralelno se koriste kako registar bx, tako i registar ebx). 4.9. Domai zadaci 1. Napisati asemblerski program za sortiranje niza 16-bitnih vrednosti. 2. Prepr aviti program za brojanje dana tako da se umesto indeksnog adresiranja za pristu panje elementima niza koristi indirektno adresiranje.

Potprogrami Strana 29 5. Potprogrami Kod procedurnih programskih jezika vieg nivoa potprogrami su osnovni nain za modul arizaciju koda. Osim razbijanja programa na manje delove, po pretpostavci jednos tavnije i lake za razumevanje i odravanje, vana namena potprograma je parametrizaci ja problema: mogunost da se za odreenu grupu operacija odrede njeni parametri, a d a se prilikom izvravanja zadaju razliite vrednosti parametara (argumenti) kojima e te operacije baratati. Potprogrami koji kao rezultat izvravanja vraaju neku vredno st obino se nazivaju funkcije. Izvesni programski jezici, recimo Pascal, striktno razlikuju ovakve potprograme (zovui ih, isto tako, funkcijama) od onih koji nema ju povratnu vrednost (i zovu se procedure). S druge strane, C sve potprograme na ziva funkcijama, s tim da se kao ekvivalent Pascal-skih procedura koriste funkci je iji je tip eksplicitno deklarisan kao void. Pozivi ovakvih funkcija ne smeju s e pojaviti ni u kakvim izrazima. Mikroprocesori po pravilu imaju operacije i mem orijske strukture za implementaciju potprograma. 80386 nije izuzetak: za poziv p otprograma postoji naredba call, povratak iz potprograma omoguava naredba ret, a da bi ove operacije automatski pamtile i preuzimale adresu od koje se nastavlja izvravanje po zavretku potprograma, koristi se memorijska struktura zvana stek (st ack). Stek je tzv. LIFO (Last In, First Out) struktura: poslednji smeten element e biti prvi preuzet. Kod 80386, call i ret koriste stek automatski, ali postoje i posebne operacije za smetanje (push) i preuzimanje (pop) vrednosti. Na stek se u vek smetaju 32-bitne vrednosti (jedna ili vie njih). Kao pokaziva na vrh steka kori sti se registar esp. Naredba push prvo smanjuje esp za 4, a zatim na lokaciju na koju pokazuje nova vrednost esp smeta izvorni operand, dok pop radi obrnuto: pre uzima vrednost sa lokacije na koju pokazuje esp, smeta je u odredini operand, i po veava esp za 4. Moe se videti da prilikom punjenja stek raste ka niim adresama. Ilu stracije radi, efekat operacije pushl $0 prikazan je na slici 12. porast adresa CE4DA0B7 685AB9FF BEB38325 esp porast adresa 394F88E2 394F88E2 CE4DA0B7 00000000 BEB38325 esp Slika 12: Izgled 80386 steka pre i posle operacije pushl $0 5.1. Prenos argumenata preko registara Prenos argumenata u potprogram i pristup lokalnim promenljivama (ako postoje) mo gu se prevesti u asemblerske operacije na razliite naine. Nain na koji odreeni vii pr ogramski jezik radi ovo prevoenje naziva se njegovom pozivnom konvencijom (callin g convention). Jedna pozivna konvencija je da se argumenti prenose preko regista ra. Prilikom pisanja potprograma se definie koji registri e se koristiti za prenos kojih argumenata. Na primer, treba napisati potprogram za sabiranje u dvostruko j preciznosti. Neka se prvi broj nalazi u registarskom paru edx:eax, drugi u reg istarkom paru ecx:ebx, a rezultat u edx:eax. Potprogram bi mogao izgledati ovako :

Potprogrami saberi: movb $0, greska addl %ebx, %eax adcl %ecx, %edx jnc saberi_kraj incb gre ska saberi_kraj: ret Strana 30 Glavni program iz kog se prethodni potprogram poziva izgleda: main: movl movl movl movl call kraj: nop $1, %eax $2, %edx $3, %ebx $4, %ecx sab eri Kao to se iz primera moe videti, definisanje potprograma ne zahteva nikakve dodatn e direktive. Potprogram treba da ima svoju ulaznu labelu i negde u svom telu nar edbu za povratak iz potprograma. Potprogrami se mogu definisati kako pre, tako i posle glavnog programa. 5.2. Prenos argumenata preko steka Prenos argumenata preko registara ima vie nedostataka. Na taj nain se moe preneti o granien broj argumenata, a to se vie argumenata prenese, potprogram ima na raspolag anju manje registara za rad. Dalje, implementacija rekurzivnih potprograma posta je prilino komplikovana. Drugi nain prenosa argumenata je preko steka. Ovaj nain ko riste vii programski jezici. Pozivne konvencije jezika kao to su Pascal i C pretpo stavljaju da se na ciljnom procesoru mogu koristiti (ili implementirati) stek i operacije za rad sa vrednostima na njemu. Funkcije u C-u mogu raditi sa promenlj ivim brojem argumenata i imati lokalne promenljive. C konvencija je prilagoena ov im zahtevima: Argumenti se stavljaju na stek od poslednjeg ka prvom. Na ovaj nain prvi argument je uvek na poznatoj lokaciji, neposredno iznad povratne adrese. Prostor za loka lne promenljive zauzima se na steku: pokaziva na vrh steka umanjuje se za odgovar ajuu vrednost, tako da upotreba steka unutar funkcije (recimo za dalje pozive) ne utie na sadraj lokalnih promenljivih (preutno se podrazumeva da stek raste nanie, k ao kod 80386). Za pristup argumentima i lokalnim promenljivama koristi se poseban pokazivaki reg istar koji se zove pokaziva frejma (frame pointer). Frejm sadri argumente, povratn u adresu, zateenu vrednost pokazivaa frejma i lokalne podatke funkcije. Zateena vre dnost pokazivaa frejma se stavlja na stek na poetku izvravanja funkcije i restaurir a pre povratka, ime se pozivajuoj funkciji osigurava pristup sopstvenom frejmu po nastavku njenog izvravanja. 80386 kao pokaziva frejma koristi registar ebp. Na sli ci 13 prikazani su jedna C funkcija i izgled njenog frejma nakon inicijalizacije . RA (return address) je povratna adresa, a FP (frame pointer) prethodna vrednos t pokazivaa frejma.

Potprogrami Strana 31 char * strrchr(const char *cs, int c) { char *t = 0; while (*cs) if (*cs++ == c) t = (char *) cs 1; return t; } c porast adresa cs RA FP t ebp esp (a) (b) Slika 13: C funkcija: (a) izvorni kd i (b) izgled frejma nakon poziva fun kcije, a pre izvravanja njenog tela Asemblerski kd koji stvara frejm se nalazi na poetku potprograma: push %ebp movl %esp, %ebp subl $4, %esp movl %ebp, %esp pop %ebp ret #uvanje zatee nog FP-a #postavljanje novog FP-a #prostor za lokalnu promenljivu #brisanje loka lne promenljive #vraanje prethodnog FP Na kraju potprograma se nalazi asemblerski kod koji unitava frejm: Argumentima na steku se u okviru potprograma pristupa korienjem ebp registra i baz nog adresiranja. Poto ebp registar pokazuje na fiksnu taku frejma, u odnosu na nje ga se moe odreivati relativna pozicija (offset) argumenata i lokalnih promenljivih : movl 12(%ebp), %ebx movl -4(%ebp), %ecx #drugi parametar (c) -> ebx #prva lokaln a promenljiva (t) -> ecx Poto pozivajua funkcija stavlja argumente na stek (gde joj kasnije ne trebaju), po povratku se esp mora prilagoditi. Poziv funkcije sa slike 13 izveo bi se na sle dei nain (pretpostavlja se da je argument cs u eax, a c u ebx): push %ebx push %eax call strrchr add $8, %esp #drugi argument -> stek #prvi argi ment -> stek #oslobaanje prostora na steku Sve 4 gornje naredbe (smetanje argumenata na stek, sm poziv asemblerskog potprogam a i oslobaanje zauzetog prostora na steku) predstavljaju ekvivalent poziva potpro grama u viem programskom jeziku. Dibager DDD moe prikazati trenutni izgled steka k orienjem opcije Memory iz menija Data. Opcije u prozoru koji se otvori treba podes iti na sledee vrednosti:

Potprogrami Strana 32 Umesto broja 20 moe se staviti broj vrednosti na steku koje se ele posmatrati, dok se umesto hex moe staviti i neki drugi format prikaza. 5.3. Prenos argumenata po vrednosti i po adresi Kada se potprogramu prosledi vrednost argumenta, ukoliko ona bude izmenjena u ok viru potprograma, ta izmena se nee odraziti na originalni argument, poto potprogra m radi sa lokalnom kopijom vrednosti argumenta. Ovo odgovara ulaznim parametrima kod viih programskih jezika (Pascal). Da bi se iz potprograma mogla menjati vred nost nekog argumenta, potprogramu treba proslediti njegovu adresu. Ovo odgovara ulazno-izlaznim parametrima kod viih programskih jezika. U prethodnom primeru (st rrchr) parametar cs predstavlja adresu niza znakova. Da bi se pristupilo vrednos ti na koju cs pokazuje, treba iskoristiti neku varijantu indirektnog adresiranja , na primer: movl 8(%ebp), %esi movb (%esi), %al #prvi parametar (cs) -> esi #prvi znak -> al Jo jedna konvencija vezana za vie programske jezike se odnosi na povratnu vrednost funkcija. Ukoliko se vrednost koju funkcija treba da vrati moe smestiti u 32 bit a, tada se ta vrednost vraa preko registra eax. Ukoliko se moe smestiti u 64 bita, vrednost se vraa preko registarskog para edx:eax. Primer: potprogram za sabiranj e dva broja. Ulaz u potprogram su dve vrednosti prenete preko steka, a izlaz je preko eax registra. Potprogram ne vri proveru prekoraenja. #potprogram za sabiranje dva broja .section .text .globl main saberi: #naziv pot programa push %ebp #poetak potprograma movl %esp, %ebp movl 8(%ebp), %eax #telo p otprograma addl 12(%ebp), %eax movl %ebp, %esp #zavretak potprograma pop %ebp ret main: #glavni program push $123 #drugi argument -> stek push %456 #prvi argimen t -> stek call saberi #poziv potprograma add $8, %esp #oslobaanje prostora na ste ku 5.4. Rekurzija Rekurzija predstavlja situaciju u kojoj potprogram poziva samog sebe (direktno, ili indirektno, preko drugog potprograma). Najlake se moe realizovati korienjem frej mova, odnosno steka, poto u tom sluaju nije potreban nikakav dodatni kd. Kod ovakvi h potprograma treba biti paljiv i treba dobro definisati uslov izlaska iz rekurzi je, da se ne bi desilo da se stek prepuni (stack overflow). Jedan primer rekurzi vnog potprograma bi bila funkcija za izraunavanje faktorijela. Faktorijel nekog b roja n (nije definisan za negativne brojeve) je po definiciji: n!=n*(n-1)! 0!=1 U potprogramu za faktorijel su uvedene jo dve naredbe: dec. Umanjivanje operanda za 1

Potprogrami Strana 33 mul. Mnoenje neoznaenih operanada. U zavisnosti od veliine operanda, naredba mul ra di sledee: mulb operand mulw operand mull operand #al*operand -> ax #ax*operand -> dx:ax #e ax*operand -> edx:eax Ako se usvoji da funkcija ima jedan parametar (n) tipa 32-bitnog neoznaenog broja koji se prenosi po vrednosti, a da se povratna vrednost vraa preko registra eax, program bi mogao izgledati ovako: faktorijel: push %ebp movl %esp, %ebp movl 8(%ebp), %ebx andl %ebx, %ebx jz fakt _nula push %ebx decl %ebx push %ebx call faktorijel add $4, %esp pop %ebx mull % ebx jmp fakt_kraj fakt_nula: movl $1, %eax fakt_kraj: movl %ebp, %esp pop %ebp r et #provera da li je n=0 #uvanje vrednosti n na steku #n-1 #rekurzija #vraanje vredno sti n sa steka #n*(n-1)! -> eax #sluaj n=0 5.5. Domai zadaci 1. Napisati potprogram za mnoenje pomou sabiranja i pomeranja, sa 3 parametra: - m noenik prenet preko vrednosti - mnoilac prenet preko vrednosti - adresa proizvoda (izlazni parametar) 2. Prepraviti potprogram za faktorijel tako da se rezultat v raa preko argumenta prenetog po adresi. Registar eax iskoristiti za vraanje vredno sti o greci: ukoliko doe do prekoraenja opsega od 32 bita prilikom mnoenja, u eax vr atiti 1, inae vratiti 0.

Konverzije razliitih brojnih osnova u interni format Strana 34 6. Konverzije razliitih brojnih osnova u interni format Dananji raunari interno (u registrima ili memorijskim lokacijama) predstavljaju br ojeve u binarnom obliku. Brojevi su zapisani kao nizovi bita, ija duina uglavnom o dgovara kapacitetu memorijske lokacije. Za komunikaciju sa korisnikom se, meutim, broj iz interne predstave prevodi u znakovni niz iji su elementi cifre. Takav zn akovni zapis je promenljive duine i moe biti dui od internog - na primer, za beleenj e broja 31337 10 u znakovnom obliku potrebno je najmanje pet bajtova (za svaku c ifru po jedan), dok bi interni format u 16-bitnom registru zauzimao dva bajta. Z a kodiranje tekstualnog zapisa najvie se koristi ASCII standard (American Standar d Code for Information Interchange) ili neka od njegovih proirenih varijanti. U o snovnom ASCII kodu, svaki znak zauzima jedan bajt; znakovi za cifre decimalnog b rojnog sistema imaju kodove od 48 do 57. Ako se radi sa brojnim osnovama od dva do deset, dobijanje vrednosti cifre na osnovu njenog ASCII koda se svodi na oduz imanje konstante 48 (koda za cifru nula) od ASCII koda cifre. Analogno tome se r adi i obrnut postupak. Kod veih brojnih osnova kao cifre teine vee od devet koriste se mala ili velika slova, te je i postupak prilagoavanja sloeniji. U narednim pri merima e se za znakovni zapis brojeva koristiti osnovni ASCII kd i konvencija iz j ezika C: kraj niza se oznaava ASCII NUL bajtom, koji ima vrednost nula. Svi broje vi se tretiraju kao neoznaeni. Prilikom konverzije iz znakovnog zapisa u interni proverava se sledee: Validnost pojedinanih cifara, u skladu sa brojnom osnovom broja: cifra van dozvol jenog opsega predstavlja greku. Kapacitet odredita za interni format: prekoraenje k apaciteta je greka. Duina izvornog niza cifara: prazan niz (onaj iji je prvi elemen t NUL bajt) se tretira kao greka. Realni programi za konverziju imali bi vei broj provera. Na primer, uobiajeno je d a se znakovi praznine (razmak i tabulator) pre prve cifre ignoriu. 6.1. Konverzija iz znakovnog oblika (ceo dekadni broj) u interni oblik Uopte uzev, svaki broj od n cifara, zapisan u pozicionom brojnom sistemu sa osnov om b, moe se predstaviti na sledei nain: x n1 b n1 x n2 bn2 x 1 b x 0 gde je xi cifra odgovarajue teine. Pretpostavka je da se cifre piu od najvee teine ka najmanjoj. Postupak konverzije ovako zapisanog broja u njegovu vrednost moe se o pisati sledeim nizom koraka: 1. Inicijalizuj rezultat konverzije na nulu i postav i tekuu poziciju u nizu cifara na prvu cifru 2. Pomnoi rezultat osnovom brojnog si stema 3. Dodaj na rezultat vrednost cifre na tekuoj poziciji 4. Ako ima jo cifara, pomeri tekuu poziciju za jedno mesto u desno i prei na drugi korak, u suprotnom z avri konverziju Algoritam u C-u za konverziju celog neoznaenog broja iz dekadnog z apisa u interni format prikazan je na slici 14. Jednostavnosti radi, ovaj algori tam ne proverava prekoraenje kapaciteta rezultata. Asemblerska verzija ovog algor itma koristi naredbu lea (Load Effective Address). Ova naredba izraunava adresu i zvornog operanda (koji mora biti memorijski) i smeta je u odredini operand (koji m ora biti registarski). Koristi se i direktiva .ascii koja slui za smetanje ASCII t eksta u segment podataka. Znaci '\0' na kraju stringa slue za definisanje ASCII N UL znaka.

Konverzije razliitih brojnih osnova u interni format #include <ctype.h> extern const char *d; extern int greska; extern unsigned r; g reska = 0; r = 0; if (!*d) greska++; else while (*d) { if (!isdigit(*d)) { gresk a++; break; } r *= 10; r += *d++ - '0'; } Strana 35 Slika 14: Konverzija znakovnog zapisa neoznaenog dekadnog broja u interni format Asemblerska verzija ovog algoritma izgleda: dec_br: greska: .ascii "3133734892\0" .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 %b l, %bl #provera kraja stringa jz kraj_dec subb $'0', %bl #izdvajanje cifre i pro vere jc i_greska cmpb $9, %bl ja i_greska mull %ecx #r*=10 andl %edx, %edx #prek oraenje kapaciteta? jnz i_greska addl %ebx, %eax #r=r+cifra jc i_greska incl %esi #sledei znak jmp dec_cifra kraj_dec: cmpl $dec_br, %esi #'\0' na poetku stringa? jne kraj i_greska: incb greska kraj: nop

Konverzije razliitih brojnih osnova u interni format Strana 36 6.2. Konverzija iz znakovnog oblika (razlomljeni dekadni broj) u interni oblik Problem kod implementacije ovog algoritma u asembleru je to standardne procesorsk e naredbe barataju iskljuivo celobrojnim vrednostima. Ovo se reava skaliranjem raz lomljenog broja nekim stepenom broja 10: ako se implementacija zadri na jednostru koj preciznosti, skaliranje se moe izvesti sa 109. Takvim postupkom bi, na primer , vrednost 0.2 bila predstavljena kao 200000000, a vrednost 0.0625 kao 62500000 ili 062500000. dec_br: greska: .ascii "200000000\0" .byte 0 leal dec_br, %esi movb $0, greska xorl %eax, %eax xorl %ebx, %ebx movl $10, %ecx #baza dec_cifra: movb (%esi), %bl andb %bl, %bl #kraj stringa? jz kraj_dec subb $'0', %bl #dobijanje cifre 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 #prov era prekoraenja jae i_greska incl %esi #sledei znak jmp dec_cifra kraj_dec: cmpl $ dec_br, %esi #prazan string? jne kraj i_greska: incb greska kraj: nop Zbog uvedenog naina predstavljanja razlomljenih brojeva, moe se primetiti da je ko nverzija iz znakovnog dekadnog zapisa razlomljenog broja u interni format identin a prethodnom programu (konverzija celog broja). Jedini dodatni uslov je da rezul tat ne sme biti vei ili jednak od 109. 6.3. Konverzija iz znakovnog oblika (razlomljeni binarni broj) u interni oblik Binarni razlomak oblika b1 21 b2 22 bn 2n moe se konvertovati u decimalni zapis ispitivanjem sukcesivnih bitova i sumiranje m vrednosti 2-i (poev od ) za svaku poziciju gde je odgovarajui bit jednak jedinici . Neposredna implementacija ovog algoritma, u sprezi sa skaliranjem opisanim u p rethodnom odeljku, znaila bi korienje poetne vrednosti 500000000 i njeno prepolovlja vanje u svakom narednom koraku. Ipak,

Konverzije razliitih brojnih osnova u interni format Strana 37 za postizanje vee tanosti rezultata bolje je primeniti alternativni postupak: ispi tivanje binarnih cifara s kraja, s tim da se rezultat prepolovljava pre ispitiva nja, a dodaje mu se 500000000 ako se pokae da je na tekuoj poziciji bit vrednosti jedan. S obzirom na metod, broj binarnih cifara ne bi morao biti ogranien na 32 u koliko bi se prvo utvrdila lokacija kraja niza i sa konverzijom krenulo ka njego vom poetku. U ovoj verziji uvedeno je ogranienje radi jednostavnije konverzije bin arnog zapisa u interni format, poto se koristi registar kapaciteta 32 bita. bin_br: .ascii "1000100010110100\0" greska: .byte 0 leal bin_br, %esi movb $0, g reska 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 #ubaci vanje 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 #praz an 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_jed an: loopl razl_poz kraj: nop Broj obraenih binarnih cifara mora se pamtiti (ecx) jer se za proveru uslova kraj a konverzije ne moe iskoristiti nulta vrednost registra sa internim formatom vred nosti, poto su vodee nule u razlomljenom broju bitne. 6.4. Opti suaj konverzije iz znakovnog oblika (razlomljeni broj) u interni oblik Algoritam za konverziju razlomljenog broja u bilo kojoj osnovi u osnovu 10 (koja se, skalirana sa 10 9, koristila kao interna predstava u prethodnim primerima) se moe predstaviti sledeim nizom koraka:

Konverzije razliitih brojnih osnova u interni format 1. Postavi rezultat na 0 i p ozicioniraj se na poslednju cifru u broju 2. Rezultat saberi sa cifrom i podeli sa bazom Strana 38 3. Ukoliko ima jo cifara, prei na prethodnu cifru i idi na korak 2, u suprotnom za vri konverziju Kod implementacije ovog algoritma u asembleru, obratiti panju na to da se u tom sluaju radi sa skaliranim brojevima. Zbog toga to algoritam radi za b ilo koju bazu, da bi se izbegla prekoraenja u nekim situacijama, bilo bi dobro da faktor skaliranja bude 108. 6.5. Domai zadaci 1. Napisati program za konverziju celog dekadnog broja u interni format u dvostr ukoj preciznosti. 2. Napisati program koji e sve cifre heksadecimalnog celog broj a koje su zadate malim slovima pretvoriti u velika slova.

Konverzije iz internog formata u razliite brojne osnove Strana 39 7. Konverzije iz internog formata u razliite brojne osnove Konverzija iz znakovnog oblika u interni format je neophodna svaki put kada kori snik treba da zada broj koji treba da se obrauje u njemu razumljivom obliku. Kada program izvri obradu, rezultat treba prikazati u obliku koji je razumljiv korisn iku, odnosno treba izvriti konverziju iz internog oblika u znakovni oblik u nekoj osnovi. 7.1. Konverzija iz internog oblika u znakovni oblik (ceo dekadni broj) 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 ostatka svakog deljenja u zankovni ekvivalent (tj. odgov arajuu cifru). Algoritam prestaje s radom poto se kao rezultat deljenja dobije nul a. S obzirom da se na ovaj nain dobija niz cifara zapisan obrnutim redosledom u o dnosu na uobiajeni, elemente niza treba obrnuti da bi se dobio konaan i ispravan z apis. U programu napisanom po ovom algoritmu je uvedena asemblerska direktiva .f ill iji je format: .fill broj, veliina, vrednost Ova direktiva slui da se u memoriju upie broj elemenata duine veliina bajtova (moe bi ti 1, 2 ili 4) sa vrednou vrednost. Parametri veliina i vrednost su opcioni (podraz umevane vrednosti su 1 i 0, respektivno). Deljenje neoznaenih brojeva se moe obavi ti naredbom div koja, u zavisnosti od veliine operanada, radi sledee: divb operand divw operand divl operand #ax/operand -> al, ostatak -> ah #dx:ax/o perand -> ax, ostatak -> dx #edx:eax/operand -> eax, ostatak -> edx U nastavku teksta je dat program za konverziju iz internog oblika u znakovni obl ik celog dekadnog 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 obrni: cmpl %edi, %esi jae kraj movb (%esi), %ah movb (%edi), %al m ovb %al, (%esi) movb %ah, (%edi) decl %edi incl %esi jmp obrni #broj za konverzi ju #baza #neophodno zbog divl #kraj algoritma? #kraj stringa #obrtanje niza

Konverzije iz internog formata u razliite brojne osnove kraj: nop Strana 40 7.2. Konverzija iz internog oblika u znakovni oblik (ceo binarni broj) Algoritam u C-u za konverziju iz internog oblika u znakovni oblik celog binarnog broja i obrtanje rezultujueg niza prikazan je na slici 15. Kod asemblerske verzi je ovog algoritma, za binarni zapis je predvieno 33 bajta, to je dovoljno za broj u jednostrukoj preciznosti i zavrni NUL. Sm program dat je u nastavku teksta. Prog ram koristi specifinosti binarnog brojnog sistema, pa tako, deljenje sa 2 nije re alizovano pomou naredbe div, nego su iskoriene naredbe za pomeranje i rotiranje kak o bi se ostatak pri deljenju sa 2 direktno prebacio u registar bl. #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 15: Konverzija iz internog formata u binarni znakovni format Asemblerska verzija programa izgleda: bin_br_duz = 33 bin_br: .fill bin_br_duz,1,0 #rezervisanje 33 bajta movl $31337, %eax #broj koji se konvertuje leal bin_br, %edi bin_cifra: shrl $1, %eax #prebacivanje najnieg bita eax rclb $1, %bl #u bl andb $1, %bl addb $'0', % bl movb %bl, (%edi) #upis znaka u string incl %edi andl %eax, %eax #provera kraj a algoritma jnz bin_cifra movb $0, (%edi) #kraj stringa decl %edi #obrtanje dobi jenog niza leal bin_br, %esi

Konverzije iz internog formata u razliite brojne osnove obrni: cmpl %edi, %esi jae kraj movb (%esi), %ah movb (%edi), %al movb %al, (%es i) movb %ah, (%edi) incl %esi decl %edi jmp obrni kraj: nop Strana 41 7.3. Konverzija iz internog oblika u znakovni oblik (razlomljeni binarni broj) Razlomljen broj, u decimalnom zapisu oblika x n1 b n1 x n2 bn2 x 1 b x 0 moe se konvertovati u ekvivalentni binarni zapis algoritmom sa sledeim nizom korak a: 1. Pomnoi broj sa dva 2. Ako je rezultat manji od jedan, odgovarajua binarna ci fra je 0; zapii je i prei na prvi korak 3. U suprotnom, zapii binarnu cifru 1 i odu zmi jedinicu od broja 4. Ako je broj razliit od nule, prei na prvi korak, u suprot nom zavri konverziju Ovde se takoe koristi predstava brojeva skaliranih sa 109. Pr oblem sa ovom konverzijom je mogunost da se prilikom konverzije javi beskonana per iodinost u rezultatu. Poto je kapacitet memorije ogranien, mora se postaviti gornja granica broja cifara konvertovanog zapisa. Ako se skaliranje izvede na ranije o pisan nain, ograniavanje broja cifara na 32 e dati binarni razlomak uporedive preci znosti. bin_br: .fill 33,1,0 #broj za konverziju #max broj cifara 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: nop #1 ili 0? #oduzimanje jedinice #kraj algoritma? #ima jo mesta u stringu? #kraj stringa

Konverzije iz internog formata u razliite brojne osnove Strana 42 7.4. Opti sluaj konverzije iz internog oblika u znakovni oblik (razlomljeni broj) Algoritam za konverziju iz internog oblika razlomljenog broja u znakovni oblik u bilo kojoj osnovi se moe predstaviti sledeim nizom koraka: 1. Pomnoi broj sa bazom 2. Izdvoji ceo deo broja i zapii ga kao cifru izlazne osnove 3. Ako je ceo deo b roja razliit od 0, oduzmi ga od broja 4. Ako je broj razliit od 0, idi na korak 1, u suprotnom zavri konverziju Pri realizaciji ovog algoritma u asembleru, treba o bratiti panju na to da se u tom sluaju radi sa skaliranim brojevima, pa tome treba prilagoditi sve raunske operacije. Takoe, poto se moe dobiti beskonana periodinost u izlaznom broju, neophodno je ograniiti broj njegovih cifara. 7.5. Domai zadaci 1. Napisati program u asembleru za konverziju celog oktalnog broja u znakovnom o bliku u binarni broj u znakovnom obliku. 2. Napisati program u asembleru za konv erziju celog broja u dvostrukoj preciznosti iz internog formata u znakovni dekad ni oblik.

Kontrolna suma i paritet Strana 43 8. Kontrolna suma i paritet Kada se podaci prebacuju sa jednog raunara na drugi, postavlja se pitanje da li s u oni ispravno preneti. Uobiajeni nain za proveru je da se na podatke primeni neki algoritam koji e kao rezultat dati jedan ili vie kontrolnih brojeva koji se preba cuju zajedno sa podacima. Kada se podaci prebace na drugi raunar, na njih se prim eni isti algoritam, pa se uporede tako dobijeni kontrolni brojevi sa prenetim ko ntrolnim brojevima. Ukoliko postoje razlike, dolo je do greke u prenosu. Kontrolni brojevi se mogu raunati za sve podatke zajedno (checksum - kontrolna suma), a mo gu se raunati i za svaki posebno. Postoji mnogo algoritama koji se koriste u ove svrhe, od kojih jednostavniji omoguavaju samo detekciju greaka, dok komplikovaniji omoguavaju i ispravak greaka u sluaju da ih nema previe (ovo zavisi od koliine redun dantnih podataka, odnosno kontrolnih brojeva). Jedan algoritam koji radi sa svak im podatkom posebno se zasniva na sledeem: posmatra se binarna predstava svakog p odatka posebno i prebrojava se koliko jedinica ima u broju (slika 16). paritet 1 . 2. 3. 4. 5. 00101001 01010101 01010100 01100101 00011111 Slika 16: Paritet Uko liko je broj jedinica paran, kontrolna suma (u ovom sluaju, kontrolni bit) se pos tavlja na 0, a u suprotnom se postavlja na 1. Ovakav kontrolni bit se naziva par itet (parity), a ponekad i horizontalni paritet. Kada se koristi paritet, uobiaje no je da se bit na najznaajnijoj poziciji koristi za smetanje pariteta (u tom sluaj u, podaci se moraju predstavljati sa jednim bitom manje). Ukoliko bi se bit pari teta ugradio u vrednosti sa slike 16, dobile bi se vrednosti kao na slici 17: 1. 2. 3. 4. 5. 10101001 01010101 11010100 01100101 10011111 1 0 1 0 1 Slika 17: Paritet na najznaajnijem bitu Nedostatak ovakve kontrole podataka je to ne moe otkriti greku ukoliko je u broju promenjen paran broj bita. Druga vrsta kon trolnih suma su one koje se odnose na podatke kao celinu. Jedan algoritam koji r adi na taj nain se zasniva na sledeem: posmatra se binarna predstava svih podataka zajedno i broji se koliko ima jedinica na svakoj teinskoj poziciji u svm brojevi ma (slika 18). Ukoliko je broj jedinica paran, na odgovarajuem mestu u kontrolnoj sumi se stavlja 0, a u suprotnom se stavlja 1. Ovakva kontrolna suma se naziva i vertikalni paritet. Oigledan nedostatak ovakve kontrolne sume je isti kao i kod pariteta, a to je da ne moe detektovati greku ako se na jednoj teinskoj poziciji j avi paran broj greaka.

Kontrolna suma i paritet 1. 2. 3. 4. 5. 00101001 01010101 01010100 01100101 0001 1111 01010010 Strana 44 Slika 18: Vertikalni paritet Asemblerski program koji rauna kontrolnu sumu za niz 32-bitnih brojeva je dat u nastavku teksta. br_elem = niz: .long .long .long .long .long .long checksum: 6 0b101010101001010 10001010100111111 0b10101010110111110101010101000101 0b1111111111000000000111111 1000000 0b11101001010110100101101010101010 0b00010101010100101010101010100101 0b 11000101001010001001000100101010 .long 0 #checksum #maska #broja bita #broja eleme nata niza #provera vrednosti bita xorl %eax, %eax movl $1, %edx sledeci_bit: xorl %ecx, %ecx xorl %esi, %esi slede ci_el: movl niz(,%esi,4), %ebx andl %edx, %ebx jz bit_nula incl %ecx bit_nula: i ncl %esi cmpl $br_elem, %esi jl sledeci_el shrl $1, %ecx rcrl $1, %eax shll $1, %edx jnc sledeci_bit movl %eax, checksum kraj: nop #obraeni svi elementi? #parnost #pomeranje maske #obraeni svi bitovi? 8.1. Domai zadatak 1. Napisati program za proveru pariteta niza 8-bitnih brojeva (bit na najznaajnij oj poziciji je bit pariteta). Prvi podatak u nizu je broj elemenata niza.

Ulaz, izlaz i makroi Strana 45 9. Ulaz, izlaz i makroi Program koji treba da komunicira sa okruenjem obraajui se periferijskim ureajima moe to da ini na dva naina: direktnim pristupom hardverskom interfejsu ureaja (na prime r, portovima u ulazno/izlaznom adresnom prostoru koji odgovaraju hardverskim reg istrima), ili korienjem usluga operativnog sistema. Prvi nain se zbog svoje sloenost i koristi skoro iskljuivo kod programa specijalizovane namene, kao to su upravljaki programi za mikrokontrolere ili drajveri. Drugi nain podrazumeva obraanje sistemu putem sistemskih poziva. 9.1. Sistemski pozivi Sistemski pozivi omoguuju pozivanje operacija operativnog sistema. Kod sistema gd e su korisniki i sistemski prostor strogo meusobno izolovani, oni su ujedno i jedi ni nain za komunikaciju korisnikih 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 omoguuju izvravanje op eracija bez poznavanja detalja fizike arhitekture sistema. Ilustracije radi, razm otrimo operaciju prikaza teksta na ekranu korienjem direktnog pristupa hardveru. P rogram koji eli da ispie tekst direktno pristupajui video memoriji mora da zna koji se tip grafike kartice nalazi u raunaru, gde se nalazi poetak video memorije, kako je ona organizovana, koja je rezolucija ekrana, koji su kodovi znakova i boja p rilikom ispisa. Dalje, ako se prilikom upisivanja pree ispod poslednje linije ekr ana, sadraj video memorije se mora pomeriti za jednu liniju navie, itd. Korienjem si stemskih poziva, sve ovo pada na teret drajvera koji radi sa grafikom karticom. P od Linux-om na procesoru Intel 80386, sistemskim pozivima se pristupa korienjem na redbe softverskog prekida, int, sa vektorom 0x80. Procesor Intel 80386 se u toku izvravanja ove naredbe ponaa slino kao kod prijema hardverskog prekida: sauva na st eku sadraj statusnog registra i programskog brojaa, pronae memorijsku lokaciju sa a dresom obraivaa prekida i zapone njegovo izvravanje. Za razliku od hardverskog, soft verski prekid se ne moe zabraniti. Pre poziva naredbe int, u registar eax treba p ostaviti broj sistemskog poziva, dok u registre ebx, ecx, edx, esi, edi treba po staviti eventualne argumente poziva (sadraj ovih registara, kao i registra ebp, o staje nepromenjen nakon povratka iz sistemskog poziva). Broj argumenata zavisi o d sistemskog poziva koji se eli koristiti. Nakon izvrenja sistemskog poziva, regis tar eax sadri informaciju o izvrenju poziva. Negativan broj oznaava greku, dok nula ili pozitivan oznaava uspeno izvrenje. 9.2. Ulaz, izlaz i zavretak programa Sistemski poziv za ulaz (read) koristi sledee argumente: eax 3 (broj sistemskog p oziva za ulaz) ebx deskriptor datoteke (za standardni ulaz, stdin, ova vrednost je 0) ecx adresa ulaznog bafera edx veliina bafera Nakon povratka iz poziva, regi star eax e sadrati broj proitanih bajtova, odnosno znakova. Ukoliko je dolo do neke greke, ovaj broj e biti negativan. Treba imati u vidu da se kod unosa sa tastature , na kraju niza unetih znakova nalazi kd 13 (kd za taster ENTER), kao i to da, ako se unese vie od maksimalnog broja znakova, u bafer e se upisati samo onoliko koli ko je specificirano registrom edx. Sistemski poziv za izlaz (write) koristi sled ee argumente: eax 4 (broj sistemskog poziva za izlaz)

Ulaz, izlaz i makroi ebx deskriptor datoteke (za standardni izlaz, stdout, ova v rednost je 1, dok je za standardni izlaz za greke, stderr, ova vrednost 2) ecx ad resa izlaznog bafera edx veliina bafera Strana 46 Nakon povratka iz poziva, registar eax e sadrati broj ispisanih bajtova, odnosno z nakova. Ukoliko je dolo do neke greke, ovaj broj e biti negativan. Treba imati u vi du da e se ispisati onoliko znakova koliko se navede u edx registru, bez obzira n a stvarnu veliinu bafera. Za regularan zavretak programa potreban je sistemski poz iv exit, koji saoptava operativnom sistemu da je nastupio kraj izvravanja programa . Sistemski poziv za zavretak programa (exit) koristi sledee argumente: eax 1 (bro j sistemskog poziva za zavretak programa) ebx izlazni kd (kd greke) Po konvenciji, u registar ebx se stavlja 0 ukoliko je izvravanje programa prolo bez greaka, odnosno broj razliit od 0, ukoliko je dolo do neke greke. U nastavku je dat program koji k oristi pomenute sistemske pozive. U programu je koriena direktiva u obliku izraza labela1 = .-labela2 Taka u izrazu oznaava broja lokacija sa adresom do koje se trenutno stiglo pri asem bliranju. Ovime se labeli labela1 dodeljuje razlika pomenute adrese i adrese lab ele labela2. ime_i_prezime: ime_i_prezime_duzina: poruka1: .ascii "Unesite poruka1_duzina = . -poruka1 poruka2: .ascii "Vi ste: poruka2_duzina = .-poruka2 .fill 40,1,0 .long 0 ime i prezime: \0" \0" movl $4, %eax #ispis poruke 1 movl $1, %ebx leal poruka1, %ecx movl $poruka1_duz ina, %edx int $0x80 movl $3, %eax #unos imena i prezimena movl $0, %ebx leal ime _i_prezime, %ecx movl $40, %edx int $0x80 movl %eax, ime_i_prezime_duzina movl $ 4, %eax #ispis poruke 2 movl $1, %ebx leal poruka2, %ecx movl $poruka2_duzina, % edx int $0x80 movl $4, %eax #ispis imena i prezimena movl $1, %ebx leal ime_i_pr ezime, %ecx movl ime_i_prezime_duzina, %edx int $0x80 movl $1, %eax movl $0, %eb x int $0x80 #zavretak programa

Ulaz, izlaz i makroi Strana 47 9.3. Makroi Iako su potprogrami osnovni i najee korien nain za modularizaciju koda, oni nisu uvek najefikasniji. Same operacije poziva i povratka troe izvesno vreme, koje produava vreme obrade. Ako je potprogram pisan tako da potuje neku pozivnu konvenciju, ova kav troak vremena se poveava proporcionalno broju naredbi potrebnih da bi se konve ncija implementirala. Ako se potprogramom izvodi relativno kratak skup operacija (kao to je, na primer, sistemski poziv), lako se moe desiti da troak vezan za pozi v potprograma bude uporediv sa vremenom obrade. U vremenski kritinim delovima kod a, ili u sluaju velikog broja poziva, ukupan troak poziva potprograma moe biti nepr ihvatljivo veliki. Jedan od naina da se troak potprogramskog poziva izbegne, a da izvorni kd ne postane manje modularan, jeste korienje makroa, odnosno makro definic ija i makro poziva. Makro definicije sadre nizove naredbi koje zamenjuju makro po ziv u tekstu programa. Prosta zamena makro poziva naredbama iz makro definicije je korisna, ali relativno ograniene upotrebljivosti. Zbog toga veina makro-asemble ra omoguava makro definicije sa parametrima (kao i makro pozive sa argumentima). Pored toga, podrane su i lokalne labele, specijalni operatori i konstrukcije za u slovno prevoenje. Prilikom rada sa makroima treba imati nekoliko stvari na umu. P rvo, svi iole sloeniji makroi e raditi sa registrima. Ako se upotreba registara pr opisno ne dokumentuje, poziv makroa moe da stvori nepoeljne sporedne efekte, na pr imer unitenje sadraja registra koji se koristi u kasnijem toku programa. Ovakve gr eke nisu jednostavne za nalaenje. Drugo, preterana upotreba makroa moe dovesti do t oga da je kd razumljiv samo autoru (a moda ni toliko). Makroe je zato najbolje kor istiti umereno, i paljivo ih dokumentovati. Makro se definie na sledei nain: .macro naziv_makroa par1=pv1, par2=pv2, ... <telo makroa> .endm Parametri (pari) su opcioni, kao i njihove podrazumevane vrednosti (pv i). Kada u telu makroa treba iskoristiti neki parametar, njegovo ime se mora navoditi sa prefiksom \, na primer \par1. Tekst koji se dobija nakon poziva makroa se moe videt i pozivom asemblera sa sledeim parametrima: as -alm program.S Primer 1: makro sistemskog poziva exit .macro kraj_rada greska=$0 movl $1, %eax movl \greska, %ebx int $0x80 .endm Pozivanje makroa kraj_rada bez parametara bi dalo sledeu sekvencu programa: movl $1, %eax movl $0, %ebx int $0x80 dok bi pozivanje istog makroa sa parametrom $3 dalo sledeu sekvencu programa: movl $1, %eax movl $3, %ebx int $0x80 Ukoliko je u makrou potrebno definisati labelu, moe nastati problem ukoliko bi se makro pozvao vie od jednom u okviru istog programa. Naime, isti naziv labele bi se pojavio dva ili vie puta u tekstu programa i asembler bi prijavio greku. Zbog t oga se u makroima koriste lokalne labele. Lokalnih labela ima 10 i definiu se cif rama 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'

Ulaz, izlaz i makroi Strana 48 (forwards) koristiti kada definicija labele sledi posle mesta korienja. Lokalne la bele se mogu koristiti kako u makroima, tako i u programu. Mogu se definisati pr oizvoljan broj puta i tada se njihovo pozivanje odnosi na poslednju definiciju l abele (slovo 'b'), odnosno na prvu sledeu definiciju labele (slovo 'f'). Primer 2 : makro za oznaeno celobrojno deljenje sa 10 Proizvod 10x moe se napisati i kao 8x + 2x. Poto su 8 i 2 stepeni broja 2, mnoenje njima svodi se na uzastopno pomeranj e u levo ili sabiranje operanda sa samim sobom. Sledei makro mnoi oznaeni celobrojn i operand u jednostrukoj preciznosti sa deset koristei takvo razlaganje. .macro mnozi10o regmem push %eax movl \regmem, %eax push %ebx addl %eax, %eax jo 1f movl %eax, %ebx addl %eax, %eax jo 1f addl %eax, %eax jo 1f addl %ebx, %eax 1: pop %ebx movl %eax, \regmem pop %eax .endm #registar (osim eax) ili mem. loka cija Ovaj makro ostavlja rezultat mnoenja u registru ili memorijskoj lokaciji navedeno j kao argument (jedino se ne moe koristiti registar eax). Sadraj svih registara (o sim odredinog, ako je kao argument naveden registar) se uva. U sluaju prekoraenja bie postavljen fleg o. Primer 3: makro za odreivanje tipa znaka Kod obrade stringova esto je potrebno ispitivati tip pojedinih znakova. U C-u su za to zaduene funkcij e deklarisane u standardnom zaglavlju <ctype.h>. Na primer, isspace ispituje da li je znak neki od znakova praznine, a isdigit proverava da li je znak cifra dec imalnog brojnog sistema. Ove funkcije se esto implementiraju kao makroi, da bi se kod ispitivanja velikog broja znakova izbegao troak funkcijskog poziva za svaki obraen znak. Efikasan metod ispitivanja zahteva postojanje tabele ija veliina u baj tovima odgovara broju moguih znakova. Za 8-bitni tip char ovo znai utroak od 256 ba jtova. Svaki bajt u tabeli je bit-maska nastala kombinovanjem (pomou logikog ILI) konstanti za klase kojima pripada odgovarajui znak. Konstante za pojedine klase s u razliiti stepeni broja 2. Lokacija bit-maske za odreeni znak dobija se indeksira njem tabele njegovim kodom, to je operacija sloenosti O(1). Tabela bi mogla da izg leda ovako: _IS_SP _IS_DIG _IS_UPP _IS_LOW _IS_HEX _IS_CTL _IS_PUN = = = = = = = 1 2 4 8 16 32 64

Ulaz, izlaz i makroi ctype: .fill .fill .fill .fill .fill .fill .fill .fill .fill .fill .fill .fill . fill .fill .fill 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 Strana 49 Asemblerski makroi, ekvivalenti za isdigit i isspace se sada mogu napisati kao: .macro isclass character, class xorl %ebx, %ebx movb \character, %bl testl $\cla ss, ctype(,%ebx,1) .endm .macro isspace character isclass \character, _IS_SP .en dm .macro isdigit character isclass \character, _IS_DIG .endm #8-bitni registar ili memorija #8-bitni registar ili memorija Makroi menjaju sadraj registra ebx. Rezultat izvravanja je stanje flegova posle na redbe test. 9.4. Domai zadaci 1. Prepraviti program za mnoenje pomou sabiranja u dvostrukoj preciznosti da koris ti standardni ulaz i izlaz za komunikaciju sa korisnikom. 2. Napisati makro za s istemski poziv za ispis na ekran. Makro bi trebao da ima jedan argument, string koji treba ispisati na ekran, dok bi se odreivanje duine stringa radilo u samom ma krou.

Asinhroni dogaaji Strana 50 10. Asinhroni dogaaji 10.1. Prekidi Mehanizam prekida podrava rad sa asinhronim dogaajima na nivou procesora. Prekidi omoguuju procesoru da obustavi trenutnu aktivnost radi obavljanja nekog hitnijeg posla i da kasnije nastavi prekinutu aktivnost. Izvori prekida mogu biti vanjski (prekidi koji nastaju van procesora) i unutranji. Primer unutranjih prekida su iz uzeci koji nastaju pri izvravanju programa (na primer, kao posledica deljenja nul om). Pored ove podele, prekidi se dele na prekide koji se mogu zabraniti (maskab le interrupt, maskirajui prekid) i na prekide koji se ne mogu zabraniti (NMI nonmaskable interrupt, nemaskirajui prekid). Za dozvolu, odnosno zabranu izvravanja m askirajuih prekida je zaduen fleg i (interrupt). U svim ovim sluajevima, reakcija n a prekid je ista: Na stek se stavljaju registar flegova (eflags) i puna adresa (cs:eip, segment i ofset) naredbe koja sledi naredbu u toku koje je dolo do prekida. Kod nekih izuze taka, na stek se stavlja adresa naredbe u toku koje je dolo do prekida. U zavisno sti od vrste prekida, na stek se mogu stavljati i neke dodatne informacije. Na o snovu broja prekida se uzima vektor obraivaa prekida iz tabele prekida. Ukoliko je izvor prekida naredba int, broj prekida je njen operand. Ukoliko je izvor preki da neki hardverski ureaj, on je duan da procesoru dostavi broj prekida, a ukoliko je izvor prekida sm procesor, tada se broj prekida generie interno. Fleg t (trap, koristi se kod izvravanja naredbi korak po korak) se postavlja na nulu. Fleg i ko d nekih prekida se postavlja na 0 (ime se zabranjuju maskirajui prekidi), dok se k od nekih njegovo stanje ne menja. Nakon izvravanja obraivaa prekida, naredba iret v raa sa steka punu adresu instrukcije od koje treba nastaviti izvravanje prekinutog programa i vraa sauvano stanje registra eflags (a samim tim i prethodno stanje fl egova t i i). Zbog prirode posla za koji su zadueni, obraivae prekida moraju karakt erisati sledee osobine: Neophodno je da obrada prekida vremenski traje to krae, kak o bi procesor to pre bio spreman da obradi sledei prekid. Ovo je naroito bitno kod maskirajuih prekida, jer ako bi vreme obrade prekida bilo predugo, moglo bi se de siti da se u toku obrade prekida desi novi prekid, koji u tom sluaju ne bi bio ob raen. Obrada prekida se iz tog razloga obino sastoji iz dva dela: deo koji se izvra va u samom obraivau prekida (najneophodnija obrada) i deo koji se izvrava van obraiv aa prekida (u pozadinskom programu). Zbog asinhrone prirode prekida, koji se mogu javiti prilikom izvravanja bilo koje instrukcije, neophodno je da se sauva stanje svih registara u procesoru. Ovo praktino znai da obraiva prekida mora sauvati sadraj svakog registra pre njegovog korienja i vratiti ga na kraju obrade prekida. 10.2. Signali Direktno menjanje tabele prekida je veoma osetljiva operacija koja moe da ugrozi rad operativnog sistema. Kod Linux-a korisniku nije dozvoljeno da direktno koris ti prekide, pa je za rad sa asinhronim dogaajima zaduen mehanizam signala. Za potr ebe vebanja je razvijena biblioteka koja se oslanja na mehanizam signala i koja e mulira mehanizam prekida. Ona korisniku stavlja na raspolaganje sledee funkcije: int interrupt_handler_get(int broj_vektora) void interrupt_handler_set(int broj_ vektora, int vektor) Prva funkcija omoguava dobijanje vektora za dati broj vektor a, dok druga omoguava zadavanje novog vektora za dati broj vektora. Kada se koris

te prethodne funkcije, obraiva prekida se pie kao potprogram bez parametara iz koga se izlazi pomou naredbe ret. Pri tome, ostale napomene date za obraivae prekida i dalje vae.

Asinhroni dogaaji Da bi se prethodna biblioteka ukljuila u program, asembler se mo ra pozvati sa Strana 51 g++ -g -o naziv_programa naziv_programa.S interrupts.o interface.o dok se na poet ku programa mora nalaziti direktiva #include "interrupts.h" koja slui da se u pro gram ukljui fajl u kome su definisane konstante za brojeve prekida. Za podrane pre kide su uvedene sledee konstante koje predstavljaju brojeve prekida: TIMER prekid sistemskog sata (nastaje svakih 60ms) INT FPE USR1 USR2 - prekid sa tastature ( ctrl+c) - prekid koji nastaje kada doe do deljenja nulom - korisniki definisani pr ekid - korisniki definisani prekid Korisniki prekid se moe poslati programu otvaranjem novog shell-a i kucanjem nared be killall -s SIGUSR1 naziv_programa Primer: beskonana petlja iz koje se izlazi n akon korisnikog prekida. #include "interrupts.h" petlja_izlaz: stari_prekid: movl push call addl movl .lo ng 0 .long 0 $USR1, %eax #uvanje adrese trenutnog %eax #obraivaa prekida interrupt_handler_get $ 4, %esp %eax, stari_prekid #postavljanje novog #obraivaa prekida leal kor_prekid, %eax push %eax movl $USR1, %eax push %eax call interrupt_handle r_set addl $8, %esp petlja: cmpl $0, petlja_izlaz je petlja kraj: movl stari_pre kid, %eax push %eax movl $USR1, %eax push %eax call interrupt_handler_set addl $ 8, %esp movl $1, %eax movl $0, %ebx int $0x80 kor_prekid: movl $1, petlja_izlaz ret #beskonana petlja #vraanje starog #obraivaa prekida #omoguavanje izlaska iz petlje

Asinhroni dogaaji Strana 52 Obraiva prekida je u ovom primeru izuzetno jednostavan: u njemu se samo postavlja indikator (petlja_izlaz) da se prekid desio, dok proveru stanja tog indikatora v ri glavni program. Ovo je u skladu sa preporukom da obraivai prekida treba da traju to krae. Poto se u njemu ne koriste registri, nije bilo potrebe da se uvaju na stek u. Glavni program se sastoji iz 3 dela. U prvom se uva adresa trenutnog obraivaa pr ekida i postavlja se novi. U drugom se nalazi sm program (beskonana petlja), dok s e u treem vraa stari obraiva prekida i nakon toga se program zavrava. 10.3. Domai zadatak 1. Napisati obraiva prekida sistemskog sata koji e na ispravan nain uveavati promenlj ivu koja u sebi sadri broj sekundi proteklih od pokretanja programa. Glavni progr am treba da omogui ispis trenutnog broja sekundi (na zahtev korisnika) i izlaz iz programa.

Pregled korienih naredbi Strana 53 11. Pregled korienih naredbi U ovoj glavi je dat abecedni pregled asemblerskih naredbi koje su koriene u progra mima u ovom praktikumu. Za svaku naredbu su navedeni operandi koji se uz nju oeku ju, pri emu oznaka src oznaava izvorni, dst oznaava odredini operand, dok cnt oznaava brojaki operand kod naredbi za pomeranje. Uz svaku naredbu je dat i tablarni pre gled uticaja na pojedine flegove, pri emu je notacija za uticaj na pojedinani fleg sledea: ? M T Nema promene Vrednost je nedefinisana Vrednost se menja u skladu s a rezultatom (ukoliko se drugaije ne naglasi) Vrednost se testira tokom operacije 0 ili 1 Fleg se postavlja na navedenu vrednost Opisi naredbi u daljem tekstu vae za 32-bitni zatieni reim procesora Intel 80386. adc src, dst o M d s M z c M TM Sabira izvorni i odredini operand i rezultat smeta u odredini operand. Prilikom sab iranja, zateeni prenos se uzima u obzir. add src, dst o M d s M z M c M Sabira izvorni i odredini operand i rezultat smeta u odredini operand. Prilikom sab iranja, zateeni prenos se ne uzima u obzir. and src, dst o 0 d s M

z M c 0 Vri operaciju logikog I izmeu korespondentnih bita izvornog i odredinog operanda i r ezultat smeta u odredini. call dst o d s z c Poziv potprograma. Prilikom poziva, na stek se smeta povratna adresa. clc Postavl ja carry fleg na 0. o d s z c 0

Pregled korienih naredbi Strana 54 cld Postavlja direction fleg na 0. cmp src, dst o d 0 s z c o M d s M z M c M Oduzima izvorni operand od odredinog, postavlja flegove u skladu sa tim, ali ne m enja odredini operand. dec dst o M d s M z M c Oduzima 1 od odredinog operanda. div src o ? d

s ? z ? c ? Neoznaeno deljenje. U zavisnosti od veliine izvornog operanda, ima sledee dejstvo: divb operand divw operand divl operand # ax/operand -> al, ostatak -> ah # dx:ax /operand -> ax, ostatak -> dx # edx:eax/operand -> eax, ostatak -> edx idiv src o ? d s ? z ? c ? Oznaeno deljenje. U zavisnosti od veliine izvornog operanda, ima sledee dejstvo: idivb operand idivw operand idivl operand # ax/operand -> al, ostatak -> ah # dx :ax/operand -> ax, ostatak -> dx # edx:eax/operand -> eax, ostatak -> edx imul src o M d s ? z ? c M Oznaeno mnoenje. U zavisnosti od veliine izvornog operanda, ima sledee dejstvo: imulb operand imulw operand imull operand # al*operand -> ax # ax*operand -> dx: ax # eax*operand -> edx:eax

inc dst o M d s M z M c Dodaje 1 na odredini operand. int dst o d s z c -

Pregled korienih naredbi Generie softverski prekid. jxx dst Strana 55 o d s z c Uslovni skok. Odredini operand je rastojanje ciljne naredbe od naredbe koja sledi naredbu skoka (ovo rastojanje asembler rauna automatski kada se kao operand stav i neka labela). Ovih naredbi ima vie, a osnovne su date u sledeim tabelama: Uslovn i skokovi nakon poreenja neoznaenih brojeva jxx ja jae jb jbe jna jnae jnb jnbe je jne vee vee ili jednako manje manje ili jednako nije vee nije vee ili jednako nije manje nije manje ili jednako jednako nije jednako Skok ako je ... odnosno ... c= 0iz=0 c=0 c=1 c = 1 ili z = 1 c = 1 ili z = 1 c=1 c=0 c=0iz=0 z=1 z=0 Uslovni skokovi nakon poreenja oznaenih brojeva jxx jg jge jl jle jng jnge jnl jnl e je jne vee vee ili jednako manje manje ili jednako nije vee nije vee ili jednako n ije manje nije manje ili jednako jednako nije jednako Skok ako je ... odnosno .. . z=0is=o s=o s <> o z = 1 ili s <> o z = 1 ili s <> o s <> o s=o z=0is=o z=1 z= 0

Pregled korienih naredbi Ostali uslovni skokovi jxx jc jnc jz jnz jo jno js jns jc xz jecxz prenos nije prenos nula nije nula prekoraenje nije prekoraenje znak nije znak cx = 0 ecx = 0 Skok ako je ... odnosno ... c=1 c=0 z=1 z=0 o=1 o=0 s=1 s=0 Strana 56 jmp dst o d s z c Bezuslovni skok. lea src, dst o d s z c Smeta efektivnu adresu izvornog operanda u odredini. lods o d s z c U zavisnosti od veliine podrazumevanog operanda, ima sledee dejstvo:

lodsb # (esi) -> al, esi+1 -> esi za d=0, odnosno esi-1 -> esi za d=1 lodsw # (e si) -> 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 Podrazumevani segmentni regis tar je ds (ds:esi). loop dst o d s z c Smanjuje cx (loopw), odnosno ecx (loopl) za 1 i skae na ciljnu naredbu ako je rez ultat razliit od nule. mov src, dst o d s z c Kopira izvorni operand u odredini.

Pregled korienih naredbi Strana 57 mul src o M d s ? z ? c M Neoznaeno mnoenje. U zavisnosti od veliine izvornog operanda, ima sledee dejstvo: mulb operand mulw operand mull operand # al*operand -> ax # ax*operand -> dx:ax # eax*operand -> edx:eax neg dst o M d s M z M c M Negira odredini operand po komplementu 2. nop Naredba bez efekta. not dst o d s z -

c o d s z c Negira odredini operand po komplementu 1. or src, dst o 0 d s M z M c 0 Vri operaciju logikog ILI izmeu korespondentnih bita izvornog i odredinog operanda i rezultat smeta u odredini. pop dst o d s z c Skida vrednost sa vrha steka i smeta je u odredini operand, nakon ega se vrednost p okazivaa na vrh steka povea za 4. push src o d

s z c Smanji vrednost pokazivaa na vrh steka za 4, a zatim izvorni operand smeta na novi vrh steka. rcl cnt, dst o M/? d s z c TM Rotira odredini operand kroz fleg carry u levo za navedeni broj mesta (neposredni operand ili registar cl). Ukoliko se rotira za vie od jednog mesta, fleg overflo w je nedefinisan. rcr cnt, dst o M/? d s z c TM

Pregled korienih naredbi Strana 58 Rotira odredini operand kroz fleg carry u desno za navedeni broj mesta (neposredn i operand ili registar cl). Ukoliko se rotira za vie od jednog mesta, fleg overfl ow je nedefinisan. ret o d s z c Povratak iz potprograma. Povratna adresa se skida sa vrha steka, nakon ega se vre dnost pokazivaa na vrh steka povea za 4. rol cnt, dst o M/? d s z c M Rotira odredini operand u levo za navedeni broj mesta (neposredni operand ili reg istar cl). Ukoliko se rotira za vie od jednog mesta, fleg overflow je nedefinisan . Fleg carry ima vrednost poslednjeg bita upisanog na najmanje znaajnu poziciju. ror cnt, dst o M/? d s z c M

Rotira odredini operand u desno za navedeni broj mesta (neposredni operand ili re gistar cl). Ukoliko se rotira za vie od jednog mesta, fleg overflow je nedefinisa n. Fleg carry ima vrednost poslednjeg bita upisanog na najvie znaajnu poziciju. sa r cnt, dst o M/? d s M z M c M Pomera odredini operand u desno za navedeni broj mesta (neposredni operand ili re gistar cl). Naznaajniji bit zadrava svoju vrednost. Ukoliko se pomera za vie od jed nog mesta, fleg overflow je nedefinisan. Fleg carry ima vrednost poslednjeg bita istisnutog sa najmanje znaajne pozicije. sbb src, dst o M d s M z c M TM Oduzima izvorni operand od odredinog i rezultat smeta u odredini operand. Prilikom oduzimanja, zateeni prenos se uzima u obzir. shl cnt, dst o M/? d s M z M c M Pomera odredini operand u levo za navedeni broj mesta (neposredni operand ili reg

istar cl). Najmanje znaajni bit dobija vrednost 0. Ukoliko se pomera za vie od jed nog mesta, fleg overflow je nedefinisan. Fleg carry ima vrednost poslednjeg bita istisnutog sa najvie znaajne pozicije. shr cnt, dst o M/? d s M z M c M Pomera odredini operand u desno za navedeni broj mesta (neposredni operand ili re gistar cl). Naznaajniji bit dobija vrednost 0. Ukoliko se pomera za vie od jednog mesta, fleg overflow je nedefinisan. Fleg carry ima vrednost poslednjeg bita ist isnutog sa najmanje znaajne pozicije.

Pregled korienih naredbi Strana 59 stc Postavlja carry fleg na 1. std Postavlja direction fleg na 1. stos o d s z c 1 o d 1 s z c o d s z c U zavisnosti od veliine podrazumevanog operanda, ima sledee dejstvo: 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 regis tar je es (es:edi). sub src, dst

o M d s M z M c M Oduzima izvorni operand od odredinog i rezultat smeta u odredini operand. Prilikom oduzimanja, zateeni prenos se ne uzima u obzir. test src, dst o 0 d s M z M c 0 Vri operaciju logikog I izmeu korespondentnih bita izvornog i odredinog operanda, po stavlja flegove u skladu sa tim, ali ne menja odredini operand. xchg src, dst o d s z c Zamenjuje vrednosti izvornog i odredinog operanda. xor src, dst o 0 d -

s M z M c 0 Vri operaciju ekskluzivnog ILI izmeu korespondentnih bita izvornog i odredinog oper anda i rezultat smeta u odredini. Za detaljniji pregled naredbi procesora Intel 80 386 italac se upuuje na knjigu Intel 80386 Programmer's Reference Manual.

Dodaci Strana 60 12. Dodaci 12.1. ASCII tabela Decimal Octal ------- ----000 000 001 001 002 002 003 003 004 004 005 005 006 00 6 007 007 008 010 009 011 010 012 011 013 012 014 013 015 014 016 015 017 016 02 0 017 021 018 022 019 023 020 024 021 025 022 026 023 027 024 030 025 031 026 03 2 027 033 028 034 029 035 030 036 031 037 032 040 033 041 034 042 035 043 036 04 4 037 045 038 046 039 047 040 050 041 051 042 052 043 053 044 054 045 055 046 05 6 047 057 048 060 049 061 050 062 051 063 052 064 053 065 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 Binary Value ------ ----00000000 NUL (Nu ll char.) 00000001 SOH (Start of Header) 00000010 STX (Start of Text) 00000011 E TX (End of Text) 00000100 EOT (End of Transmission) 00000101 ENQ (Enquiry) 00000 110 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) 00 010010 DC2 (Device Control 2) 00010011 DC3 (XOFF/Device Control 3) 00010100 DC4 (Device Control 4) 00010101 NAK (Negative Acknowledgement) 00010110 SYN (Synchro nous Idle) 00010111 ETB (End of Trans. Block) 00011000 CAN (Cancel) 00011001 EM (End of Medium) 00011010 SUB (Substitute) 00011011 ESC (Escape) 00011100 FS (Fil e Separator) 00011101 GS (Group Separator) 00011110 RS (Request to Send)(Record Separator) 00011111 US (Unit Separator) 00100000 SP (Space) 00100001 ! (exclamat ion mark) 00100010 " (double quote) 00100011 # (number sign) 00100100 $ (dollar sign) 00100101 % (percent) 00100110 & (ampersand) 00100111 ' (single quote) 0010 1000 ( (left/opening parenthesis) 00101001 ) (right/closing parenthesis) 0010101 0 * (asterisk) 00101011 + (plus) 00101100 , (comma) 00101101 - (minus or dash) 0 0101110 . (dot) 00101111 / (forward slash) 00110000 0 00110001 1 00110010 2 0011 0011 3 00110100 4 00110101 5

Dodaci 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 066 067 070 071 072 073 074 075 076 077 100 101 102 103 104 105 106 107 110 111 112 113 114 115 116 117 120 121 122 123 124 125 126 127 130 131 132 133 134 135 136 137 140 141 142 143 144 145 146 147 150 151 152 153 154 155 156 157 160 161 162 163 164 036 037 038 039 03A 03B 03C 03D 03E 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 00110110 00110111 00111000 00111001 00111010 00111011 00111100 00111101 00111110 00111111 01000000 01000001 01000010 0100001 1 01000100 01000101 01000110 01000111 01001000 01001001 01001010 01001011 010011 00 01001101 01001110 01001111 01010000 01010001 01010010 01010011 01010100 01010 101 01010110 01010111 01011000 01011001 01011010 01011011 01011100 01011101 0101 1110 01011111 01100000 01100001 01100010 01100011 01100100 01100101 01100110 011 00111 01101000 01101001 01101010 01101011 01101100 01101101 01101110 01101111 01 110000 01110001 01110010 01110011 01110100 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t Strana 61 (colon) (semi-colon) (less than) (equal sign) (greater than) (question mark) (AT symbol) (left/opening bracket) (back slash) (right/closing bracket) (caret/cirumflex) (u nderscore)

Dodaci 117 118 119 120 121 122 123 124 125 126 127 165 166 167 170 171 172 173 174 175 176 177 075 076 077 078 079 07A 07B 07C 07D 07E 07F 01110101 01110110 01110111 0 1111000 01111001 01111010 01111011 01111100 01111101 01111110 01111111 u v w x y z { | } ~ DEL Strana 62 (left/opening brace) (vertical bar) (right/closing brace) (tilde) (delete)

Indeks pojmova 80386 13 ASCII 34 asembler 15 dibager 16 direktive ascii 34 broja lokacija 46 byt e 22 data 15 direktiva 15 endm 47 fill 39 globl 16 long 22 macro 47 section 15 t ext 15 word 22 #include 51 frejm 30 jednostruka preciznost 20 labela 14 linker 1 5 Linux case sensitive 1 direktorijumi 3 distribucija 1 Linux 1 logovanje 1 nazi vi fajlova 4 odjavljivanje 1 specijalni poddirektorijumi 3 lokalna labela 47 mas kiranje 20 naredbe adc 23, 53 add 23, 53 and 20, 53 call 29, 53 clc 53 cld 54 cm p 18, 54 dec 32, 54 div 39, 54 idiv 54 imul 54 inc 23, 54 int 45, 54 ja 18 jcxz 25 je 18 jecxz 25 jmp 18, 56 jxx 55 jz 25 lea 34, 56 lods 56 loop 28, 56 mov 18, 56 mul 33, 57 neg 20, 57 nop 19, 57 not 20, 57 or 20, 57 pop 29, 57 push 29, 57 rcl 21, 57 rcr 21, 57 ret 29, 58 rol 21, 58 ror 21, 58 sar 20, 58 sbb 24, 58 sh l 20, 58 shr 20, 58 stc 59 std 59 stos 59 sub 18, 59 test 20, 59 xchg 19, 59 xor 20, 59 NUL 34 pretprocesor 15 registri 13 shell alias 5 bash 2 cat 5 cd 3 chmod 5 cp 4 doker znaci 4 exit 3 g++ 51 gcc 15 grep 5, 11 help 4 istorija komandi 2 k illall 51 kompletiranje naziva 2 less 5

ls 4 man 4 mkdir 5 mv 5 pajp 6 PATH 3 preusmeravanje U/I 6 prompt 2 pwd 4 rm 4 r mdir 5 set 5 shell 2 touch 5 unalias 6 skriptovi aritmetiki izrazi 10 echo 8, 11 exit 10 for 10 if 9 operatori 9 pozicio ni parametri 9 promenljive 8 shift 9 skript 8 uslovi 9 while 11 zamena komandi 1 1 stek 29 Indeks slika Slika 1: Linux sa KDE okruenjem.................................................. ...................................2 Slika 2: konqueror browser................. .............................................................................. 7 Slika 3: Midnight Commander.................................................... .......................................7 Slika 4: Osnovni registri procesora Int el 80386..............................................................13 Slika 5 : DDD dibager................................................................... .................................... 16 Slika 6: Algoritam za izraunavanje NZD: ( a) pseudokod i (b) C kd............................. 18 Slika 7: Naredbe za pomer anje: princip rada (a) i primer pomeranja za 1 mesto (b).....21 Slika 8: Naredbe za rotiranje: princip rada (a) i primer rotiranja za 1 mesto (b)...........22 S lika 9: Mnoenje pomou sabiranja (a) i deljenje pomou oduzimanja (b)................ ....24 Slika 10: Algoritam za mnoenje pomou sabiranja i pomeranja................. ...................24 Slika 11: Algoritam za brojanje dana sa temperaturom u zad atim granicama............... 27 Slika 12: Izgled 80386 steka pre i posle operac ije pushl $0........................................... 29 Slika 13: C funkcija: (a) izvorni kd i (b) izgled frejma nakon poziva funkcije, a pre izvravanja njenog tela........................................................................... ......................... 31 Slika 14: Konverzija znakovnog zapisa neoznaenog dek adnog broja u interni format. 35 Slika 15: Konverzija iz internog formata u bina rni znakovni format...............................40 Slika 16: Paritet.......... ................................................................................ ..................... 43 Slika 17: Paritet na najznaajnijem bitu................. .........................................................43 Slika 18: Vertikalni paritet........................................................................ ...................... 44 Indeks tabela Tabela 1: Doker znaci............................................................ ...........................................4 Tabela 2: Operatori bash-a......... ................................................................................ ..... 10 Tabela 3: Pomeranje i rotiranje u dvostrukoj preciznosti............... .................................26

You might also like