Praktikum računarskih vežbi

za predmet

Arhitektura računara

Autori: Žarko Živanov Ivan Nejgebauer Miroslav Hajduković

Novi Sad, 2006.

Sadržaj I

Sadržaj
1. Uvod u korišćenje Linux operativnog sistema............................................................... 1 1.1. Prijavljivanje na sistem........................................................................................... 1 1.2. Mogućnosti Linux-a.................................................................................................1 1.3. Otvaranje shell-a (bash).......................................................................................... 2 1.4. Organizacija direktorijuma..................................................................................... 3 1.5. Osnovne komande bash-a....................................................................................... 3 Kretanje po stablu direktorijuma i listanje fajlova..................................................... 3 Manipulacija fajlovima i direktorijumima.................................................................. 4 Prikaz sadržaja fajla i pretraživanje...........................................................................5 Alias-i..........................................................................................................................5 Preusmeravanje standardnog ulaza i izlaza i pajpovi................................................ 6 Izvršavanje programa u pozadini............................................................................... 6 1.6. Programi za manipulaciju fajlovima........................................................................6 1.7. Tekst editori............................................................................................................ 7 1.8. Korisni linkovi......................................................................................................... 7 2. Shell skriptovi................................................................................................................ 8 2.1. Jednostavni skriptovi...............................................................................................8 2.2. Promenljive............................................................................................................. 8 2.3. Upravljačke strukture............................................................................................. 9 2.4. Petlje..................................................................................................................... 10 2.5. Domaći zadaci....................................................................................................... 12 2.6. Korisni linkovi....................................................................................................... 12 3. Asemblerski programi..................................................................................................13 3.1. Programski model procesora Intel 80386.............................................................13 3.2. AT&T sintaksa.......................................................................................................14 3.3. Načini adresiranja memorije.................................................................................14 3.4. Alati: pretprocesor, asembler, linker, dibager......................................................15 3.5. Primer: izračunavanje NZD.................................................................................. 18 3.6. Domaći zadaci....................................................................................................... 19 4. Dvostruka preciznost. Nizovi.......................................................................................20 4.1. Neoznačeni i označeni brojevi.............................................................................. 20 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. Množenje i deljenje pomoću sabiranja i oduzimanja............................................ 24 4.6. Pomeranje i rotiranje u dvostrukoj preciznosti.....................................................25 4.7. Negacija u dvostrukoj preciznosti.........................................................................26 4.8. Primer: brojanje dana iz određenog perioda godine............................................ 26 4.9. Domaći zadaci....................................................................................................... 28 5. Potprogrami................................................................................................................. 29 5.1. Prenos argumenata preko registara..................................................................... 29 5.2. Prenos argumenata preko steka........................................................................... 30 5.3. Prenos argumenata po vrednosti i po adresi........................................................ 32 5.4. Rekurzija............................................................................................................... 32 5.5. Domaći zadaci....................................................................................................... 33 6. Konverzije različitih brojnih osnova 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 interni oblik...........36 6.3. Konverzija iz znakovnog oblika (razlomljeni binarni broj) u interni oblik............ 36 6.4. Opšti sučaj konverzije iz znakovnog oblika (razlomljeni broj) u interni oblik..... 37 6.5. Domaći zadaci....................................................................................................... 38

..........44 9.......................................3............................................ ASCII tabela.................................................. Opšti slučaj konverzije iz internog oblika u znakovni oblik (razlomljeni broj).............................................................52 11..............39 7........... Konverzija iz internog oblika u znakovni oblik (ceo binarni broj)......... Prekidi...........................................3... Dodaci.......................... 42 7................. Domaći zadatak............................................................................................... 39 7........................................................................4.. Signali............ Konverzije iz internog formata u različite brojne osnove.4........1............................................... Makroi..47 9..... 60 12....................................................................3......1.............53 12....................................... izlaz i završetak programa.................. 42 8.............. Asinhroni događaji......... Kontrolna suma i paritet.............. Domaći zadatak......................................................... 60 .................................................................................... 50 10............................. izlaz i makroi.......... Pregled korišćenih naredbi.................................1.... 45 9.............2............... 49 10.. Konverzija iz internog oblika u znakovni oblik (ceo dekadni broj)...............50 10..........................................................................Sadržaj II 7..........................................43 8.................................................................................................................5...................45 9..............45 9.............. 50 10.......................................2................. Konverzija iz internog oblika u znakovni oblik (razlomljeni binarni broj)......................................... Ulaz..................................................... 40 7............................................................................................ 41 7......................................................... Ulaz............ Domaći zadaci. Domaći zadaci.. Sistemski pozivi.2...............................................1...............1.........

Ovo takođe daje mogućnost programerima širom sveta da učestvuju u razvoju Linux-a i programa iz njegove distribucije. Firme i organizacije koje nude distribucije Linux-a u svojoj ponudi imaju kako besplatne. menije. na primer. programi za obradu grafike i zvuka. kao i za skoro sav softver koji stiže uz njega. . Ovo daje mogućnost krajnjim korisnicima da promene delove koji im ne odgovaraju. Veliki deo web stranica se nalazi pod upravom programa Apache. Uvod u korišćenje Linux operativnog sistema Operativni sistem (OS) Linux [1] je namenjen za razne hardverske platforme. naravno. Za njega su razvijene brojne aplikacije koje se obično isporučuju u okviru distribucije. Nakon uspešnog prijavljivanja. To se obavlja izborom opcije Logout iz sistemskog menija. 1. Prilikom uključivanja računara korisniku se nudi izbor koji od operativnih sistema želi da pokrene. između ostalog i za Intel x86 platformu. Debian. OS je spreman za rad. 1. Mogućnosti Linux-a Grafičko okruženje Linux-a sadrži radnu površinu (desktop). Treba obratiti pažnju na to da Linux pravi razliku između malih i velikih slova (on je case sensitive). Tako. Po pokretanju Linux-a od korisnika se očekuje da unese svoje korisničko ime i lozinku. bez plaćanja licence za njegovo korišćenje. Prijavljivanje na sistem Linux se može instalirati tako da koegzistira sa nekim već postojećim OS-om na računaru. tako i komercijalne distribucije. Distribucija predstavlja instalacionu verziju Linux-a. nekom drugom se daje mogućnost da pristupi fajlovima neodjavljenog korisnika. Neke od poznatijih distribucija su Mandrake. internetom. Za Linux OS. programi za podešavanje sistema. RedHat. imena pera i Pera označavaju dva različita korisnika. Za Linux postoji više različitih distribucija. razvojna okruženja. nalaze i brojni programi. Linux je takođe veoma zastupljen kao serverska platforma. Linux je pod GPL (General Public License) licencom [2]. standardno se u distribucijama nalaze programi za rad sa elektronskom poštom.Uvod u korišćenje Linux operativnog sistema Strana 1 1. office paketi. Linux je savremen OS sa modernim grafičkim okruženjem i podrškom za mnoge hardverske uređaje. a može se naći i na Internetu. programi za narezivanje CD-ova. pored samog OS-a. taskbar.2. pošto je korisnicima pod Linux-om dozvoljeno da manipulišu samo svojim fajlovima. fajlovima. u kojoj se. Odjavljivanje je neophodno. naročito na računarima povezanim na internet. igre i još mnogo toga. koji može stići i u distribuciji. podržani). ikone. što znači da je njegov izvorni kod svima dostupan i da se može slobodno koristiti. SuSE. pod pretpostavkom da su dovoljno stručni da urade tako nešto. se može dobiti i izvorni kod. U distribuciji Linux-a stiže i veći broj programa za razne primene. naravno. Na kraju rada neophodna je odjava sa operativnog sistema. strelicu miša. čije je osnovno okruženje upravo Linux. logovanje). programi za puštanje muzike i videa u različitim formatima (mp3 i DivX su. Ako se računar ostavi bez odjavljivanja. Tako.1. čime se prijavljuje na sistem (tzv. Knoppix [3].

Sve ranije zapamćene komande se mogu pregledati pritiskom na kursorske tastere ↑ i ↓. dovoljno je otkucati prvih nekoliko slova neke komande i pritisnuti taster Tab. pa korisnik može odabrati šta mu treba. bash je spreman da prihvati komandu. ona će biti ispisana. mogu se koristiti i Shift+↑.3. a ako postoji više. a “$” je oznaka da je prijavljen običan korisnik. istorija komandi). Važno je uočiti da bash pravi razliku između malih i velikih slova. to se može postići pritiskom na Shift+PgUp. Najčešće korišćeni shell je bash (Bourne Again Shell). Naime. pa se pritisne Tab. i koji ima ulogu interpretera komandi. tada će biti ispisane alternative. Broj zapamćenih komandi se može podesiti. Reč “user” označava korisničko ime. Još jedna korisna mogućnost bash-a je kompletiranje naziva. odnosno prompt. koji je obično podrazumevani shell u Linux distribucijama i koji će se i ovde koristiti. Ekran terminala se brzo popuni i tada se stari sadržaj gubi zbog pomeranja linija teksta na gore. Na primer. Alternativno. “computer” je naziv računara na kome je korisnik prijavljen. odnosno Shift+↓. Otvaranje shell-a (bash) Komunikaciju sa korisnikom putem komandne linije omogućuje program koji se zove shell. ako se otkuca “hi”. bash pamti komande koje je korisnik ranije kucao (tzv. Kada je prompt ispisan na ekranu. Jedan od načina pokretanja shell-a je posredstvom terminal emulatora. Nakon pokretanja bash-a. ispisuje se njegov odziv. Podrazumevani izgled prompt-a je: [user@computer download]$. na ekranu će se ispisati nekoliko komandi koje počinju . Nakon toga. odnosno Shift+PgDn.Uvod u korišćenje Linux operativnog sistema Strana 2 Slika 1: Linux sa KDE okruženjem 1. Terminal emulator se otvara klikom na njegovu ikonu u donjem delu ekrana. čime se u okviru njega automatski pokreće i bash. Ukoliko je potrebno videti prethodne sadržaje ekrana. “download” je naziv tekućeg direktorijuma. ukoliko postoji samo jedna mogućnost za komandu.

ili koreni direktorijum i označava se sa “/”. Direktorijum “bin” sadrži osnovne sistemske programe. Organizacija direktorijuma Osnovni direktorijum u Linux-ovom fajl sistemu je root.” označava nadređeni direktorijum (parent). Ovaj znak takođe mora stojati i između poslednjeg naziva poddirektorijuma i naziva fajla.4./naziv_programa. Osnovne komande bash-a Kretanje po stablu direktorijuma i listanje fajlova Komanda koja služi za kretanje po stablu direktorijuma je cd (change directory). pored direktorijuma “tmp”. C:. Treba napomenuti da se tekući direktorijum ne nalazi u ovom spisku. ako treba pokrenuti program koji se nalazi u tekućem direktorijumu (a koji se ne nalazi u PATH-u). koja se može koristiti za pristup iz komandne linije. za obične korisnike je značajno nekoliko njih. dokumentacija. Do završetka rada bash-a dovodi zadavanje komande exit ili pritisak na ctrl+d. Za korisnike je ipak najbitniji direktorijum “home” u kome se nalaze lični fajlovi za svakog od korisnika koji imaju nalog na sistemu. ili im je pristup potpuno onemogućen. razni pomoćni i konfiguracioni fajlovi). 1. Ovo je samo podrazumevani direktorijum za uvezivanje uređaja (mount-ovanje). ukoliko se ne navede tačna putanja do njega. Svi ostali direktorijumi se mogu ili samo čitati. Direktorijum “mnt” u sebi sadrži putanje do uređaja koji se nalaze u sistemu. Svaki korisnik u ovom direktorijumu ima svoj poddirektorijum i obično je to jedino mesto u kome korisnici imaju pravo upisa.5. flash diskovi. Oba se često koriste u radu iz komandne linije. Ukoliko se otkuca samo cd bez parametara. Direktorijum “usr” sadrži korisničke programe i sve što je potrebno za njihovo korišćenje (slike. hard diskovi. CD-ROM. Kada se navodi putanja do nekog direktorijuma. Spisak ovih direktorijuma se nalazi u promenljivoj okruženja (environment variable) PATH. U svakom direktorijumu se nalaze i dva specijalna poddirektorijuma: “. Direktorijum “etc” sadrži razne konfiguracione fajlove. dok “. kao što su floppy disk. itd./drugi/ . većinom u tekstualnom obliku. I korisnikov home direktorijum ima posebnu oznaku “~” (tilda). nazivi pojedinih poddirektorijuma se razdvajaju sa “/”.). tako da. Na primer. dok se prilikom kucanja parametara komandi pretražuje tekući direktorijum. ako je tekući direktorijum /home/pera/prvi/ a želi se preći u /home/pera/drugi/ može se kucati apsolutna putanja cd /home/pera/drugi/ ili relativna cd .. pretražiće se podrazumevani direktorijumi za izvršne fajlove. koji se nalazi iznad tekućeg.. Kada se kuca naziv komande (prva reč u liniji). Svi drugi direktorijumi se nalaze ispod njega. 1. pošto je to jedina komanda koja počinje sa “his”. kompletiranje naziva radi i sa nazivima direktorijuma i fajlova. Kod Linux-a ne postoje posebne oznake uređaja (A:. Pored toga što se može koristiti za nazive komandi i programa. Od direktorijuma koji se nalaze u root-u. pretražuju se podrazumevani direktorijumi (videti sledeće poglavlje). pošto se uređaji mogu povezati na bilo koje mesto u hijerarhiji direktorijuma. tekući direktorijum postaje home direktorijum korisnika.” označava tekući direktorijum.Uvod u korišćenje Linux operativnog sistema Strana 3 slovima “hi”. potrebno je kucati . Kao parametar se može navesti relativna ili apsolutna putanja do direktorijuma u koji se želi preći. Kada se od Linux-a zatraži da pokrene neki izvršni fajl. Ukoliko se otkuca i slovo “s”. nakon pritiska na Tab će se na ekranu ispisati history.

c. Ukoliko se u uputstvu traži neka posebna reč. opcija -l (malo slovo L) omogućuje prikaz svih podataka o fajlovima i direktorijumima.Uvod u korišćenje Linux operativnog sistema Strana 4 Treba napomenuti da se u svakom trenutku kucanja putanje može koristiti kompletiranje naziva pomoću tastera Tab. ”*”. ako treba obrisati . ispred razmaka treba staviti “\”)./ Ukoliko treba obrisati jedan ili više fajlova. Na primer. to se može postići kucanjem komande pwd (print working directory). ”_” ili “. od kojih će ove biti pomenute samo neke. alternativno. Na primer. To se postiže komandom cp (copy). nakon čega treba samo pritisnuti Enter. Za svaku komandu se može dobiti spisak svih njenih opcija kucanjem komande i argumenta --help. samo što se zamnjuje tačno određeni skup znakova. odnosno ?. U nazivu se može naći i razmak (tada se naziv mora staviti unutar znakova navoda. [a-dps] bi bila zamena za jedan od sledećih znakova: a. Oni se mogu koristiti sa bilo kojom komandom koja kao parametar prihvata naziv fajla ili direktorijuma. Osnovni oblik ove komande je: cp šta_se_kopira gde_se_kopira Ukoliko se kopira samo jedan fajl.xyz iz home direktorijuma u tekući direktorijum. kao što su “-”. treba otkucati /.d. za pretragu unapred. ali se ipak preporučuje da se umesto razmaka koristi znak “_”.p.”. Jedna od osnovnih operacija pri radu sa fajlovima je njihovo kopiranje. “?”. b ili c. Na primer. brojeva i nekih specijalnih znakova. “&”. ili. tada se umesto parametra gde_se_kopira može navesti drugo ime za fajl. a ne i njihov sadržaj. čime se vreme kucanja može znatno skratiti. “$”. komanda bi ls pr* Ako treba izlistati sve fajlove u tekućem direktorijumu koji počinju sa a. Ponovna pretraga za istom rečju se ostvaruje kucanjem /. za komandu ls uputstvo se može dobiti kucanjem man ls. ako treba izlistati sve fajlove u tekućem direktorijumu koji počinju sa pr. pa nakon toga reč koja se traži. Znaci koje nikako ne treba koristiti u nazivima su “!”. koristi se komanda rm (remove). komanda bi bila: ls [a-c]* Upotreba džoker znakova nije ograničena samo na ls komandu. Pregledanje uputstva se vrši kursorskim tasterima. Ono što će prikazati komanda ls se može dodatno filtrirati upotrebom džoker znakova: Džoker znak * ? [] Značenje Zamenjuje bilo koji broj bilo kojih znakova Zamenjuje tačno jedan bilo koji znak Slično sa ?. Ova komanda ima puno opciija.b. “/”. a u suprotnom mora biti naziv direktorijuma. Na primer. odnosno ? za pretragu unazad.s Tabela 1: Džoker znaci bila: Tako. dok opcija -d omogućava da se ispišu samo nazivi direktorijuma. na primer. Razlog za ovo je što mnogi specijalni znaci imaju posebno značenje i upotrebu (neki su već navedeni. Drugi način dobijanja (detaljnije) pomoći za neku komandu je komanda man (manual). komanda bi bila: cp ~/*. a o nekima će biti reči kasnije). Ukoliko je potrebno saznati punu putanju do tekućeg direktorijuma. ”<” i ”>”. Prikaz sadržaja tekućeg direktorijuma (ili direktorijuma koji se navede kao parametar) omogućuje komanda ls (list).xyz . dok se izlazak postiže pritiskom na taster q. Manipulacija fajlovima i direktorijumima Nazivi fajlova pod Linux-om se mogu sastojati od slova (velikih i malih). Opcija -a omogućuje da se prikažu i skriveni fajlovi i direktorijumi koji se standardno ne prikazuju (njihova imena počinju tačkom). ako treba kopirati sve fajlove sa ekstenzijom .

samo će preleteti preko ekrana. Ukoliko je potrebno. komanda set otkucana bez parametara prikazuje spisak svih promenljivih okruženja i njihovih vrednosti. Komanda mv se može koristiti i za preimenovanje fajlova. Ako se naziv fajla ne navede. Prva je komanda cat (concatenate) čija je osnovna namena da spoji više fajlova u jedan. Na primer.pas Opcija -i znači da se zanemaruje razlika između velikih i malih slova. ako korisniku treba dati pravo izvršavanja nekog fajla.pas i ispis2. Ukoliko je tekst iole veći. čiji je efekat da se korisnik pita za brisanje svakog fajla ponaosob. execute). less. Treba obratiti pažnju na to da rmdir može obrisati samo prazan direktorijum. Obe komande kao parametar prihvataju naziv direktorijuma. naročito kada su programi u pitanju. dobiće se ispis sadržaja fajla na ekran. Kao izlaz. Na primer. Ako svi fajlovi sigurno treba da budu obrisani. odnosno skraćenica . ako se greškom umesto rm -f aaa* otkuca rm -f aaa * (razmak između 'aaa' i '*'). omogućava da se tekst lista u oba smera korišćenjem kursorskih tastera (izlazak je pomoću tastera q). može se koristiti set|grep PATH. ako fajl postoji. Nekad treba premestiti fajl sa jednog mesta na drugo (tj. Na primer. biće pobrisani svi fajlovi u direktorijumu. Standardni ulaz i izlaz se mogu preusmeriti na druge fajlove. Osnovna namena ove komande je da. podešeno da rm radi sa opcijom -i (pomoću alias-a). korisnik će biti pitan za svaki. pa ako se napiše cat naziv_fajla. Ukoliko treba izdvojiti podatak o nekoj posebnoj promenljivoj. tada se kreira novi prazan fajl. iz razloga sigurnosti. ukoliko se drugačije ne navede. ako se komanda ls -d *. Svaki fajl pod Linux-om ima pridružen skup atributa. Na primer. Korisnik može imati prava čitanja (r. tada se podrazumeva standardni ulaz. a ukoliko fajl ne postoji. Komanda koja radi upravo to je grep. a kao standardni izlaz koristi specijalni fajl koji odgovara ekranu. Često je potrebno u tekstualnom fajlu naći red u kome se nalazi neki tekst. iskopirati ga na drugo mesto. a da termin standardni izlaz označava uređaj na kome se podaci prikazuju. odnosno drugih imena za postojeće komande. sa ovom opcijom treba biti obazriv jer se lako može desiti da se obriše nešto što nije trebalo obrisati. write) i izvršavanja (x. čije korišćenje je slično komandi cp. Ovo se postiže komandom mv (move). novi prazan fajl se može kreirati komandom touch. read). Alias-i Još jedna korisna mogućnost bash-a je definisanje alias-a.Uvod u korišćenje Linux operativnog sistema sve fajlove koji počinju sa aaa. Komanda grep se može koristiti i za filtriranje izlaza drugih komandi. Međutim. ako treba naći sve linije u fajlovima ispis1. Novi direktorijum se može kreirati komandom mkdir (make directory). pisanja (w. cat koristi standardni izlaz.xyz često koristi. komanda bi bila: rm aaa* Strana 5 U većini distribucija je. to se može postići sa: chmod u+x naziv_fajla Prikaz sadržaja fajla i pretraživanje Za Linux se podrazumeva da termin standardni ulaz označava uređaj sa koga stižu podaci. može joj se dodeliti drugo ime. može se dodati opcija -f.pas koje sadrže reč 'writeln'. a zatim obrisati original). postavi njegovo vreme poslednje izmene na tekuće vreme. Atributi predstavljaju prava koja korisnik može imati nad fajlom. komanda bi bila: grep -i 'writeln' ispis[1-2]. Ako takvih fajlova ima više. pošto promenljivih okruženja obično ima puno. Druga komanda. kao standardni ulaz koristi specijalni fajl koji odgovara tastaturi. Komanda chmod služi za menjanje atributa fajla. Većina komandi. dok se postojeći direktorijum može obrisati komandom rmdir (remove directory). Sadržaj tekstualnih fajlova se na ekranu može prikazati pomoću nekoliko komandi. Na primer. recimo PATH.

txt bi prebrisala prethodni sadržaj i upisala novi. komanda ls ~/wav/ >spisak.xyz' Strana 6 Sada. Opcija -v komande grep znači da se izdvajaju sve linije koje ne sadrže zadatu reč. tako i za pristup internetu. Ako se zada samo alias bez parametara. Druga vrsta .txt Još jedna mogućnost koja postoji je da se standardni izlaz jedne komande direktno preusmeri na standardni ulaz druge komande.xyz. odnosno da standardni izlaz ne bude ekran.mp3'|grep -v -i 'xxx' >spisak. Jedan komplikovaniji primer slanja spiska pesama bi mogao glasiti ovako: korisnik iz nekog razloga ne želi da osoba kojoj šalje spisak pesama vidi da on ima i pesme grupe XXX. Na primer. a i fajlova koji nisu mp3 i čije nazive i ne treba slati. na primer. Ovime shell i dalje ostaje dostupan za interaktivni rad.Uvod u korišćenje Linux operativnog sistema kojom će se ta komanda pozivati: alias xyz='ls -d *.mp3”. sa: ls -R ~/mp3/|grep -i '. postoji još jedan direktorijum sa muzikom. Programi za manipulaciju fajlovima Pored manipulacije fajlovima iz komandne linije. 1. u direktorijumu sa mp3 fajlovima se nalazi i dosta poddirektorijuma. kada korisnik otkuca xyz. Traženi spisak se može dobiti. Izvršavanje programa u pozadini Ukoliko se na kraju komande stavi znak &. korišćenjem miša. tada umesto simbola “>” treba koristiti “>>”: ls ~/wav/ >>spisak.txt Opcija -R komande ls znači da se lista sadržaj direktorijuma i svih njegovih poddirektorijuma. a zatim se tako prerađeni spisak upisuje u fajl spisak. može se otkucati: ls|less Ovime se izlaz komande ls umesto na ekran. Ima mogućnost rada sa više direktorijuma odjednom i podržava sve standardne operacije nad fajlovima i direktorijumima. Na primer.txt. a koji je podrazumevano instaliran zavisi od distribucije do distribucije. Dalje. Ako je potrebno poslati nekome spisak mp3 fajlova. uz grafičko okruženje KDE stiže i program konqueror koji se može koristiti kako za manipulaciju fajlovima. u direktorijumu /home/pera/mp3/ se nalazi puno mp3 fajlova. Simbol koji se koristi za preusmeravane standardnog ulaza je '<'. Ukoliko prethodni sadržaj treba da ostane. isti se može dobiti sa: ls ~/mp3/ >spisak. na primer. na ekranu će se ispisati spisak svih trenutno postojećih zamena. odnosno “>>”. ako treba pregledati sadržaj direktorijuma sa puno fajlova. Linux ima i mogućnost manipulacije fajlovima u grafičkom okruženju. nego. tada se koristi preusmeravanje. na primer.6. a za preusmeravanje standardnog izlaza je “>”. prosleđuje komandi less koja nakon toga vrši ispis. to se može uraditi pomoću komande unalias. čiji sadržaj želimo dodati na prethodni. izlaz komande ls se šalje prvoj grep komandi koja izdvaja samo one linije u kojima se nalazi tekst “. komanda će se izvršavati u pozadini. Ako neku od zamena treba obrisati.txt u kome se nalazi izlaz komande ls ~/mp3. a da se novi doda iza njega.txt Ovime se u tekućem direktorijumu formira tekstualni fajl spisak. Preusmeravanje standardnog ulaza i izlaza i pajpovi Kada je potrebno da standardni ulaz ne bude tastatura. Ono što se daleko češće koristi je preusmeravanje izlaza. izvršiće se upravo ls -d *. Gornje komande rade sledeće: prvo komanda ls izlista sve fajlove u mp3 direktorijumu i njegovim poddirektorijumima. Postoji dosta programa za tu svrhu. Ovo se naziva pajp (pipe) i označava se sa “|”. neki fajl ili štampač. /home/pera/wav/. Na primer. Ako. izlaz prve grep komande se šalje drugoj grep komandi koja izbacuje sve linije u kojima se pominje reč “xxx”.

Pošto je mc (Midnight Commander) jedini koji je prisutan u mnogim distribucijama. U ovu grupu spada Midnight Commander koji se standardno isporučuje u Slika 2: konqueror browser Slika 3: Midnight Commander skoro svim distribucijama i koji se izvršava u tekstualnom režimu.org.7.html [3]http://www.de/worker.com. kao što su kwrite. http://www. koji se obično ne isporučuje u Linux distribucijama. Krusader.suse.com. Oba se izvršavaju u grafičkom okruženju i podržavaju standardne prečice sa tastature za rad sa tekstom.html .Uvod u korišćenje Linux operativnog sistema Strana 7 programa je bazirana na izgledu Norton Commander-a i Dos Navigator-a za DOS operativni sistem.linux. itd.kernel. Gnome Commander (dolazi u distribucijama koje isporučuju Gnome grafičko okruženje). Korisni linkovi Više o Linux-u se može naći na stranicama The Linux Documentation Project [4]. tako da se novi korisnici mogu lako snaći.org [2]http://www. odnosno Total Commander-a za Windows. Ovo su ujedno i preporučeni editori za vežbe iz Arhitekture računara. on se preporučuje korisnicima naviknutim na commander-e. http://www. [1]http://www. Tekst editori Standardni Linux-ovi tekst editori za profesionalno korišćenje su vi i emacs. ali se može naći na http://www. http://www.org/software/bash/bash. a jedan od njih je i worker.org.com/ [4]www.org/licenses/licenses.gnu. Postoji više programa tipa commander-a koji se izvršavaju u grafičkom režimu. 1.org [5]www. Pored njih postoji i mnoštvo drugih tekst editora.redhat.nedit i gedit.org. Treba pomenuti i XNC.boomerangsworld. http://www.tldp. 1.mandrakelinux.knoppix.debian.8. dok se detaljnije uputstvo za bash može naći na njegovoj zvaničnoj stranici [5].gnu. http://www.

ukoliko string sadrži razmak. Dovoljno je samo u telu skripta napisati: ime_promenljive=vrednost Ono na šta treba obratiti pažnju je da ni sa leve ni sa desne strane znaka “=” ne sme biti razmaka. mora se staviti pod znake navoda. sa kojim je bash kompatibilan). oznaka “#” predstavlja oznaku za komentar. Promenljive Promenljive u skriptovima se jednostavno definišu. U ovom slučaju. Na početku svakog skripta treba da stoji sledeći tekst: #!/bin/bash ili #!/bin/sh Prva dva znaka predstavljaju tzv. a koji se relativno često ponavlja. Primeri: x=2 ime_i_prezime=”Pera Peric” ime=Pera prezime=”Peric” . ali se preporučuju. magični broj (magic number). Komanda echo služi za ispis teksta. Generalno. Shell skriptovi Shell skriptovi (script.Shell skriptovi Strana 8 2. Kada se promenljiva želi koristiti. na primer. Prvi primer kaže da će se koristiti bash. nakon čega treba otkucati gornji program. u daljem tekstu skriptovi) su programi koji se izvršavaju u okviru shell-a. reč je o skriptu. 2. Nazovimo ga hl: #!/bin/bash #prelazak u home direktorijum i njegovo listanje echo Prelazak u home direktorijum i njegovo listanje cd # prelazak u home direktorijum ls -l #listanje direktorijuma Skript se može kreirati. Skriptovi mogu biti i znatno komplikovaniji programi. Jednostavni skriptovi Skript je (skoro) običan tekstualni fajl koji se može otkucati u bilo kom tekst editoru. jedino što bash dozvoljava osnovne računske operacije ukoliko su svi znaci u stringu cifre (celi brojevi).1. a nakon toga se stavljaju naredbe. Ostatak linije je putanja do programa koji će izvršiti skript.2. Kada je skript otkucan i snimljen. kucanjem gedit hl. sve promenljive su string tipa. pošto bash podržava mnoge elemente strukturnog programiranja. specijalnu oznaku na počeku svakog izvršnog fajla koja određuje njegov tip. nego je dovoljno samo . Kod definisanja promenljivih. pa se sve posle “#” pa do kraja linije smatra komentarom i ne izvršava se. To može biti jednostavno niz komandi koje treba izvršiti jednu za drugom. Ispod ove linije se standardno stavlja red sa komentarom koji opisuje šta skript radi. treba u jednom skriptu objediniti prelazak u home direktorijum i njegovo listanje na ekranu. Na primer. Znaci navoda nisu obavezni. čime se pristupa njenoj vrednosti. a drugi da će se koristiti sh (stariji shell. Ukoliko je potrebno da se odmah nakon naziva promenljive nađe neki tekst tada se koristi zapis “${ime_promenljive}tekst”. To se postiže komandom: chmod u+x hl Sada se ne mora kucati bash hl. može se preći na njegovo izvršavanje: bash hl Mnogo elegantniji način za izvršavanje je da se skript proglasi za izvršni fajl. Inače. tada se piše “$ime_promenljive”./hl 2.

$4=456 dok bi ostale bile prazne. Njihova imena su $0. 2.3.. $3=123.. ako se skript zove xyz. kao i $* koja u sebi sadrži sve prosleđene argumente.. pošto im je vrednost vezana za poziciju prosleđenog argumenta. . $1=”pera peric”. fi Kao naredbe se mogu staviti bilo koje naredbe koje se mogu izvršiti u bash-u. Neki od operatora su dati u sledećoj tabeli: . $4=123. Ovo je korisno ako bi skript morao da prima nedefinisani broj parametara. $3=mika. $2=mika. može se dodati i else deo: if <uslov1> then <naredbe1> else <naredbe2> fi Proširena verzija omogućava višestruke upite: if <uslov1> then <naredbe1> elif <uslov2> then <naredbe2> elif . tada će prilikom poziva xyz 1 “pera peric” mika 123 456 promenljive $0 do $5 imati sledeće vrednosti: $0=xyz.Shell skriptovi Strana 9 Posebna vrsta promenljivih su one koje se u skriptu koriste kao ulazni parametri. Tako. koja postoji u nekoliko varijanti. $1=1. Koriste se isto kao i obične promenljive.. Vrednosti pozicionih parametara (svih osim prvog) se mogu pomerati ulevo pomoću komande shift. Uslov može imati i sledeći oblik: [<razmak>operator<razmak>operand<razmak>] (za unarne operatore) [<razmak>operand1<razmak>operator<razmak>operand2<razmak>] (za binarne) Operandi mogu biti promenljive ili konstante (string ili brojevi). da bi se svi mogli obraditi u nekoj petlji. $2=”pera peric”. Uslov takođe može biti bilo koja naredba. vrednosti promenljivih iz prethodnog primera bi bile: $0=xyz. Postoji i posebna promenljiva $# koja sadrži broj prenetih argumenata. Najjednostavija varijanta je: if <uslov> then <naredbe> fi Opciono. $9. nakon izvršenja komande shift. Upravljačke strukture Osnovna upravljačka strukutira je if. $1. Nazivaju se i pozicioni parametri. Na primer. pri čemu se smatra da je uslov tačan ako je povratna vrednost naredbe 0 (nula). dok se bilo koja druga vrednost smatra za netačno. $5=456 dok će ostale biti prazne.

Aritmetički izrazi se navode u dvostrukim malim zagradama ispred kojih stoji znak $. Njen osnovni oblik je: for brojacka_promenljiva in lista_vrednosti do <naredbe> done Lista vrednosti je lista stringova razdvojenih razmacima. ako nema greške. 2. pa ako jeste. vratiti tu vrednost uvećanu za 1: #!/bin/bash #primer za if if [ "$#" -ne 1 ] #provera da li postoji tacno 1 parametar then echo "Unesite tacno 1 argument" exit 1 elif [ "$1" -le 3 ] #provera da li je parametar veci od 3 then echo "Unesite parametar koji je veci od 3" exit 2 else x=$(($1 + 1)) echo "Uneti broj uvecan za 1 iznosi $x" fi exit 0 Komanda exit služi da se OS-u vrati kôd greške..Shell skriptovi Strana 10 Operator -n -z -d -f -eq -ne = != -lt -gt -le -ge Vrsta Vraća vrednost “tačno” ako . Po konvenciji.. U primeru: . unarni operand nije prazan unarni operand je prazan unarni postoji direktorijum čije 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 različiti binarni operandi su jednaki (posmatrani kao stringovi) binarni operandi su različiti (posmatrani kao stringovi) binarni operand 1 je manji od operanda 2 (celi brojevi) binarni operand 1 je veći od operanda 2 (celi brojevi) binarni operand 1 je manji ili jednak operandu 2 (celi brojevi) binarni operand 1 je veći ili jednak operandu 2 (celi brojevi) Tabela 2: Operatori bash-a Na primer. treba proveriti da li je skriptu prosleđen tačno jedan parametar koji je ceo broj i koji je veći od 3. Posebna promenljiva $? u sebi sadrži kôd greške poslednje izvršene naredbe.4. sistemu se vraća kôd nula. Petlje Prva petlja koja će biti pomenuta je for. dok se u slučaju greške vraća kôd različit od nule.

primer 2 x=1 while [ "$x" -le "$1" ] do echo -n "$x " x=$(($x+1)) done Opcija -n komande echo znači da se nakon ispisa neće preći u novi red. ako bi se skript pozvao sa argumentom 5. primer 2 for fajl in *. Druga petlja koja će biti pomenuta je while. U tom slučaju for komanda će za vrednost brojačke promenljive uzimati sve nazive fajlova koji se slažu sa argumentom. Njen oblik je: while <uslov> do <naredbe> done Uslov se definiše isto kao kod if komande.Shell skriptovi #!/bin/bash #for petlja for boja in crvena zelena plava do echo "Jedna od boja je $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 može biti i naziv fajla ili direktorijuma. Dalje se proverava vrednost promenljive n i u zavisnosti od toga se ispisuje odgovarajuća poruka. u kome se mogu naći i džoker znaci. na primer. Na primer. Značenje je da se telo petlje izvršava dok god je uslov tačan.txt #prolazak kroz sve txt fajlove do if [ -f “$fajl” ] n=$(grep -c -i "$1" "$fajl") #n dobija vrednost izlaza komande grep if [ "$n" -eq 0 ] #ako je n nula then echo "U falju $fajl rec '$1' se ne pojavljuje" elif [ "$n" -eq 1 ] #ako je n jedan echo "U falju $fajl rec '$1' se pojavljuje jednom" else #ako je n > 1 echo "U falju $fajl rec '$1' se pojavljuje $n puta" fi fi done Konstrukcija promenljiva=$(komanda) se naziva zamena komandi (command substitution) i omogućava da se izlaz komande unutar zagrade dodeli promenljivoj. Opcija -c komande grep znači da će se vratiti broj pojavljivanja reči u fajlu. a onda će u skriptu taj broj biti dodeljen promenljivoj n. ispis prvih n brojeva bi izgledao ovako: #!/bin/bash #for petlja. Na primer. izlaz bi bio “1 2 3 4 5”. Tako. treba napisati skript koji će pretražiti sve txt fajlove u tekućem direktorijumu i ispisati koliko puta se zadata reč nalazi u svakom od njih: #!/bin/bash #for petlja. .

org/LDP/abs/html/ http://tille. Domaći zadaci 1. i u slučaju neke greške ispisati odgovarajuću poruku i vratiti kôd greške OS-u (ako nema greške. Izmeniti skript “for petlja. primer 2” tako da kao argument prima i ekstenziju fajlova koje treba pretražiti 3.Shell skriptovi Strana 12 2. Korisni linkovi Na sledećim web stranicama se može naći više detalja vezanih za pisanje skriptova: http://www. pri čemu je drugi opcioni i predstavlja vrednost za koju će se uvećavati prvi 2. Dopuniti gornja dva skripta proverama parametara.xalasys. Izmeniti skript “primer za if” tako da može primiti dva argumenta.5.6.tldp. vratiti nulu) 2.com/training/bash/ .

Segmentni registri u sebi sadrže bazne adrese segmenata memorije: cs (code segment) sadrži adresu parity carry zero trap sign . više značajan bajt predstavlja registar ah. Asemblerski programi 3. Registri opšte namene esp (stack pointer) i ebp (base pointer) imaju specijalnu namenu kod naredbi koje koriste stek. Ovaj procesor spada u little endian procesore. Tako. Za registar ax.1. na primer. a manje značajan bajt predstavlja registar al (analogno za ostale registre). cx i dx se može posebno posmatrati njihov manje i više značajan bajt.. Unazad je kompatibilan sa procesorima iz familije x86.. ebx. pa u sebi sadrži 8-bitne.. Registri opšte 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 . Programski model procesora Intel 80386 Intel 80386 je 32-bitni mikroprocesor CISC arhitekture i pripada familiji procesora x86.) su specifični po tome što se kod njih može pristupiti njihovom manje značajnom delu kao posebnom 16-bitnom registru. 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 opšte namene (eax.Asemblerski programi Strana 13 3. kao i za neke načine adresiranja. Registri opšte namene esi (source index) i edi (destination index) imaju specijalnu namenu kod naredbi za rad sa nizovima. . bx. 16-bitne i 32-bitne registre (slika 4). kod registara ax. Dalje. manje značajnih 16 bita registra eax predstavlja 16-bitni registar ax.

Slično. dok baza i indeks moraju biti registri opšte namene (pri čemu se registar esp ne može koristiti kao indeks). %ax – – – slovo w u nazivu označava da je u pitanju naredba koja se odnosi na reč. 'w' ili 'l' (malo L). Načini adresiranja memorije Pored neposrednog i registarskog adresiranja. AT&T sintaksa Za familiju procesora x86 postoje dve sintakse pisanja naredbi. Izvorni operand je registarski (registar ch).8}.4. dok su es. ds (data segment) sadrži adresu početka osnovnog segmenta podataka. . tada se koristi direktno adresiranje. 3. za oktalne brojeve prefiks je '0'. ali jeste kod memorijskog). Od značaja će biti sledeći flegovi: c (carry). i o (overflow). indeksno. kod naredbe: movw $10. a druga je AT&T. z (zero). d (direction). osim za množilac čija je podrazumevana vrednost 1.3. fs i gs dodatni segmentni registri koji se koriste za manipulaciju podacima.2. Registarski operandi imaju prefiks '%'. procesor 80386 podržava više načina adresiranja memorije: direktno. 32 bita). a odredišni je registarski (registar ax). Sve naredbe koje barataju podacima imaju sufiks 'b'. Ukoliko se sufiks ne navede.2. 8 bita). 16 bita) ili dvostruku reč (long. Skup naredbi 80386 je neortogonalan: ne prihvataju sve naredbe sve vrste operanada. Treba obratiti i pažnju na činjenicu da kod naredbi sa dva operanda. reč (word. množilac mora biti konstanta iz skupa {1. Registar eflags u sebi sadrži flegove (logičke promenljive) čije vrednosti zavise od rezultata izvršavanja naredbi. čime se definiše da li se naredba odnosi na bajt (byte. a odredišni operand je takođe registarski. ss (stack segment) sadrži adresu početka segmenta steka. prefiks je '0x'. %al slovo b u nazivu označava da je u pitanju naredba koja se odnosi na bajt. Ako treba uneti broj u heksadecimalnom obliku. %indeks. indirektno. pa odredišni. Ovo je velikim delom posledica činjenice da je 80386 projektovan s ciljem da bude kompatibilan sa ranijim Intelovim mikroprocesorima iz x86 familije. Statusni registri su dostupni samo pomoću specijalnih naredbi. kao i kombinacije ovih adresiranja. množilac) pri čemu su sva polja opciona. Opšti format adresiranja memorije je: adresa(%baza. dok je za brojeve u binarnom obliku prefiks '0b'. nakon čega sledi broj ili naziv labele. Ukoliko naredba ima dva operanda. Ukoliko se neko od polja ne navede. 3. Podrazumevani format brojeva je dekadni.Asemblerski programi Strana 14 početka segmenta naredbi. s (sign). Jedna je Intel-ova. samo jedan od njih može biti memorijski. Na primer. podrazumeva se da je 0. u primeru: movb %ch. biće određen na osnovu odredišnog operanda (ovo nije problem kod registarskog adresiranja. Ukoliko se ispred konstante ili labele ne navede '$'. Izvorni operand je neposredni (vrednost 10 dekadno). prvo ide izvorni operand. Neposredni operandi imaju prefiks '$'. Registar eip (instruction pointer) u sebi sadrži adresu naredbe (u okviru segmenta naredbi) koja će se sledeća izvršiti. Osnovne karakteristike AT&T sintakse su sledeće: – – – Labela se definiše navođenjem imena labele iza koga sledi dvotačka. Adresa memorijske lokacije se izračunava po formuli adresa + baza + množilac*indeks Polje adresa mora biti konstanta.

dibager Asemblerski program se prvo piše editorom i snima u fajl sa ekstenzijom S (u ovom odeljku fajl će se zvati primer. 4 ili 8 bajtova. U tom slučaju. Za makro pretprocesiranje asemblerskog koda se koristi C pretprocesor gcc-a (GNU Compiler Collection): gcc -E proba. Alati: pretprocesor.section .s -o primer.S).o -o primer Linker će povezati fajl primer.2). U okviru .S -o proba. ako je definisan niz nizrec čiji su elementi veličine 2 bajta.text). treba da stoji sledeće: #program radi to i to . Ako je prevođenje prošlo bez grešaka. datum i slično). drugom elementu se može pristupiti sa: movl $1. (%ebx) Bazno adresiranje sadrži polja adresa i baza: movl %eax. %ax #prvi element ima indeks 0 #vrednost sa lokacije nizrec + ecx*2 -> ax 3. i kreirati izvršni fajl primer.section . Na početku asemblerskih programa. Sledeća linija (. Opcija -g omogućava dibagiranje programa. E1234 .o.data . Linkovanje obavlja program ld (GNU linker): ld primer.o Opcija --gdwarf2 omogućava dibagiranje programa.text . ukoliko se gcc pozove na sledeći način: gcc -g -o primer primer.S tada će automatski biti pozvani pretprocesor.%ecx. %ecx movw nizrec(.Asemblerski programi Direktno adresiranje ima samo polje adresa: movl %eax.. Za asembliranje se koristi komanda as (GNU assembler): as --gdwarf2 primer.data) predstavlja direktivu (ili pseudonaredbu) asembleru i označava početak segmenta podataka. asembler i linker. sa kakvima će se raditi u toku ovog kursa (i koji će biti asemblirani korišćenjem automatskog pozivanja svih alata). nastao kao rezultat asembliranja. Ukoliko usluge pretprocesora nisu potrebne. asembler. Treba obratiti pažnju na to da se ne prave komentari u stilu #1234 (broj koji se nalazi odmah nakon oznake '#'). dok opcija -o služi za zadavanje naziva izlaznog fajla.. 0x1234 movl %eax. #autor: Pera Peric. 87(%ebx) Indeksno adresiranje sadrži polja adresa. linker. 1234(.section . Nakon nje sledi direktiva koja označava početak segmenta naredbi (. Na primer. Program gcc omogućava da se automatski izvrše svi programi neophodni za dobijanje izvršnog fajla. pošto takve oznake asembler koristi interno prilikom asembliranja programa. ovaj korak se može preskočiti. sistem će vratiti komandni prompt ne ispisujući nikakve dodatne poruke.section .s Opcija -E omogućava da se dobije izlaz pretprocesora.%ecx) Vrednosti za množilac veće od 1 su pogodne za rad sa nizovima čiji su elementi veličine 2. labela1 #eax -> lokacija 123416=466010 #eax -> lokacija labela1 #eax -> lokacija čija je adresa u ebx #eax -> lokacija čija je adresa ebx+87 #eax -> lokacija 1234+ecx Strana 15 Indirektno adresiranje sadrži samo polje baza: movl %eax. indeks i eventualno množilac: movl %eax.4.globl main main: U prvih par linija u okviru komentara se nalazi kratak opis programa i par osnovnih podataka o fajlu (autor.

dok panel (6) sadrži izgled programskog koda u memoriji.globl) koja mora biti obeležena labelom main. prvo što treba uraditi je da se postavi tačka prekida (breakpoint) na poslednju liniju u programu (trebalo bi da je kraj: nop). Tačka prekida predstavlja mesto na kome će se zaustaviti izvršavanje programa kad se on pokrene. i unutar njega se mogu stalno pratiti i menjati sadržaji registara i flegova i postavljati prekidne tačke. Na kraju programa treba da se nalazi: kraj: nop Dibager služi za kontrolisano izvršavanje programa. Ukoliko nakom pokretanja dibagera prozor sa registrima nije uključen. Na ovom kursu je korišćena izmenjena verzija DDD dibagera 3. Prozor (2) sadrži komande vezane za izvršavanje programa.3.Asemblerski programi Strana 16 segmenta naredbi se definiše ulazna naredba programa kao spoljašnja referenca (. DDD se poziva komandom: ddd primer Slika 5: DDD dibager Na slici je prikazan izgled glavnog prozora dibagera. Panel (5) sadrži komandnu liniju gdb-a (tu se može videti tekstualni oblik svih komandi zadatih u DDD-u). Izmenje su načinjene radi lakšeg rada sa asemblerskim programima.11. treba ga uključiti odabirom opcije Registers menija Status. Panel (4) sadrži vrednosti koje je korisnik odabrao da prikazuje (kada takvih vrednosti nema. osnovni dibager koji radi iz komandne linije. Panel (1) sadrži izvorni kod programa. Dibager se zove DDD (Data Display Debugger) i predstavlja grafičko okruženje za gdb (GNU Debugger). Glavni prozor je podeljen na nekoliko panela i prozora. Pre pokretanja programa. Prozor (3) sadrži trenutne vrednosti registara. Mesto do kog se stiglo u izvršavanju programa je obeleženo zelenom . panel se ne prikazuje).

8-bitne promenljive se mogu prikazati postavljanjem njihovog imena u liniju (7) i klikom na odgovarajuće dugme na panelu (9): ByteHex će vrednost prikazati kao heksadecimalnu. Za 32-bitne i 16-bitne nizove je dovoljno iza naziva niza staviti sufiks '@n'. Prikazane vrednosti na panelu (4) se mogu obrisati klikom na vrednost. obeležiti ga mišem). ili izborom opcije Delete Breakpoint iz menija koji se dobija desnim klikom miša na tačku prekida. DDD omogućava i prikaz sadržaja nizova. Prikaz pojedinih flegova iz eflags registra. a zatim odabrati opciju Memory iz menija Data. a zatim se klikne na dugme Display. pa se iz menija odabere Set Breakpoint dvoklik mišem na početak linije Tačka prekida se može isključiti ili preko dugmeta Clear. Napomena: vrednosti flegova i registara prikazanih preko ovog panela se ne mogu menjati. %ax tada treba izraz nizrec(. u liniju (7) treba upisati nizrec@5 i kliknuti na dugme Display. u panelu (4) će se prikazati polje sa sadržajem registra eax u označenom dekadnom obliku. Ukoliko je potrebno prikazati sadržaj memorije koji je određen nekim tipom adresiranja.%ecx. u prozoru koji se otvori se može upisati vrednost koja će se upisati u registar. Promena 32-bitnih i 16-bitnih promenljivih se ostvaruje postavljanjem njihovog imena u liniju (7) i klikom na dugme Set.2) postaviti u liniju (7) (na primer. Na primer. Kill prekida izvršavanje pokrenutog programa. Razlika između ove dve komande se ogleda kod poziva potprograma: Stepi izvršava potprogram korak po korak. – – Ukoliko se klikne na neki od registara u Registers prozoru. što znači uklanjanje tačke prekida) klikne se desnim dugmetom miša na početak linije. Izvršavanje se zaustavlja kad se naiđe na tačku prekida. ByteDec kao označenu dekadnu. gde je n broj članova niza koje treba prikazati.%ecx. 8-bitne promenljive se ne mogu menjati na ovaj način. Koriste se za izvršavanje programa korak po korak. 32-bitne i 16-bitne promenljive se mogu prikazati tako što se u liniju (7) postavi njihovo ime. U dijalogu koji će se otvoriti treba odabrati broj elemenata koji se želi prikazati. dok se prefiks '0x' koristi za heksadecimalne vrednosti. ako se klikne na registar eax. u liniji (7) se pojavljuje tekst '$eax'. dok Nexti izvrši ceo potprogram i zaustavlja se na naredbi koja sledi naredbu poziva potprograma. a zatim klikom na dugme Undisp. samo ispred naziva registra treba staviti prefiks '$'. kao na primer: movw nizrec(. smatraće se da je u dekadnom obliku. ako se niz zove nizrec i ima 5 članova. njegovo ime se pojavljuje u liniji (7) koja se nalazi ispod menija. a ByteUns kao neoznačenu dekadnu (Napomena: ovako prikazane 8-bitne vrednosti se ne mogu menjati). Da bi se promenila vrednost u registru. pre klika na dugme Display treba dodati prefiks '/x'.2). Nazivi registara se u liniju (7) mogu unositi i ručno. dok za prikaz neoznačenih dekadnih vrednosti treba staviti '/u'. a od koristi će biti sledeće: – – Run pokreće program od početka. Nakon toga. za prikaz binarnih vrednosti treba staviti '/t'. dugme menja naziv u Clear. Panel (9) sadrži i najčešće korišćene opcije panela (2). pa se mišem klikne na dugme Break (ukoliko u toj liniji već postoji tačka prekida. u liniju (7) treba postaviti njegovo ime (zajedno sa prefiksom '$') i kliknuti na dugme Set. Ukoliko treba prikazati heksadecimalnu vrednost. Stepi i Nexti izvršavaju tekuću naredbu i nakon toga ponovo zaustavljaju izvršavanje programa. Tačka prekida se može postaviti na više načina: – – – kursor se postavi na početak linije. Ako se sada klikne na dugme Display. Ukoliko se vrednost navede bez prefiksa. brojni sistem u kome se žele prikazati vrednosti i veličinu jednog elementa (u poslednjem polju će se .Asemblerski programi Strana 17 strelicom i predstavlja naredbu koja će se sledeća izvršiti. Na primer. Cont nastavlja izvršavanje programa do sledeće tačke prekida. Prozor (2) sadrži više komandi koje se koriste prilikom izvršavanja programa. Stringovi se prikazuju postavljanjem njihovog imena u liniju (7) i klikom na dugme String na panelu (9). kao i vrednosti 8-bitnih i 16-bitnih registara se može postići klikom na odgovarajuće dugme na panelu (8).

else b -= a. je. Smesti vrednost 8 u promenljivu b 3. ja.5. (a) a = 12. (b) Slika 6: Algoritam za izračunavanje NZD: (a) pseudokod i (b) C kôd Predstavljen kao niz koraka. u drugom bi se odabrao brojni sistem. Naredba mov ne utiče na flegove. algoritam bi glasio: 1. Doslovan prevod algoritma u asembler Koriste se sledeće naredbe: • mov. Pređi na korak 3 9. ovom naredbom se od odredišnog operanda oduzima izvorni. inače pređi na sledeći korak 5. Nakon klika na dugme Display. Ako su jednaki. movl 12. pređi na korak 9 4. na primer “hex”. Rezultat se smešta u odredište. kodiran kao deo naredbe) u registar eax. Na primer. Relativni skokovi. Kraj algoritma Varijanta 1.Asemblerski programi Strana 18 naći izraz koji određuje memorijsku lokaciju). jmp. pređi na korak 7. Naredbe skoka ne utiču na flegove. pošto instrukcija movw radi sa 2-bajtnim vrednostima. Pređi na korak 3 7. 3. Smeštanje izvornog operanda u odredišni. Oduzmi a od b i rezultat smesti u b 6. Prilikom • • • . sub. traženi podatak bi se prikazao u panelu (4). b = 8. Poređenje operanada. Oduzmi b od a i rezultat smesti u a 8. while (a != b) if a > b then a -= b. b := 8. U ovom programu se koriste registarski i neposredni operandi. Ako je a veće od b. Do skoka je (jump if equal) dolazi ako važi z=1. Primer: izračunavanje NZD Na slici 6 prikazan je algoritam za izračunavanje najvećeg zajedničkog delioca za dva prirodna broja. Smesti vrednost 12 u promenljivu a 2. Na primer. Oduzimanje izvornog operanda od odredišnog. Naredba jmp je bezuslovni skok. while a ≠ b do if a > b then a := a – b else b := b – a. već se samo ažuriraju flegovi: u ovom slučaju zanimaju nas fleg z (zero). u prvo polje bi se upisalo “1”. Tehnički. i c (carry). a do skoka ja (jump if above) dolazi ako važi c=0 i z=0. koji se postavlja ako je rezultat nula. %eax će smestiti broj 12 (neposredni operand. Prva dva su uslovna. a u trećem bi se odabrala opcija “halfwords (2)” koja označava podatke veličine 2 bajta. Uporedi a i b. a := 12. ali se pri tom sadržaj odredišta ne menja. cmp. Uporedi a i b. ukoliko treba prikazati jedan podatak na koga ukazuje gornji izraz. koji se postavlja u slučaju prenosa sa najznačajnije pozicije.

Vrednost n se nalazi u registru ecx.%ebx #eax<->ebx vece: subl %ebx.%eax movl $8. Zamenu sadržaja radi naredba xchg.%eax movl $8.%eax ja vece #skok ako eax>ebx subl %eax. Zbog toga se u slučaju da je ebx veće od eax sadržaj ovih registara može međusobno zameniti (kao rezultat zamene.%ebx uporedi: cmpl %ebx. i zatim uraditi oduzimanje ebx od eax.%eax jmp uporedi kraj: nop 3. pa je drugo poređenje nepotrebno. Ovde se koriste registarski operandi.%eax #eax-ebx->eax jmp uporedi kraj: nop Varijanta 2. Instrukcija koja ne radi ništa. Za algoritam nije bitno da li se veća vrednost nalazi u eax ili ebx (jer se to proverava u svakoj iteraciji).%eax jmp uporedi kraj: nop Varijanta 3.%ebx #ebx-eax->ebx jmp uporedi vece: subl %ebx.%eax je kraj #skok ako eax=ebx cmpl %ebx.%eax #12->eax movl $8.%ebx uporedi: cmpl %ebx. Domaći zadaci 1.%eax je kraj ja vece xchgl %eax. dok zbir treba da bude u registru eax.6. eax će biti veće od ebx).Asemblerski programi oduzimanja se ne uzima u obzir vrednost flega c. Naredba ne utiče na flegove. u regaistar eax stavlja: 1 ako ebx>ecx 0 ako ebx=ecx 0xffffffff ako ebx<ecx . Naredba sub menja flegove. Optimizovana verzija.%eax je kraj ja vece subl %eax.%ebx jmp uporedi vece: subl %ebx. movl $12.%ebx #8->ebx uporedi: cmpl %ebx. movl $12. 2. ovde je potrebna samo zbog postavljanja tačke prekida movl $12. • Strana 19 nop. Napisati asemblerski program koji će sabrati prvih n prirodnih brojeva. s tim da se uzima u obzir činjenica da naredbe skoka ne utiču na flegove. Napisati program koji poredi vrednosti u registrima ebx i ecx i na osnovu rezultata poređenja. Slično prvoj varijanti.

Za rad sa označenim brojevima se koristi fleg o (overflow). Kod drugog. fleg c će biti postavljen prema vrednosti poslednjeg istisnutog bita. Naredba not ima samo jedan operand i obavlja operaciju nad njegovim bitima. Prve tri obavljaju logičku operaciju nad parovima korespondentnih bita izvornog i odredišnog operanda. ako treba proveriti da li je najniži bit registra eax 0 ili 1. ili se uzima iz registra cl. koji predstavlja prenos kod operacija sa neoznačenim brojevima.1. Neoznačeni i označeni brojevi Procesor 80386 omogućava rad sa neoznačenim i sa označenim celim brojevima. a ako se u registru eax nalazi vrednost različita od 0. . Manipulacija bitima Za manipulaciju bitima su zadužene logičke naredbe procesora 80386. %eax Broj 0xfffffffe se u ovom slučaju naziva maska. pošto služi za izdvajanje (maskiranje) najnižeg bita. Nizovi 4. Neoznačeni broj u jednostrukoj preciznosti kod 80386 procesora može imati vrednosti iz opsega od 0 do 232-1. može se pisati: andl $1. 4.2. U slučaju pomeranja za više pozicija. ako se u registru eax nalazi 0. Naredbe za pomeranje i rotiranje Pomeranje neke vrednosti za n bita u levo ekvivalentno je množenju te vrednosti sa 2n. %eax Nakon ovoga. tada je vrednost najnižeg bita bila 0. koji predstavlja prenos kod operacija sa označenim brojevima. xor (ekskluzivno ILI) i not (logičko NE). shr i sar. pomeranje u levo je istovetno logičkom. Naredbe za pomeranje prihvataju još jedan operand. or (logičko ILI). Ovime se čuva znak u slučaju rada sa označenim brojevima. Ako program treba da radi sa neoznačenim brojevima. Dvostruka preciznost. Osnovne logičke naredbe su and (logičko I). Ovaj operand je ili neposredni. Sve logičke naredbe utiču na flegove. to se može postići naredbom: andl $0xfffffffe. Odredišni operand može biti registar ili memorijska lokacija. Kod ove provere je nezgodno to što se vrednost odredišnog operanda menja. Ove naredbe se često koriste i za tzv. Binarno. a pomeranje u desno zadržava vrednost bita najveće težine. dok je pomeranje u desno ekvivalentno celobrojnom deljenju sa 2n. osim na najmanje značajnoj poziciji. maskiranje. Osnovne naredbe za pomeranje su shl. Radi isto što i and. tada je vrednost najnižeg bita bila 1. koji određuje broj pozicija za koje će pomeranje biti obavljeno. Označeni brojevi se predstavljaju u komplement 2 predstavi. što znači da je opseg označenih brojeva u jednostrukoj preciznosti kod 80386 od -231 do 231-1. odnosno proveravanje ili postavljanje pojedinih bita. Za operande u toj veličini se kaže da su u jednostrukoj preciznosti. Na primer. registara. tj. bit najmanje ili najveće težine (u zavisnosti od toga da li se pomera u levo ili desno) dobija vrednost nula. Komplement 2 nekog broja se može dobiti naredbom neg. ako treba najniži bit registra eax postaviti na 0. Kod prvog. Pomeranje može biti logičko ili aritmetičko.Dvostruka preciznost. taj broj ima sve jedninice. Na primer. nego samo postavlja flegove u zavisnosti od dobijenog rezultata. koja predstavlja kombinaciju naredbe not i dodavanja jedinice rezultatu. Provera da li neki bit ima vrednost 0 ili 1 se može uraditi izdvajanjem tog bita pomoću naredbe and i provere dobijenog rezultata. Nizovi Strana 20 4. ali ne smešta rezultat u odredišni operand. Da li će se broj u nekom registru smatrati za označeni ili neoznačeni zavisi isključivo od programa i načina na koji se koriste flegovi. Na slici 7 prikazano je dejstvo 80386 naredbi za pomeranje. Veličina operanada kojima procesorske naredbe mogu direktno manipulisati obično je ograničena kapacitetom mašinskih reči. dok se za promenu vrednosti nekog bita može iskoristiti naredba xor. koristi se fleg c (carry). Na sličan način se naredba or može iskoristiti za postavljanje nekog bita na vrednost 1. Upravo za ovakve provere postoji naredba test.

%bx #pomeranje eax za 1 mesto u levo #pomeranje bx za cl mesta u desno Prilikom pomeranja u levo. Primeri: rolw $1. a ror rotiranje u desno. dok će kod aritmetičkog pomeranja negativne označene vrednosti krajnja vrednost biti -1. Analogno tome se radi i rotiranje u desno. Naredbe za rotiranje su prikazane na slici 8. Rotiranjem u levo se bit sa najviše pozicije u odredištu dovodi na najnižu. Uz prethodno navedene. %ax rcrl %cl. rcl i rcr.Dvostruka preciznost. %ebx #rotiranje ax za jedno mesto u levo #rotiranje ebx kroz c za cl mesta u desno . Ako se vrednosti tretiraju kao označene. Sve što je rečeno za operande naredbi za pomeranje važi i ovde. Razlika u odnosu na rol i ror je u tome što se na najnižu ili najvišu poziciju dovodi bit iz flega c. Ovde postoje dva granična slučaja: logičko pomeranje neoznačene vrednosti i aritmetičko pomeranje pozitivne označene vrednosti će posle najviše n koraka (gde je n veličina odredišta u bitima) svesti vrednost na nulu. postoje i dve naredbe za rotiranje kroz fleg c. %eax shrw %cl. dok se svi ostali bitovi pomeraju za jednu poziciju u levo. rol vrši rotiranje u levo. postavljen fleg c se može uzeti kao indikator prekoračenja kapaciteta odredišta za slučaj rada sa neoznačenim vrednostima. treba proveravati stanje flega o. Pomeranjem u desno ne može se prekoračiti kapacitet odredišta. 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.

Ispred definicije podatka stoji labela. 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. rec movl $bajt. movl $max_vrednost. 2.long max_vrednost . 100 Iza odgovarajuće direktive se može navesti i više vrednosti odvojenih zarezima. %eax konstanta = vrednost #0xffff1234 -> eax #0x1234 -> rec #adresa labele bajt -> eax Konstante se definišu na sledeći način: Ovako se praktično definiše labela koja pokazuje na unapred zadatu adresu. Ovakva konstanta se koristi kao neposredni operand ili kao početna vrednost kod definisanja promenljivih: max_vrednost = 20 vrednost: . od kojih svaki radi sa delovima .4. koriste se različite direktive. Definisanje podataka Podaci se smeštaju u segment podataka. Za smeštanje različitih vrsta podataka.3. 50 bajt: ..section . a najvažnije su prikazane u sledećem primeru: . Labela je samo zamena za adresu na kojoj se podatak nalazi.word 0xff56.Dvostruka preciznost.long 0xffff1234 rec: . %eax movw %ax. Primeri: movl duga_rec. čime se omogućava da se podatku pristupa preko labele..byte 0xff. Sabiranje u dvostrukoj preciznosti Prilikom rada u višestrukoj preciznosti operacije se izvode u više koraka.data duga_rec: . %eax 4.

Sabiranje u višestrukoj preciznosti se radi tako što se najmanje značajne reči operanada saberu pomoću add. što znači da se u memoriji nalazi prvo najniži. kao i nekoliko njih koje kao operand ili rezultat koriste registarski par edx:eax (ova notacija znači da registar edx sadrži bite veće. Nizovi Strana 23 operanada.long .32 bita. stanje flega c posle svih operacija može se iskoristiti kao indikator greške. Naredba inc povećava odredišni operand za jedan.long . Shodno tome. Varijanta 2. postavljajući pri tom flegove na vrednosti koje odgovaraju rezultatu.long .byte 0xffff 0xffff 2 0 0 movb $0. %eax addl b_donji.long . Ovde će se to upotrebiti za postavljanje memorijske promenljive greska. kojoj je uslov za grananje c=0. a postoje i naredbe koje rade sa 8-bitnim i 16-bitnim vrednostima. Još jedna naredba za sabiranje je adc. Kod 80386.long . koristeći je kao početni prenos na najnižoj poziciji. %eax movl a_gornji. dok se značajnije reči sabiraju pomoću adc.long .byte 0x8000 0 0x8001 1 0 movb $0. uz pomoć naredbe uslovnog skoka jnc (jump if no carry). Prenos kod konačnog sabiranja u ovom slučaju znači prekoračenje kapaciteta. Ona sabira operande i rezultat smešta u odredišni. %edx jno kraj incb greska kraj: nop Razlika je u tome što se za detekciju prekoračenja kapaciteta koristi fleg o umesto flega c. %eax addl b_donji. a_donji: a_gornji: b_donji: b_gornji: greska: . Sabiranje označenih brojeva. %edx adcl b_gornji. 80386 naredba za sabiranje je add. greska movl a_donji. Naredbe koje ih upotrebljavaju pristupaju im koristeći memorijski ili direktni način adresiranja. Varijanta 1. a drugi u text sekciji. 80386 spada u little endian procesore. a eax bite manje težine).Dvostruka preciznost. Sabiranje neoznačenih brojeva. Postupak je veoma sličan prethodnom: a_donji: a_gornji: b_donji: b_gornji: greska: . %eax movl a_gornji. %edx adcl b_gornji.long . već su zapisani u određene memorijske lokacije. upotrebljena je naredba jno (jump if no overflow). Prema tome. koja pored operanada uzima u obzir i vrednost flega c. koristeći na taj način prenose iz prethodnih sabiranja. Rezultat će biti u registarskom paru edx:eax. Prenos kod sabiranja nižih reči uzeće se u obzir prilikom sabiranja viših. Za oduzimanje nižih delova se . jednostruka preciznost odgovara kapacitetu registara opšte namene . Postupak za oduzimanje u dvostrukoj preciznosti je sličan sabiranju. greska movl a_donji. %edx jnc kraj incb greska kraj: nop Podrazumeva se da se prvi deo koda nalazi u data sekciji. Operandi se u ovom primeru ne nalaze u registrima.long . a posle viši delovi reči.

a = 8. prvo se rezultat postavi na nulu. Predstavlja vernu kopiju algoritma koji se koristi kod ručnog množenja dva binarna broja. Udvostručavanje vrednosti se u asembleru može izvesti: – – Pomeranjem svih bita vrednosti za jednu poziciju u levo. koja radi isto što i sub. Deljenje pomoću oduzimanja je slično. for (. while (a > b) { a -= b. Algoritam se može prevesti u sledeći asemblerski program: . } Slika 10: Algoritam za množenje pomoću sabiranja i pomeranja Na slici 10 prikazan je algoritam u C-u za množenje brojeva na opisani način. samo što u obzir uzima i vrednost flega c (dodaje ga na vrednost izvornog operanda). (a) r = 0.Dvostruka preciznost. veličine n bita. a = a + a. Sabiranjem vrednosti sa samom sobom. r = 0. Na ovaj način će isti izraz poslužiti za testiranje bitova rastuće težine. if (a != 0) while (b != 0) { if ((b & 1) != 0) r = r + a. dok se za oduzimanje viših koristi sbb (subtraction with borrow). njihov proizvod je gde je ai vrednost bita na poziciji i (analogno tome i bi). Nizovi Strana 24 koristi naredba sub.a > 0. Proizvod se može zapisati i ovako: a n−1 2n−1an−2 2n−2⋯a 0 ⋅ bn−1 2n−1 bn−2 2n−2⋯ b0 b0⋅ab 1⋅2a⋯b n−1⋅2n−1 a Iz zapisa se vidi da je rezultat moguće izračunati pomoću sukcesivnih sabiranja. treba izbrojati koliko puta se broj b može oduzeti od broja a: r = 0. Postupak se započinje samo ukoliko su oba činioca različita od nule. b = 8.5. Ukoliko treba pomnožiti dva broja a i b. Promenljiva b se u svakom koraku pomera za jedan bit u desno (b = b >> 1). Izraz (b & 1) imaće vrednost jedan ako je najniži bit promenljive b jedinica (operator & označava bit-operaciju logičkog I). a = 3. a zatim se b puta na rezultat doda vrednost a. što će se koristiti u ovom primeru s obzirom da je sabiranje u dvostrukoj preciznosti već opisano. Množenje i deljenje pomoću sabiranja i oduzimanja Množenje pomoću sabiranja je trivijalna operacija. b = 30. b = 3.a--) r += b. b = b >> 1. r++. U svakom koraku posle prvog vrednost a se udvostručuje. najniži bit dobija vrednost nula. } (b) Slika 9: Množenje pomoću sabiranja (a) i deljenje pomoću oduzimanja (b) Nešto komplikovaniji algoritam za množenje je množenje pomoću sabiranja i pomeranja. Ako imamo vrednosti a i b. a = 60. 4.

što se može iskoristiti za anuliranje sadržaja registara. usled neortogonalnosti skupa naredbi 80386. %ebx movl $30. a rezultat je neoznačen 64-bitni broj u registarskom paru edx:eax.%eax) daje rezultat 0. Nisu prikazani jedino ekvivalenti operacija rcl i rcr. Parametar eax se odmah prebacuje u registar ecx iz dva razloga: prvo. s tim što se prva naredba brže izvršava. %eax movl %eax. Ekskluzivno ILI neke vrednosti sa samom sobom (xor %eax.%ecx jz uvecaj addl %ebx. i drugo. koja je pomenuta ranije.%eax.6. Pomeranje i rotiranje u dvostrukoj preciznosti U tabeli 3 prikazani su programi koji pomeraju ili rotiraju registarski par edx:eax. %ebx jz kraj proveri: jecxz kraj testl $1. %eax xorl %edx. %edx uvecaj: addl %ebx. %ecx xorl %eax. ali će 80386 postaviti fleg z ukoliko je rezultat nula (što se može desiti samo ukoliko je i sama vrednost jednaka nuli).%ebx) neće promeniti tu vrednost. %esi shrl $1. %eax adcl %esi. Ovo je ekvivalentno sa mov $0. eax treba da sadrži nižu reč rezultata. uslovni skok čiji je uslov za grananje ecx=0 i koji se u programu može dobro iskoristiti. Nizovi movl $60. Vrednost koja se u toku algoritma udvostručuje je registarski par esi:ebx. za ecx je vezana specijalna naredba jecxz. pa se taj slučaj i ne proverava. %edx xorl %esi. . Naredba jz (jump if zero) je alternativni naziv za je (jump if equal). Ova naredba postoji i za registar cx i njen naziv je jcxz. %ebx adcl %esi.Dvostruka preciznost. Do prekoračenja kapaciteta u rezultatu ne može doći. %esi andl %ebx. – – – – 4. %ecx jmp proveri kraj: nop Strana 25 Napomene uz primer: – Program prihvata 32-bitne neoznačene parametre u registrima ebx i eax. Logičko I neke vrednosti sa samom sobom (and %ebx.

(čime se eksplicitno testira stanje flega c i postavlja najniži bit eax ako je c postavljen). Na primer.. ako eax promeni znak). Zadatak je da . %eax sarl $1. Korišćenjem naredbe neg.. ali za slučaj dvostruke preciznosti bolje je postupiti po definiciji: komplement 2 neke vrednosti je njen komplement 1 uvećan za jedan: notl notl addl adcl %eax %edx $1.7. %edx jnc nije_jedan orl $1. %edx rcrl $1. %eax rcll $1. $1. %eax shll rcll rcrl roll shrl rcrl rcll rorl $1. $1. $1. %eax nije_jedan: . 4. Negacija u dvostrukoj preciznosti Negirati neku vrednost u ovom slučaju znači izračunati njen komplement 2. %edx rcrl $1. $1. %edx shrl $1. Ova varijanta jeste kraća. %eax %edx %eax %eax %edx %eax %edx %edx rol ror Tabela 3: Pomeranje i rotiranje u dvostrukoj preciznosti Operacije rotiranja se mogu izvesti i drugačije. %eax $0. $1. $1.Dvostruka preciznost. U ovom slučaju je svejedno kojim će se redom komplementirati niža i viša reč 64-bitne vrednosti.8. Naredba not računa komplement 1 odredišnog operanda. Nizovi Strana 26 Operacija shl shr sar Program shll $1. Za negiranje u jednostrukoj preciznosti 80386 ima naredbu neg. ali ima tu manu što ne postavlja fleg o u slučaju prekoračenja kapaciteta (do koga dolazi za vrednost 263). Primer: brojanje dana iz određenog perioda godine Primer pretpostavlja postojanje tabele prosečnih dnevnih temperatura iz nekog dela godine. %edx Navedeni program negira vrednost u registarskom paru edx:eax. program za rotiranje u levo mogao bi da glasi: shll $1. %edx Vrednost više reči se smanjuje za jedan ako se prilikom negiranja eax postavi fleg c (tj. %eax rcll $1. 4. Implementacija iz tabele 3 je namerno urađena tako da ne sadrži naredbe uslovnog skoka. što će se desiti za sve vrednosti eax osim nule. $1. program bi se mogao napisati na sledeći način: negl %edx negl %eax sbbl $0.

if (d_prvi < 0 || d_poslednji >= BROJ_DANA || d_poslednji < d_prvi) greska++. greska = 0. d_poslednji. i++) if (g_donja <= dani[i] && g_gornja >= dani[i]) broj_d++. ako bilo koja od ovih provera ne uspe. Nizovi se u zadatom intervalu prebroje dani kod kojih je temperatura unutar zadatog opsega.long . extern int greska. %bx testw $0x8000. g_gornja. extern int d_prvi.byte .long -1 3 1 5 0 0 5 -1 2 4 -2 -3 3 .long . Algoritam ispituje validnost ulaznih podataka (da li je indeks prvog dana pozitivan? da li je indeks poslednjeg dana manji od ukupnog broja dana? da li je indeks prvog dana manji ili jednak indeksu poslednjeg?).section . extern int dani[]. broj_d = 0.word .section .long .long . i <= d_poslednji. Strana 27 Na slici 11 prikazan je C program za rešavanje ovog problema. kao što je uobičajeno u C-u. Dužina niza dani određena je konstantom BROJ_DANA. #define BROJ_DANA 365 extern int g_donja. Izmene u odnosu na dati algoritam su smanjen broj dana (na sedam). extern int broj_d. else { int i.long . Indeksiranje niza dani radi se sa osnovom nula (prvi element niza ima indeks nula).word .long .Dvostruka preciznost. for (i = d_prvi. .data broj_dana = 7 g_donja: g_gornja: d_prvi: d_poslednji: broj_d: greska: dani: . %ebx movw d_prvi. } Slika 11: Algoritam za brojanje dana sa temperaturom u zadatim granicama Asemblerski ekvivalent dat je u nastavku teksta. postavlja se globalna promenljiva greska. da asemblerski program ne bi bio predugačak (suština algoritma se ovime ne menja) i to što u asemblerskom programu nije odrađena većina provera.text .word .globl main main: xorl %ebx. %bx .long .long .

2. Prepraviti program za brojanje dana tako da se umesto indeksnog adresiranja za pristupanje elementima niza koristi indirektno adresiranje. Nizovi jnz i_greska xorl %ecx. %eax jg van_opsega incw broj_d van_opsega: incl %ebx loopl jedan_dan jmp kraj i_greska: incb greska kraj: nop Strana 28 Napomene uz primer: – – – Negativnost vrednosti utvrđuje se testiranjem njenog najvišeg bita (u slučaju 16-bitnih vrednosti. Kao brojač iteracija glavne petlje programa (koja počinje labelom jedan_dan) koristi se registar ecx. Napisati asemblerski program za sortiranje niza 16-bitnih vrednosti. %ecx incl %ecx movw $0.9. Zbog neortogonalnosti skupa naredbi 80386. testiranje i uslovno grananje moguće je koristiti specijalnu naredbu loop. za njegovo smanjivanje. broj_d jedan_dan: movl dani(.Dvostruka preciznost.%ebx. testira se sa 0x8000). %eax jl van_opsega cmpl g_gornja. Domaći zadaci 1. %eax cmpl g_donja. %ecx movw d_poslednji. . paralelno se koriste kako registar bx. 4. tako i registar ebx).4). Pojedinačnim vrednostima niza pristupa se pomoću indeksnog adresiranja. %cx subl %ebx. U ovom slučaju. loop jedan_dan bilo bi ekvivalentno nizu naredbi decl %ecx jnz jedan_dan – Obratite pažnju na korišćenje 16-bitnih i 32-bitnih registara (na primer.

Osim razbijanja programa na manje delove. Kod 80386. a rezultat u edx:eax.Potprogrami Strana 29 5.1. funkcijama) od onih koji nemaju povratnu vrednost (i zovu se procedure). Prenos argumenata preko registara Prenos argumenata u potprogram i pristup lokalnim promenljivama (ako postoje) mogu se prevesti u asemblerske operacije na različite načine. a da se prilikom izvršavanja zadaju različite vrednosti parametara (argumenti) kojima će te operacije baratati. Mikroprocesori po pravilu imaju operacije i memorijske strukture za implementaciju potprograma. Na primer. Kao pokazivač na vrh steka koristi se registar esp. Potprogrami Kod procedurnih programskih jezika višeg nivoa potprogrami su osnovni način za modularizaciju koda. Na stek se uvek smeštaju 32-bitne vrednosti (jedna ili više njih). treba napisati potprogram za sabiranje u dvostrukoj preciznosti. striktno razlikuju ovakve potprograme (zovući ih. 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. a zatim na lokaciju na koju pokazuje nova vrednost esp smešta izvorni operand. koristi se memorijska struktura zvana stek (stack). efekat operacije pushl $0 prikazan je na slici 12. Pozivi ovakvih funkcija ne smeju se pojaviti ni u kakvim izrazima. i povećava esp za 4. recimo Pascal. Može se videti da prilikom punjenja stek raste ka nižim adresama. dok pop radi obrnuto: preuzima vrednost sa lokacije na koju pokazuje esp. važna namena potprograma je parametrizacija problema: mogućnost da se za određenu grupu operacija odrede njeni parametri. Način na koji određeni viši programski jezik radi ovo prevođenje naziva se njegovom pozivnom konvencijom (calling convention). drugi u registarkom paru ecx:ebx. smešta je u odredišni operand. s tim da se kao ekvivalent Pascal-skih procedura koriste funkcije čiji je tip eksplicitno deklarisan kao void. Prilikom pisanja potprograma se definiše koji registri će se koristiti za prenos kojih argumenata. Ilustracije radi. call i ret koriste stek automatski. Naredba push prvo smanjuje esp za 4. Neka se prvi broj nalazi u registarskom paru edx:eax. Potprogram bi mogao izgledati ovako: . ali postoje i posebne operacije za smeštanje (push) i preuzimanje (pop) vrednosti. a da bi ove operacije automatski pamtile i preuzimale adresu od koje se nastavlja izvršavanje po završetku potprograma. S druge strane. Izvesni programski jezici. povratak iz potprograma omogućava naredba ret. First Out) struktura: poslednji smešten element će biti prvi preuzet. po pretpostavci jednostavnije i lakše za razumevanje i održavanje. 80386 nije izuzetak: za poziv potprograma postoji naredba call. Jedna pozivna konvencija je da se argumenti prenose preko registara. isto tako. C sve potprograme naziva funkcijama. Potprogrami koji kao rezultat izvršavanja vraćaju neku vrednost obično se nazivaju funkcije. Stek je tzv. LIFO (Last In.

C konvencija je prilagođena ovim zahtevima: – – Argumenti se stavljaju na stek od poslednjeg ka prvom. Prostor za lokalne promenljive zauzima se na steku: pokazivač na vrh steka umanjuje se za odgovarajuću vrednost. %edx $3. %ebx $4. Prenos argumenata preko steka Prenos argumenata preko registara ima više nedostataka. Potprogram treba da ima svoju ulaznu labelu i negde u svom telu naredbu za povratak iz potprograma. čime se pozivajućoj funkciji osigurava pristup sopstvenom frejmu po nastavku njenog izvršavanja. Na ovaj način prvi argument je uvek na poznatoj lokaciji. Funkcije u C-u mogu raditi sa promenljivim brojem argumenata i imati lokalne promenljive. 5. RA (return address) je povratna adresa. kao kod 80386). %eax adcl %ecx. Frejm sadrži argumente. neposredno iznad povratne adrese. Zatečena vrednost pokazivača frejma se stavlja na stek na početku izvršavanja funkcije i restaurira pre povratka. potprogram ima na raspolaganju manje registara za rad. definisanje potprograma ne zahteva nikakve dodatne direktive. Na taj način se može preneti ograničen broj argumenata. a što se više argumenata prenese. a FP (frame pointer) prethodna vrednost pokazivača frejma. tako i posle glavnog programa. %eax $2.Potprogrami saberi: movb $0. zatečenu vrednost pokazivača frejma i lokalne podatke funkcije. Drugi način prenosa argumenata je preko steka. implementacija rekurzivnih potprograma postaje prilično komplikovana. %ecx saberi Kao što se iz primera može videti. Na slici 13 prikazani su jedna C funkcija i izgled njenog frejma nakon inicijalizacije. Pozivne konvencije jezika kao što su Pascal i C pretpostavljaju da se na ciljnom procesoru mogu koristiti (ili implementirati) stek i operacije za rad sa vrednostima na njemu.2. Potprogrami se mogu definisati kako pre. Ovaj način koriste viši programski jezici. Za pristup argumentima i lokalnim promenljivama koristi se poseban pokazivački registar koji se zove pokazivač frejma (frame pointer). 80386 kao pokazivač frejma koristi registar ebp. Dalje. greska addl %ebx. . tako da upotreba steka unutar funkcije (recimo za dalje pozive) ne utiče na sadržaj lokalnih promenljivih (prećutno se podrazumeva da stek raste naniže. %edx jnc saberi_kraj incb greska saberi_kraj: ret Strana 30 Glavni program iz kog se prethodni potprogram poziva izgleda: main: movl movl movl movl call kraj: nop $1. povratnu adresu.

u odnosu na njega se može određivati relativna pozicija (offset) argumenata i lokalnih promenljivih: movl 12(%ebp). Pošto ebp registar pokazuje na fiksnu tačku frejma. Dibager DDD može prikazati trenutni izgled steka korišćenjem opcije Memory iz menija Data.Potprogrami Strana 31 char * strrchr(const char *cs. %esp #drugi argument -> stek #prvi argiment -> stek #oslobađanje prostora na steku Sve 4 gornje naredbe (smeštanje argumenata na stek. int c) { char *t = 0. po povratku se esp mora prilagoditi. } c porast adresa cs RA FP t ebp esp (a) (b) Slika 13: C funkcija: (a) izvorni kôd i (b) izgled frejma nakon poziva funkcije. Opcije u prozoru koji se otvori treba podesiti na sledeće vrednosti: . %esp movl %ebp. %esp pop %ebp ret #čuvanje zatečenog FP-a #postavljanje novog FP-a #prostor za lokalnu promenljivu #brisanje lokalne promenljive #vraćanje prethodnog FP Na kraju potprograma se nalazi asemblerski kod koji uništava frejm: Argumentima na steku se u okviru potprograma pristupa korišćenjem ebp registra i baznog adresiranja. sâm poziv asemblerskog potprogama i oslobađanje zauzetog prostora na steku) predstavljaju ekvivalent poziva potprograma u višem programskom jeziku. %ebx movl -4(%ebp). %ecx #drugi parametar (c) -> ebx #prva lokalna promenljiva (t) -> ecx Pošto pozivajuća funkcija stavlja argumente na stek (gde joj kasnije ne trebaju). return t. a pre izvršavanja njenog tela Asemblerski kôd koji stvara frejm se nalazi na početku potprograma: push %ebp movl %esp. a c u ebx): push %ebx push %eax call strrchr add $8. %ebp subl $4. Poziv funkcije sa slike 13 izveo bi se na sledeći način (pretpostavlja se da je argument cs u eax. while (*cs) if (*cs++ == c) t = (char *) cs – 1.

pošto u tom slučaju nije potreban nikakav dodatni kôd. Ovo odgovara ulazno-izlaznim parametrima kod viših programskih jezika. Rekurzija Rekurzija predstavlja situaciju u kojoj potprogram poziva samog sebe (direktno. Umanjivanje operanda za 1 . ta izmena se neće odraziti na originalni argument.text . Ulaz u potprogram su dve vrednosti prenete preko steka.4. %esp #oslobađanje prostora na steku 5. a izlaz je preko eax registra. da se ne bi desilo da se stek prepuni (stack overflow). Najlakše se može realizovati korišćenjem frejmova. Da bi se iz potprograma mogla menjati vrednost nekog argumenta. Ovo odgovara ulaznim parametrima kod viših programskih jezika (Pascal). odnosno steka. 5. Faktorijel nekog broja 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. %esi movb (%esi). treba iskoristiti neku varijantu indirektnog adresiranja. na primer: movl 8(%ebp). Ukoliko se vrednost koju funkcija treba da vrati može smestiti u 32 bita. preko drugog potprograma). Kod ovakvih potprograma treba biti pažljiv i treba dobro definisati uslov izlaska iz rekurzije. %eax movl %ebp. ili indirektno. %eax #telo potprograma addl 12(%ebp).globl main saberi: #naziv potprograma push %ebp #početak potprograma movl %esp. pošto potprogram radi sa lokalnom kopijom vrednosti argumenta. %esp #završetak potprograma pop %ebp ret main: #glavni program push $123 #drugi argument -> stek push %456 #prvi argiment -> stek call saberi #poziv potprograma add $8.Potprogrami Strana 32 Umesto broja 20 može se staviti broj vrednosti na steku koje se žele posmatrati. Da bi se pristupilo vrednosti na koju cs pokazuje. tada se ta vrednost vraća preko registra eax. Jedan primer rekurzivnog potprograma bi bila funkcija za izračunavanje faktorijela. U prethodnom primeru (strrchr) parametar cs predstavlja adresu niza znakova. dok se umesto hex može staviti i neki drugi format prikaza. Prenos argumenata po vrednosti i po adresi Kada se potprogramu prosledi vrednost argumenta. Ukoliko se može smestiti u 64 bita. %ebp movl 8(%ebp).3. potprogramu treba proslediti njegovu adresu. #potprogram za sabiranje dva broja . vrednost se vraća preko registarskog para edx:eax.section . Potprogram ne vrši proveru prekoračenja. Primer: potprogram za sabiranje dva broja. %al #prvi parametar (cs) -> esi #prvi znak -> al Još jedna konvencija vezana za više programske jezike se odnosi na povratnu vrednost funkcija. ukoliko ona bude izmenjena u okviru potprograma.

%ebx jz fakt_nula push %ebx decl %ebx push %ebx call faktorijel add $4. Registar eax iskoristiti za vraćanje vrednosti o grešci: ukoliko dođe do prekoračenja opsega od 32 bita prilikom množenja.množenik prenet preko vrednosti . Prepraviti potprogram za faktorijel tako da se rezultat vraća preko argumenta prenetog po adresi. a da se povratna vrednost vraća preko registra eax. %ebp movl 8(%ebp).Potprogrami • Strana 33 mul. program bi mogao izgledati ovako: faktorijel: push %ebp movl %esp.5. naredba mul radi sledeće: mulb operand mulw operand mull operand #al*operand -> ax #ax*operand -> dx:ax #eax*operand -> edx:eax Ako se usvoji da funkcija ima jedan parametar (n) tipa 32-bitnog neoznačenog broja koji se prenosi po vrednosti. Domaći zadaci 1.adresa proizvoda (izlazni parametar) 2. %eax fakt_kraj: movl %ebp.množilac prenet preko vrednosti . %esp pop %ebx mull %ebx jmp fakt_kraj fakt_nula: movl $1. sa 3 parametra: . %ebx andl %ebx. u eax vratiti 1. Množenje neoznačenih operanada. U zavisnosti od veličine operanda. . Napisati potprogram za množenje pomoću sabiranja i pomeranja. %esp pop %ebp ret #provera da li je n=0 #čuvanje vrednosti n na steku #n-1 #rekurzija #vraćanje vrednosti n sa steka #n*(n-1)! -> eax #slučaj n=0 5. inače vratiti 0.

zapisan u pozicionom brojnom sistemu sa osnovom b. Na primer. Takav znakovni zapis je promenljive dužine i može biti duži od internog . Ako ima još cifara. međutim. Za kodiranje tekstualnog zapisa najviše se koristi ASCII standard (American Standard Code for Information Interchange) ili neka od njegovih proširenih varijanti. Pomnoži rezultat osnovom brojnog sistema 3. ovaj algoritam ne proverava prekoračenje kapaciteta rezultata. Dužina izvornog niza cifara: prazan niz (onaj čiji je prvi element NUL bajt) se tretira kao greška. Postupak konverzije ovako zapisanog broja u njegovu vrednost može se opisati sledećim nizom koraka: 1. u suprotnom završi konverziju Algoritam u C-u za konverziju celog neoznačenog broja iz dekadnog zapisa u interni format prikazan je na slici 14. uobičajeno je da se znakovi praznine (razmak i tabulator) pre prve cifre ignorišu. za beleženje broja 31337 10 u znakovnom obliku potrebno je najmanje pet bajtova (za svaku cifru po jedan). U narednim primerima će se za znakovni zapis brojeva koristiti osnovni ASCII kôd i konvencija iz jezika C: kraj niza se označava ASCII NUL bajtom.1. Analogno tome se radi i obrnut postupak. Ako se radi sa brojnim osnovama od dva do deset. Kod većih brojnih osnova kao cifre težine veće od devet koriste se mala ili velika slova. u skladu sa brojnom osnovom broja: cifra van dozvoljenog opsega predstavlja grešku. Asemblerska verzija ovog algoritma koristi naredbu lea (Load Effective Address). Konverzije različitih brojnih osnova u interni format Današnji računari interno (u registrima ili memorijskim lokacijama) predstavljaju brojeve u binarnom obliku. Ova naredba izračunava adresu izvornog operanda (koji mora biti memorijski) i smešta je u odredišni operand (koji mora biti registarski). Dodaj na rezultat vrednost cifre na tekućoj poziciji 4. Jednostavnosti radi. znakovi za cifre decimalnog brojnog sistema imaju kodove od 48 do 57. Koristi se i direktiva . dobijanje vrednosti cifre na osnovu njenog ASCII koda se svodi na oduzimanje konstante 48 (koda za cifru nula) od ASCII koda cifre. Konverzija iz znakovnog oblika (ceo dekadni broj) u interni oblik Uopšte uzev. Pretpostavka je da se cifre pišu od najveće težine ka najmanjoj. 6. Prilikom konverzije iz znakovnog zapisa u interni proverava se sledeće: – – – Validnost pojedinačnih cifara. koji ima vrednost nula. Za komunikaciju sa korisnikom se. pomeri tekuću poziciju za jedno mesto u desno i pređi na drugi korak. svaki znak zauzima jedan bajt. broj iz interne predstave prevodi u znakovni niz čiji su elementi cifre. Inicijalizuj rezultat konverzije na nulu i postavi tekuću poziciju u nizu cifara na prvu cifru 2. Brojevi su zapisani kao nizovi bita. Znaci '\0' na kraju stringa služe za definisanje ASCII NUL znaka. U osnovnom ASCII kodu.na primer. te je i postupak prilagođavanja složeniji. dok bi interni format u 16-bitnom registru zauzimao dva bajta. svaki broj od n cifara. . čija dužina uglavnom odgovara kapacitetu memorijske lokacije. Kapacitet odredišta za interni format: prekoračenje kapaciteta je greška. može se predstaviti na sledeći način: x n−1 b n−1x n−2 bn−2⋯x 1 bx 0 gde je xi cifra odgovarajuće težine.Konverzije različitih brojnih osnova u interni format Strana 34 6. Svi brojevi se tretiraju kao neoznačeni. Realni programi za konverziju imali bi veći broj provera.ascii koja služi za smeštanje ASCII teksta u segment podataka.

%bl #izdvajanje cifre i provere jc i_greska cmpb $9. } r *= 10. %ebx movl $10. %bl #provera kraja stringa jz kraj_dec subb $'0'. extern unsigned r. if (!*d) greska++. %esi #'\0' na početku stringa? jne kraj i_greska: incb greska kraj: nop . %ecx dec_cifra: movb (%esi). extern int greska. r += *d++ . %bl ja i_greska mull %ecx #r*=10 andl %edx. else while (*d) { if (!isdigit(*d)) { greska++. %esi #adresa prvog znaka -> esi movb $0. %eax #r=r+cifra jc i_greska incl %esi #sledeći znak jmp dec_cifra kraj_dec: cmpl $dec_br. break.Konverzije različitih brojnih osnova u interni format #include <ctype. } Strana 35 Slika 14: Konverzija znakovnog zapisa neoznačenog dekadnog broja u interni format Asemblerska verzija ovog algoritma izgleda: dec_br: greska: .byte 0 leal dec_br. %bl #znak -> bl andb %bl. %edx #prekoračenje kapaciteta? jnz i_greska addl %ebx.'0'. greska xorl %eax. %eax #r=0 xorl %ebx. greska = 0. r = 0.ascii "3133734892\0" .h> extern const char *d.

vrednost 0. Konverzija iz znakovnog oblika (razlomljeni dekadni broj) u interni oblik Problem kod implementacije ovog algoritma u asembleru je što standardne procesorske naredbe barataju isključivo celobrojnim vrednostima. %ebx movl $10. Takvim postupkom bi.0625 kao 62500000 ili 062500000. %ecx #baza dec_cifra: movb (%esi). %bl ja i_greska mull %ecx andl %edx.3. Ovo se rešava skaliranjem razlomljenog broja nekim stepenom broja 10: ako se implementacija zadrži na jednostrukoj preciznosti. %eax jc i_greska cmpl $1000000000.Konverzije različitih brojnih osnova u interni format Strana 36 6.2. %bl andb %bl. %edx jnz i_greska addl %ebx. značila bi korišćenje početne vrednosti 500000000 i njeno prepolovljavanje u svakom narednom koraku. . Konverzija iz znakovnog oblika (razlomljeni binarni broj) u interni oblik Binarni razlomak oblika b1 2−1 b2 2−2⋯bn 2−n može se konvertovati u decimalni zapis ispitivanjem sukcesivnih bitova i sumiranjem vrednosti 2-i (počev od ½) za svaku poziciju gde je odgovarajući bit jednak jedinici. %esi movb $0. Neposredna implementacija ovog algoritma. a vrednost 0.ascii "200000000\0" . u sprezi sa skaliranjem opisanim u prethodnom odeljku.byte 0 leal dec_br. %esi #prazan string? jne kraj i_greska: incb greska kraj: nop Zbog uvedenog načina predstavljanja razlomljenih brojeva. %eax #provera prekoračenja jae i_greska incl %esi #sledeći znak jmp dec_cifra kraj_dec: cmpl $dec_br. Jedini dodatni uslov je da rezultat ne sme biti veći ili jednak od 109. na primer. 6. %bl #kraj stringa? jz kraj_dec subb $'0'. može se primetiti da je konverzija iz znakovnog dekadnog zapisa razlomljenog broja u interni format identična prethodnom programu (konverzija celog broja). Ipak. %bl #dobijanje cifre jc i_greska cmpb $9. greska xorl %eax. dec_br: greska: . %eax xorl %ebx.2 bila predstavljena kao 200000000. skaliranje se može izvesti sa 109.

%ecx #više od 32 cifre? ja i_greska movb (%esi). %eax #rezultat/2 -> rezultat shrl $1. %al #kraj stringa? jz kraj_bin subb $'0'. Opšti sučaj konverzije iz znakovnog oblika (razlomljeni broj) u interni oblik Algoritam za konverziju razlomljenog broja u bilo kojoj osnovi u osnovu 10 (koja se. %ecx bin_cifra: cmpl $32. %esi movb $0. %eax razl_poz: shrl $1. pošto se koristi registar kapaciteta 32 bita. 6.byte 0 leal bin_br. %eax nije_jedan: loopl razl_poz kraj: nop Broj obrađenih binarnih cifara mora se pamtiti (ecx) jer se za proveru uslova kraja konverzije ne može iskoristiti nulta vrednost registra sa internim formatom vrednosti. koristila kao interna predstava u prethodnim primerima) se može predstaviti sledećim nizom koraka: . a dodaje mu se 500000000 ako se pokaže da je na tekućoj poziciji bit vrednosti jedan. bin_br: . %ebx #izdvajanje binarne cifre jnc nije_jedan addl $500000000. skalirana sa 10 9. S obzirom na metod.Konverzije različitih brojnih osnova u interni format Strana 37 za postizanje veće tačnosti rezultata bolje je primeniti alternativni postupak: ispitivanje binarnih cifara s kraja. %al ja i_greska shrb $1. U ovoj verziji uvedeno je ograničenje radi jednostavnije konverzije binarnog zapisa u interni format. broj binarnih cifara ne bi morao biti ograničen na 32 ukoliko bi se prvo utvrdila lokacija kraja niza i sa konverzijom krenulo ka njegovom početku. %al #izdvajanje cifre jc i_greska cmpb $1. %al andb %al. %ebx xorl %ecx.4. pošto su vodeće nule u razlomljenom broju bitne. s tim da se rezultat prepolovljava pre ispitivanja. %al #ubacivanje cifre u broj rcll $1. greska xorl %ebx.ascii "1000100010110100\0" greska: . %ebx jc i_greska #provera prekoračenja incl %esi incl %ecx jmp bin_cifra i_greska: incb greska jmp kraj kraj_bin: jecxz i_greska #prazan string? xorl %eax.

Domaći zadaci 1. Napisati program za konverziju celog dekadnog broja u interni format u dvostrukoj preciznosti. Napisati program koji će sve cifre heksadecimalnog celog broja koje su zadate malim slovima pretvoriti u velika slova. 2. Postavi rezultat na 0 i pozicioniraj se na poslednju cifru u broju 2. bilo bi dobro da faktor skaliranja bude 108. Rezultat saberi sa cifrom i podeli sa bazom Strana 38 3.5. pređi na prethodnu cifru i idi na korak 2. da bi se izbegla prekoračenja u nekim situacijama. u suprotnom završi konverziju Kod implementacije ovog algoritma u asembleru. 6. obratiti pažnju na to da se u tom slučaju radi sa skaliranim brojevima.Konverzije različitih brojnih osnova u interni format 1. . Ukoliko ima još cifara. Zbog toga što algoritam radi za bilo koju bazu.

(%edi) incl %edi andl %eax. rezultat treba prikazati u obliku koji je razumljiv korisniku. ostatak -> edx U nastavku teksta je dat program za konverziju iz internog oblika u znakovni oblik celog dekadnog broja. %eax leal dec_br. %al movb %al. 2 ili 4) sa vrednošću vrednost. Deljenje neoznačenih brojeva se može obaviti naredbom div koja. ostatak -> dx #edx:eax/operand -> eax. %eax jnz dec_cifra movb $0. Konverzija iz internog oblika u znakovni oblik (ceo dekadni broj) Konverziju iz internog oblika u znakovni oblik celog broja određene brojne osnove najlakše je obaviti uzastopnim deljenjem ulazne vrednosti osnovom odredišnog brojnog sistema i pretvaranjem ostatka svakog deljenja u zankovni ekvivalent (tj. U programu napisanom po ovom algoritmu je uvedena asemblerska direktiva . %ebx dec_cifra: xorl %edx. odgovarajuću cifru). 7. Kada program izvrši obradu.1.fill čiji je format: . %esi obrni: cmpl %edi. respektivno). u zavisnosti od veličine operanada. (%edi) decl %edi incl %esi jmp obrni #broj za konverziju #baza #neophodno zbog divl #kraj algoritma? #kraj stringa #obrtanje niza .0 movl $375000000. (%esi) movb %ah. %esi jae kraj movb (%esi). ostatak -> ah #dx:ax/operand -> ax. Parametri veličina i vrednost su opcioni (podrazumevane vrednosti su 1 i 0. odnosno treba izvršiti konverziju iz internog oblika u znakovni oblik u nekoj osnovi. %dl movb %dl. dec_br_max = 10 dec_br: . veličina. %ah movb (%edi).Konverzije iz internog formata u različite brojne osnove Strana 39 7. radi sledeće: divb operand divw operand divl operand #ax/operand -> al. vrednost Ova direktiva služi da se u memoriju upiše broj elemenata dužine veličina bajtova (može biti 1. (%edi) decl %edi leal dec_br. elemente niza treba obrnuti da bi se dobio konačan i ispravan zapis. Konverzije iz internog formata u različite brojne osnove Konverzija iz znakovnog oblika u interni format je neophodna svaki put kada korisnik treba da zada broj koji treba da se obrađuje u njemu razumljivom obliku. %edx divl %ebx addb $'0'.1.fill dec_br_max. S obzirom da se na ovaj način dobija niz cifara zapisan obrnutim redosledom u odnosu na uobičajeni. Algoritam prestaje s radom pošto se kao rezultat deljenja dobije nula. %edi movl $10.fill broj.

pa tako. while (s < t) { char c = *s. %bl movb %bl. s = t = (char *) b. *t-. %esi . *t. što je dovoljno za broj u jednostrukoj preciznosti i završni NUL. %bl addb $'0'.='\0'. %bl #u bl andb $1. *s++ = *t.1. %edi bin_cifra: shrl $1. (%edi) #kraj stringa decl %edi #obrtanje dobijenog niza leal bin_br. deljenje sa 2 nije realizovano pomoću naredbe div. %eax #prebacivanje najnižeg bita eax rclb $1. nego su iskorišćene naredbe za pomeranje i rotiranje kako bi se ostatak pri deljenju sa 2 direktno prebacio u registar bl.= c.Konverzije iz internog formata u različite brojne osnove kraj: nop Strana 40 7. Kod asemblerske verzije ovog algoritma. %eax #provera kraja algoritma jnz bin_cifra movb $0. char *s. Program koristi specifičnosti binarnog brojnog sistema. #include <ctype. (%edi) #upis znaka u string incl %edi andl %eax. za binarni zapis je predviđeno 33 bajta.fill bin_br_duz. do { *t++ = (r & 1) + '0'. *t-.h> extern const char *b. } while (r).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 rezultujućeg niza prikazan je na slici 15. Sâm program dat je u nastavku teksta. r >>= 1.0 #rezervisanje 33 bajta movl $31337. %eax #broj koji se konvertuje leal bin_br. } Slika 15: Konverzija iz internog formata u binarni znakovni format Asemblerska verzija programa izgleda: bin_br_duz = 33 bin_br: .

(%edi) incl %esi decl %edi jmp obrni kraj: nop Strana 41 7.1. %edi movl $32. Ako je broj različit od nule. (%edi) kraj: nop #1 ili 0? #oduzimanje jedinice #kraj algoritma? #ima još mesta u stringu? #kraj stringa . (%esi) movb %ah. %ecx bin_cifra: movb $'0'. Ako je rezultat manji od jedan. Ako se skaliranje izvede na ranije opisan način. (%edi) incl %edi andl %eax. mora se postaviti gornja granica broja cifara konvertovanog zapisa. %eax jb nije_vece incb %dl subl $1000000000. %eax nije_vece: movb %dl. %eax leal bin_br. %dl addl %eax. %ah movb (%edi). %al movb %al. Problem sa ovom konverzijom je mogućnost da se prilikom konverzije javi beskonačna periodičnost u rezultatu. %esi jae kraj movb (%esi). Pomnoži broj sa dva 2. odgovarajuća binarna cifra je 0.Konverzije iz internog formata u različite brojne osnove obrni: cmpl %edi. pređi na prvi korak. zapiši binarnu cifru 1 i oduzmi jedinicu od broja 4. Konverzija iz internog oblika u znakovni oblik (razlomljeni binarni broj) Razlomljen broj.0 #broj za konverziju #max broj cifara movl $375000000.fill 33. zapiši je i pređi na prvi korak 3. U suprotnom. u suprotnom završi konverziju Ovde se takođe koristi predstava brojeva skaliranih sa 109.3. Pošto je kapacitet memorije ograničen. %eax cmpl $1000000000. ograničavanje broja cifara na 32 će dati binarni razlomak uporedive preciznosti. bin_br: . %eax jz kraj_bin loopl bin_cifra kraj_bin: movb $0. u decimalnom zapisu oblika x n−1 b n−1x n−2 bn−2⋯x 1 bx 0 može se konvertovati u ekvivalentni binarni zapis algoritmom sa sledećim nizom koraka: 1.

Pomnoži broj sa bazom 2. neophodno je ograničiti broj njegovih cifara. 7. Napisati program u asembleru za konverziju celog broja u dvostrukoj preciznosti iz internog formata u znakovni dekadni oblik. Ako je broj različit od 0. Ako je ceo deo broja različit od 0. Domaći zadaci 1. Takođe. Napisati program u asembleru za konverziju celog oktalnog broja u znakovnom obliku u binarni broj u znakovnom obliku.Konverzije iz internog formata u različite brojne osnove Strana 42 7. 2. oduzmi ga od broja 4. u suprotnom završi konverziju Pri realizaciji ovog algoritma u asembleru. Izdvoji ceo deo broja i zapiši ga kao cifru izlazne osnove 3. treba obratiti pažnju na to da se u tom slučaju radi sa skaliranim brojevima. pošto se može dobiti beskonačna periodičnost u izlaznom broju. pa tome treba prilagoditi sve računske operacije. idi na korak 1. .4.5. Opšti slučaj 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 može predstaviti sledećim nizom koraka: 1.

dobile bi se vrednosti kao na slici 17: 1. paritet 1. Kontrolni brojevi se mogu računati za sve podatke zajedno (checksum . Ukoliko je broj jedinica paran. Ukoliko postoje razlike. a to je da ne može detektovati grešku ako se na jednoj težinskoj poziciji javi paran broj grešaka. Kada se podaci prebace na drugi računar. Jedan algoritam koji radi sa svakim podatkom posebno se zasniva na sledećem: posmatra se binarna predstava svakog podatka posebno i prebrojava se koliko jedinica ima u broju (slika 16). kontrolna suma (u ovom slučaju. 10101001 01010101 11010100 01100101 10011111 1 0 1 0 1 Slika 17: Paritet na najznačajnijem bitu Nedostatak ovakve kontrole podataka je što ne može otkriti grešku ukoliko je u broju promenjen paran broj bita. 00101001 01010101 01010100 01100101 00011111 Slika 16: Paritet Ukoliko je broj jedinica paran. a u suprotnom se postavlja na 1. na odgovarajućem mestu u kontrolnoj sumi se stavlja 0. 5. 2. a ponekad i horizontalni paritet. Uobičajeni način za proveru je da se na podatke primeni neki algoritam koji će kao rezultat dati jedan ili više kontrolnih brojeva koji se prebacuju zajedno sa podacima. uobičajeno je da se bit na najznačajnijoj poziciji koristi za smeštanje pariteta (u tom slučaju. postavlja se pitanje da li su oni ispravno preneti. 2. Jedan algoritam koji radi na taj način se zasniva na sledećem: posmatra se binarna predstava svih podataka zajedno i broji se koliko ima jedinica na svakoj težinskoj poziciji u svm brojevima (slika 18). na njih se primeni isti algoritam. a mogu se računati i za svaki posebno. . kontrolni bit) se postavlja na 0. podaci se moraju predstavljati sa jednim bitom manje). 3.Kontrolna suma i paritet Strana 43 8. Ovakva kontrolna suma se naziva i vertikalni paritet. 4. odnosno kontrolnih brojeva). došlo je do greške u prenosu. Postoji mnogo algoritama koji se koriste u ove svrhe. Ovakav kontrolni bit se naziva paritet (parity). a u suprotnom se stavlja 1. dok komplikovaniji omogućavaju i ispravak grešaka u slučaju da ih nema previše (ovo zavisi od količine redundantnih podataka. Ukoliko bi se bit pariteta ugradio u vrednosti sa slike 16. Druga vrsta kontrolnih suma su one koje se odnose na podatke kao celinu. 3. 5. Kontrolna suma i paritet Kada se podaci prebacuju sa jednog računara na drugi. od kojih jednostavniji omogućavaju samo detekciju grešaka. Kada se koristi paritet. 4.kontrolna suma). Očigledan nedostatak ovakve kontrolne sume je isti kao i kod pariteta. pa se uporede tako dobijeni kontrolni brojevi sa prenetim kontrolnim brojevima.

5.long .long . Prvi podatak u nizu je broj elemenata niza. %esi sledeci_el: movl niz(. %esi jl sledeci_el shrl $1.1. 4. %ebx andl %edx.long . %ecx rcrl $1. br_elem = niz: . 2. Domaći zadatak 1. . %edx sledeci_bit: xorl %ecx.4).Kontrolna suma i paritet 1. %ecx xorl %esi. Napisati program za proveru pariteta niza 8-bitnih brojeva (bit na najznačajnijoj poziciji je bit pariteta). %eax movl $1. 3. %ebx jz bit_nula incl %ecx bit_nula: incl %esi cmpl $br_elem. checksum kraj: nop #obrađeni svi elementi? #parnost #pomeranje maske #obrađeni svi bitovi? 8.%esi.long 0 #checksum #maska #brojač bita #brojač elemenata niza #provera vrednosti bita xorl %eax. %edx jnc sledeci_bit movl %eax. %eax shll $1.long .long checksum: 6 0b10101010100101010001010100111111 0b10101010110111110101010101000101 0b11111111110000000001111111000000 0b11101001010110100101101010101010 0b00010101010100101010101010100101 0b11000101001010001001000100101010 . ∑ 00101001 01010101 01010100 01100101 00011111 01010010 Strana 44 Slika 18: Vertikalni paritet Asemblerski program koji računa kontrolnu sumu za niz 32-bitnih brojeva je dat u nastavku teksta.long .

na kraju niza unetih znakova nalazi kôd 13 (kôd za taster ENTER). sadržaj video memorije se mora pomeriti za jednu liniju naviše. stdin. kako je ona organizovana. ostaje nepromenjen nakon povratka iz sistemskog poziva). ili korišćenjem usluga operativnog sistema. Sistemski pozivi Sistemski pozivi omogućuju pozivanje operacija operativnog sistema.2. sistemski pozivi su osnovni nivo apstrakcije hardvera . pronađe memorijsku lokaciju sa adresom obrađivača prekida i započne njegovo izvršavanje.Ulaz. int. Ulaz. koji su kodovi znakova i boja prilikom ispisa. Sistemski poziv za izlaz (write) koristi sledeće argumente: eax ← 4 (broj sistemskog poziva za izlaz) . esi. Nakon izvršenja sistemskog poziva. koja je rezolucija ekrana. 9.1. Program koji želi da ispiše tekst direktno pristupajući video memoriji mora da zna koji se tip grafičke kartice nalazi u računaru. odnosno znakova. kao što su upravljački programi za mikrokontrolere ili drajveri. razmotrimo operaciju prikaza teksta na ekranu korišćenjem direktnog pristupa hardveru. dok nula ili pozitivan označava uspešno izvršenje. ovaj broj će biti negativan. ecx. gde se nalazi početak video memorije. Ukoliko je došlo do neke greške. izlaz i makroi Strana 45 9. portovima u ulazno/izlaznom adresnom prostoru koji odgovaraju hardverskim registrima). ako se prilikom upisivanja pređe ispod poslednje linije ekrana. Dalje.oni omogućuju izvršavanje operacija bez poznavanja detalja fizičke arhitekture sistema. sve ovo pada na teret drajvera koji radi sa grafičkom karticom. sistemskim pozivima se pristupa korišćenjem naredbe softverskog prekida. registar eax sadrži informaciju o izvršenju poziva. u bafer će se upisati samo onoliko koliko je specificirano registrom edx. oni su ujedno i jedini način za komunikaciju korisničkih programa sa okruženjem. izlaz i završetak programa Sistemski poziv za ulaz (read) koristi sledeće argumente: eax ← 3 (broj sistemskog poziva za ulaz) ebx ← deskriptor datoteke (za standardni ulaz. Za razliku od hardverskog. 9. ova vrednost je 0) ecx ← adresa ulaznog bafera edx ← veličina bafera Nakon povratka iz poziva. Prvi način se zbog svoje složenosti koristi skoro isključivo kod programa specijalizovane namene. Korišćenjem sistemskih poziva. Direktan pristup hardveru dopušten je samo sistemskim procesima. Ilustracije radi. sa vektorom 0x80. Kod sistema gde su korisnički i sistemski prostor strogo međusobno izolovani. Negativan broj označava grešku. Pod Linux-om na procesoru Intel 80386. Drugi način podrazumeva obraćanje sistemu putem sistemskih poziva. ako se unese više od maksimalnog broja znakova. dok u registre ebx. kao i registra ebp. registar eax će sadržati broj pročitanih bajtova. itd. edx. kao i to da. edi treba postaviti eventualne argumente poziva (sadržaj ovih registara. softverski prekid se ne može zabraniti. Procesor Intel 80386 se u toku izvršavanja ove naredbe ponaša slično kao kod prijema hardverskog prekida: sačuva na steku sadržaj statusnog registra i programskog brojača. u registar eax treba postaviti broj sistemskog poziva. Ulaz. Treba imati u vidu da se kod unosa sa tastature. Pre poziva naredbe int. izlaz i makroi Program koji treba da komunicira sa okruženjem obraćajući se periferijskim uređajima može to da čini na dva načina: direktnim pristupom hardverskom interfejsu uređaja (na primer. Broj argumenata zavisi od sistemskog poziva koji se želi koristiti. Čak i tamo gde ovakva ograničenja ne postoje.

Za regularan završetak programa potreban je sistemski poziv exit. %edx int $0x80 movl $1. %eax #ispis poruke 2 movl $1. %ecx movl ime_i_prezime_duzina. %ecx movl $poruka1_duzina. dok je za standardni izlaz za greške. %ebx leal poruka2. U programu je korišćena direktiva u obliku izraza labela1 = . ova vrednost je 1. %eax #ispis poruke 1 movl $1. Ukoliko je došlo do neke greške. %eax #unos imena i prezimena movl $0. %eax #ispis imena i prezimena movl $1. %ebx leal ime_i_prezime.long 0 ime i prezime: \0" \0" movl $4. Sistemski poziv za završetak programa (exit) koristi sledeće argumente: eax ← 1 (broj sistemskog poziva za završetak programa) ebx ← izlazni kôd (kôd greške) Po konvenciji. registar eax će sadržati broj ispisanih bajtova. bez obzira na stvarnu veličinu bafera. u registar ebx se stavlja 0 ukoliko je izvršavanje programa prošlo bez grešaka. Ovime se labeli labela1 dodeljuje razlika pomenute adrese i adrese labele labela2. stdout. U nastavku je dat program koji koristi pomenute sistemske pozive. ova vrednost 2) ecx ← adresa izlaznog bafera edx ← veličina bafera Strana 46 Nakon povratka iz poziva. %ebx int $0x80 #završetak programa . koji saopštava operativnom sistemu da je nastupio kraj izvršavanja programa.ascii "Unesite poruka1_duzina = . %ecx movl $poruka2_duzina. odnosno znakova. ovaj broj će biti negativan. %edx int $0x80 movl %eax.Ulaz.1.-poruka1 poruka2: . %eax movl $0.fill 40. %ebx leal poruka1.-poruka2 . Treba imati u vidu da će se ispisati onoliko znakova koliko se navede u edx registru. %ebx leal ime_i_prezime. izlaz i makroi ebx ← deskriptor datoteke (za standardni izlaz. stderr.-labela2 Tačka u izrazu označava brojač lokacija sa adresom do koje se trenutno stiglo pri asembliranju.ascii "Vi ste: poruka2_duzina = . %edx int $0x80 movl $3. ime_i_prezime: ime_i_prezime_duzina: poruka1: . ime_i_prezime_duzina movl $4. odnosno broj različit od 0. ukoliko je došlo do neke greške.0 . %edx int $0x80 movl $4. %ecx movl $40.

lako se može desiti da trošak vezan za poziv potprograma bude uporediv sa vremenom obrade. ali relativno ograničene upotrebljivosti. izlaz i makroi Strana 47 9. Makroi Iako su potprogrami osnovni i najčešće korišćen način za modularizaciju koda.S Primer 1: makro sistemskog poziva exit . Same operacije poziva i povratka troše izvesno vreme. Naime. njegovo ime se mora navoditi sa prefiksom “\”. Prilikom rada sa makroima treba imati nekoliko stvari na umu. na primer \par1. %ebx int $0x80 Ukoliko je u makrou potrebno definisati labelu. . Prvo. Lokalnih labela ima 10 i definišu se ciframa od '0' do '9'. na primer. odnosno makro definicija i makro poziva. %eax movl $0. ili u slučaju velikog broja poziva. preterana upotreba makroa može dovesti do toga da je kôd razumljiv samo autoru (a možda ni toliko). Zbog toga većina makro-asemblera omogućava makro definicije sa parametrima (kao i makro pozive sa argumentima). Pored toga. %eax movl $3.3. %eax movl \greska. Slovo 'b' (backwards) se koristi kada definicija labele prethodi mestu korišćenja . U vremenski kritičnim delovima koda. koje produžava vreme obrade.. i pažljivo ih dokumentovati. a da izvorni kôd ne postane manje modularan. svi iole složeniji makroi će raditi sa registrima. <telo makroa> . Tekst koji se dobija nakon poziva makroa se može videti pozivom asemblera sa sledećim parametrima: as -alm program.endm Parametri (pari) su opcioni.macro naziv_makroa par1=pv1. Ako se potprogramom izvodi relativno kratak skup operacija (kao što je. može nastati problem ukoliko bi se makro pozvao više od jednom u okviru istog programa.Ulaz. Makroe je zato najbolje koristiti umereno.. specijalni operatori i konstrukcije za uslovno prevođenje.endm Pozivanje makroa kraj_rada bez parametara bi dalo sledeću sekvencu programa: movl $1. ovakav trošak vremena se povećava proporcionalno broju naredbi potrebnih da bi se konvencija implementirala. Drugo. Prosta zamena makro poziva naredbama iz makro definicije je korisna. kao i njihove podrazumevane vrednosti (pv i). Makro definicije sadrže nizove naredbi koje zamenjuju makro poziv u tekstu programa. %ebx int $0x80 dok bi pozivanje istog makroa sa parametrom $3 dalo sledeću sekvencu programa: movl $1. Ovakve greške nisu jednostavne za nalaženje. ukupan trošak poziva potprograma može biti neprihvatljivo veliki. na primer uništenje sadržaja registra koji se koristi u kasnijem toku programa. par2=pv2. Ako se upotreba registara propisno ne dokumentuje. Makro se definiše na sledeći način: . jeste korišćenje makroa. tada cifru labele dopunjava slovo 'b' ili 'f'. Ako je potprogram pisan tako da poštuje neku pozivnu konvenciju. Zbog toga se u makroima koriste lokalne labele. podržane su i lokalne labele.macro kraj_rada greska=$0 movl $1. Kada u telu makroa treba iskoristiti neki parametar. sistemski poziv). Kada labelu treba iskoristiti kao operand neke naredbe. %ebx int $0x80 . poziv makroa može da stvori nepoželjne sporedne efekte. oni nisu uvek najefikasniji. Jedan od načina da se trošak potprogramskog poziva izbegne. isti naziv labele bi se pojavio dva ili više puta u tekstu programa i asembler bi prijavio grešku. dok se slovo 'f' .

Primer 3: makro za određivanje tipa znaka Kod obrade stringova često je potrebno ispitivati tip pojedinih znakova. Mogu se definisati proizvoljan broj puta i tada se njihovo pozivanje odnosi na poslednju definiciju labele (slovo 'b'). \regmem pop %eax . što je operacija složenosti O(1).macro mnozi10o regmem push %eax movl \regmem. izlaz i makroi Strana 48 (forwards) koristiti kada definicija labele sledi posle mesta korišćenja. da bi se kod ispitivanja velikog broja znakova izbegao trošak funkcijskog poziva za svaki obrađen znak. %eax 1: pop %ebx movl %eax. lokacija Ovaj makro ostavlja rezultat množenja u registru ili memorijskoj lokaciji navedenoj kao argument (jedino se ne može koristiti registar eax). a isdigit proverava da li je znak cifra decimalnog brojnog sistema.h>. %eax jo 1f addl %ebx. Konstante za pojedine klase su različiti stepeni broja 2. %ebx addl %eax. Sadržaj svih registara (osim odredišnog. U C-u su za to zadužene funkcije deklarisane u standardnom zaglavlju <ctype. Na primer. U slučaju prekoračenja biće postavljen fleg o. Sledeći makro množi označeni celobrojni operand u jednostrukoj preciznosti sa deset koristeći takvo razlaganje. %eax jo 1f movl %eax.Ulaz. Tabela bi mogla da izgleda ovako: _IS_SP _IS_DIG _IS_UPP _IS_LOW _IS_HEX _IS_CTL _IS_PUN = = = = = = = 1 2 4 8 16 32 64 . Za 8-bitni tip char ovo znači utrošak od 256 bajtova. množenje njima svodi se na uzastopno pomeranje u levo ili sabiranje operanda sa samim sobom. Lokalne labele se mogu koristiti kako u makroima. Primer 2: makro za označeno celobrojno deljenje sa 10 Proizvod 10x može se napisati i kao 8x + 2x. ako je kao argument naveden registar) se čuva. Svaki bajt u tabeli je bit-maska nastala kombinovanjem (pomoću logičkog ILI) konstanti za klase kojima pripada odgovarajući znak. Pošto su 8 i 2 stepeni broja 2. isspace ispituje da li je znak neki od znakova praznine. . Efikasan metod ispitivanja zahteva postojanje tabele čija veličina u bajtovima odgovara broju mogućih znakova. %eax push %ebx addl %eax. %eax jo 1f addl %eax. Ove funkcije se često implementiraju kao makroi. odnosno na prvu sledeću definiciju labele (slovo 'f'). tako i u programu.endm #registar (osim eax) ili mem. Lokacija bit-maske za određeni znak dobija se indeksiranjem tabele njegovim kodom.

_IS_PUN 1.1. _IS_DIG 7. _IS_SP .macro isclass character.1. _IS_PUN Strana 49 Asemblerski makroi. _IS_PUN 6.fill .fill .macro isspace character isclass \character. class xorl %ebx. _IS_PUN 10. . Napisati makro za sistemski poziv za ispis na ekran. izlaz i makroi ctype: ._IS_CTL 5.%ebx.1.1. _IS_LOW | _IS_HEX 20.1. _IS_UPP 6. %ebx movb \character.1. %bl testl $\class.1.fill .fill ._IS_CTL | _IS_SP 18.fill .endm #8-bitni registar ili memorija #8-bitni registar ili memorija Makroi menjaju sadržaj registra ebx.endm .1.fill . _IS_PUN 6.macro isdigit character isclass \character.1. _IS_SP 15.1) .fill . dok bi se određivanje dužine stringa radilo u samom makrou.1.fill .fill .1.1. 9. ctype(. Prepraviti program za množenje pomoću sabiranja u dvostrukoj preciznosti da koristi standardni ulaz i izlaz za komunikaciju sa korisnikom. _IS_UPP | _IS_HEX 20. _IS_CTL 128.fill . 2.fill . _IS_LOW 4. Domaći zadaci 1. Rezultat izvršavanja je stanje flegova posle naredbe test. Makro bi trebao da ima jedan argument. _IS_CTL 1.1.fill 9.fill . string koji treba ispisati na ekran.Ulaz.endm .4.1.fill . ekvivalenti za isdigit i isspace se sada mogu napisati kao: .fill .1. _IS_DIG .

Asinhroni događaji

Strana 50

10. Asinhroni događaji
10.1. Prekidi
Mehanizam prekida podržava rad sa asinhronim događajima na nivou procesora. Prekidi omogućuju 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 unutrašnji. Primer unutrašnjih prekida su izuzeci koji nastaju pri izvršavanju programa (na primer, kao posledica deljenja nulom). Pored ove podele, prekidi se dele na prekide koji se mogu zabraniti (maskable interrupt, maskirajući prekid) i na prekide koji se ne mogu zabraniti (NMI – non-maskable interrupt, nemaskirajući prekid). Za dozvolu, odnosno zabranu izvršavanja maskirajućih prekida je zadužen fleg i (interrupt). U svim ovim slučajevima, reakcija na 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 došlo do prekida. Kod nekih izuzetaka, na stek se stavlja adresa naredbe u toku koje je došlo do prekida. U zavisnosti od vrste prekida, na stek se mogu stavljati i neke dodatne informacije. Na osnovu broja prekida se uzima vektor obrađivača prekida iz tabele prekida. Ukoliko je izvor prekida naredba int, broj prekida je njen operand. Ukoliko je izvor prekida neki hardverski uređaj, on je dužan da procesoru dostavi broj prekida, a ukoliko je izvor prekida sâm procesor, tada se broj prekida generiše interno. Fleg t (trap, koristi se kod izvršavanja naredbi korak po korak) se postavlja na nulu. Fleg i kod nekih prekida se postavlja na 0 (čime se zabranjuju maskirajući prekidi), dok se kod nekih njegovo stanje ne menja. Nakon izvršavanja obrađivača prekida, naredba iret vraća sa steka punu adresu instrukcije od koje treba nastaviti izvršavanje prekinutog programa i vraća sačuvano stanje registra eflags (a samim tim i prethodno stanje flegova t i i). Zbog prirode posla za koji su zaduženi, obrađivače prekida moraju karakterisati sledeće osobine: Neophodno je da obrada prekida vremenski traje što kraće, kako bi procesor što pre bio spreman da obradi sledeći prekid. Ovo je naročito bitno kod maskirajućih prekida, jer ako bi vreme obrade prekida bilo predugo, moglo bi se desiti da se u toku obrade prekida desi novi prekid, koji u tom slučaju ne bi bio obrađen. Obrada prekida se iz tog razloga obično sastoji iz dva dela: deo koji se izvršava u samom obrađivaču prekida (najneophodnija obrada) i deo koji se izvršava van obrađivača prekida (u pozadinskom programu). Zbog asinhrone prirode prekida, koji se mogu javiti prilikom izvršavanja bilo koje instrukcije, neophodno je da se sačuva stanje svih registara u procesoru. Ovo praktično znači da obrađivač prekida mora sačuvati sadržaj svakog registra pre njegovog korišćenja i vratiti ga na kraju obrade prekida.

– –

10.2. Signali
Direktno menjanje tabele prekida je veoma osetljiva operacija koja može da ugrozi rad operativnog sistema. Kod Linux-a korisniku nije dozvoljeno da direktno koristi prekide, pa je za rad sa asinhronim događajima zadužen mehanizam signala. Za potrebe vežbanja je razvijena biblioteka koja se oslanja na mehanizam signala i koja emulira mehanizam prekida. Ona korisniku stavlja na raspolaganje sledeće funkcije: int interrupt_handler_get(int broj_vektora) void interrupt_handler_set(int broj_vektora, int vektor) Prva funkcija omogućava dobijanje vektora za dati broj vektora, dok druga omogućava zadavanje novog vektora za dati broj vektora. Kada se koriste prethodne funkcije, obrađivač prekida se piše kao potprogram bez parametara iz koga se izlazi pomoću naredbe ret. Pri tome, ostale napomene date za obrađivače prekida i dalje važe.

Asinhroni događaji Da bi se prethodna biblioteka uključila u program, asembler se mora pozvati sa

Strana 51

g++ -g -o naziv_programa naziv_programa.S interrupts.o interface.o dok se na početku programa mora nalaziti direktiva #include "interrupts.h" koja služi da se u program uključi fajl u kome su definisane konstante za brojeve prekida. Za podržane prekide su uvedene sledeće 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 dođe do deljenja nulom - korisnički definisani prekid - korisnički definisani prekid

Korisnički prekid se može poslati programu otvaranjem novog shell-a i kucanjem naredbe killall -s SIGUSR1 naziv_programa Primer: beskonačna petlja iz koje se izlazi nakon korisničkog prekida.
#include "interrupts.h" petlja_izlaz: stari_prekid: movl push call addl movl .long 0 .long 0

$USR1, %eax #čuvanje adrese trenutnog %eax #obrađivača prekida interrupt_handler_get $4, %esp %eax, stari_prekid #postavljanje novog #obrađivača prekida

leal kor_prekid, %eax push %eax movl $USR1, %eax push %eax call interrupt_handler_set addl $8, %esp petlja: cmpl $0, petlja_izlaz je petlja kraj: movl stari_prekid, %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

#beskonačna petlja #vraćanje starog #obrađivača prekida

#omogućavanje izlaska iz petlje

Asinhroni događaji

Strana 52

Obrađivač prekida je u ovom primeru izuzetno jednostavan: u njemu se samo postavlja indikator (petlja_izlaz) da se prekid desio, dok proveru stanja tog indikatora vrši glavni program. Ovo je u skladu sa preporukom da obrađivači prekida treba da traju što kraće. Pošto se u njemu ne koriste registri, nije bilo potrebe da se čuvaju na steku. Glavni program se sastoji iz 3 dela. U prvom se čuva adresa trenutnog obrađivača prekida i postavlja se novi. U drugom se nalazi sâm program (beskonačna petlja), dok se u trećem vraća stari obrađivač prekida i nakon toga se program završava.

10.3. Domaći zadatak
1. Napisati obrađivač prekida sistemskog sata koji će na ispravan način uvećavati promenljivu koja u sebi sadrži broj sekundi proteklih od pokretanja programa. Glavni program treba da omogući ispis trenutnog broja sekundi (na zahtev korisnika) i izlaz iz programa.

Pregled korišćenih naredbi U ovoj glavi je dat abecedni pregled asemblerskih naredbi koje su korišćene u programima u ovom praktikumu. Za svaku naredbu su navedeni operandi koji se uz nju očekuju. Uz svaku naredbu je dat i tablarni pregled uticaja na pojedine flegove. call dst o - d - s - z - c - Poziv potprograma.Pregled korišćenih naredbi Strana 53 11. dst o M d - s M z M c M Sabira izvorni i odredišni operand i rezultat smešta u odredišni operand. clc Postavlja carry fleg na 0. Prilikom sabiranja. dst o M d - s M z c M TM Sabira izvorni i odredišni operand i rezultat smešta u odredišni operand. dst označava odredišni operand. pri čemu oznaka src označava izvorni. o - d - s - z - c 0 . and src. zatečeni prenos se ne uzima u obzir. add src. dok cnt označava brojački operand kod naredbi za pomeranje. Prilikom poziva. dst o 0 d - s M z M c 0 Vrši operaciju logičkog I između korespondentnih bita izvornog i odredišnog operanda i rezultat smešta u odredišni. na stek se smešta povratna adresa. pri čemu je notacija za uticaj na pojedinačni fleg sledeća: ? M T Nema promene Vrednost je nedefinisana Vrednost se menja u skladu sa rezultatom (ukoliko se drugačije ne naglasi) Vrednost se testira tokom operacije 0 ili 1 Fleg se postavlja na navedenu vrednost Opisi naredbi u daljem tekstu važe za 32-bitni zaštićeni režim procesora Intel 80386. adc src. zatečeni prenos se uzima u obzir. Prilikom sabiranja.

Pregled korišćenih naredbi Strana 54 cld Postavlja direction fleg na 0. ima sledeće dejstvo: idivb operand idivw operand idivl operand # ax/operand -> al. ima sledeće dejstvo: divb operand divw operand divl operand # ax/operand -> al. ali ne menja odredišni operand. U zavisnosti od veličine izvornog operanda. cmp src. U zavisnosti od veličine izvornog operanda. U zavisnosti od veličine izvornog operanda. dec dst o M d - s M z M c - Oduzima 1 od odredišnog operanda. ostatak -> edx idiv src o ? d - s ? z ? c ? Označeno deljenje. ostatak -> ah # dx:ax/operand -> ax. ostatak -> ah # dx:ax/operand -> ax. int dst o - d - s - z - c - . div src o ? d - s ? z ? c ? Neoznačeno deljenje. ostatak -> dx # edx:eax/operand -> eax. ima sledeće 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 odredišni operand. postavlja flegove u skladu sa tim. dst o - d 0 s - z - c - o M d - s M z M c M Oduzima izvorni operand od odredišnog. ostatak -> edx imul src o M d - s ? z ? c M Označeno množenje. ostatak -> dx # edx:eax/operand -> eax.

jxx dst Strana 55 o - d - s - z - c - Uslovni skok. 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 ... Ovih naredbi ima više.. Odredišni operand je rastojanje ciljne naredbe od naredbe koja sledi naredbu skoka (ovo rastojanje asembler računa automatski kada se kao operand stavi neka labela). odnosno ...... 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 poređenja označenih brojeva jxx jg jge jl jle jng jnge jnl jnle je jne veće veće ili jednako manje manje ili jednako nije veće nije veće ili jednako nije manje nije manje ili jednako jednako nije jednako Skok ako je . a osnovne su date u sledećim tabelama: Uslovni skokovi nakon poređenja neoznačenih brojeva jxx ja jae jb jbe jna jnae jnb jnbe je jne veće veće ili jednako manje manje ili jednako nije veće nije veće ili jednako nije manje nije manje ili jednako jednako nije jednako Skok ako je .Pregled korišćenih naredbi Generiše softverski prekid.

dst o - d - s - z - c - Kopira izvorni operand u odredišni.. dst o - d - s - z - c - Smešta efektivnu adresu izvornog operanda u odredišni. esi+2 -> esi za d=0. ... mov src.. lea src. odnosno esi-2 -> esi za d=1 lodsl # (esi) -> eax. ima sledeće dejstvo: lodsb # (esi) -> al. odnosno esi-4 -> esi za d=1 Podrazumevani segmentni registar je ds (ds:esi). lods o - d - s - z - c - U zavisnosti od veličine podrazumevanog operanda. loop dst o - d - s - z - c - Smanjuje cx (loopw). esi+1 -> esi za d=0. odnosno . odnosno ecx (loopl) za 1 i skače na ciljnu naredbu ako je rezultat različit od nule. esi+4 -> esi za d=0. 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. odnosno esi-1 -> esi za d=1 lodsw # (esi) -> ax.Pregled korišćenih naredbi Ostali uslovni skokovi jxx jc jnc jz jnz jo jno js jns jcxz jecxz prenos nije prenos nula nije nula prekoračenje nije prekoračenje znak nije znak cx = 0 ecx = 0 Skok ako je .

push src o - d - s - z - c - Smanji vrednost pokazivača na vrh steka za 4. U zavisnosti od veličine izvornog operanda. dst o M/? d - s - z - c TM .Pregled korišćenih naredbi Strana 57 mul src o M d - s ? z ? c M Neoznačeno množenje. fleg overflow je nedefinisan. ima sledeće 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 odredišni operand po komplementu 2. pop dst o - d - s - z - c - Skida vrednost sa vrha steka i smešta je u odredišni operand. rcr cnt. dst o 0 d - s M z M c 0 Vrši operaciju logičkog ILI između korespondentnih bita izvornog i odredišnog operanda i rezultat smešta u odredišni. a zatim izvorni operand smešta na novi vrh steka. nakon čega se vrednost pokazivača na vrh steka poveća za 4. not dst o - d - s - z - c - o - d - s - z - c - Negira odredišni operand po komplementu 1. rcl cnt. or src. nop Naredba bez efekta. dst o M/? d - s - z - c TM Rotira odredišni operand kroz fleg carry u levo za navedeni broj mesta (neposredni operand ili registar cl). Ukoliko se rotira za više od jednog mesta.

Fleg carry ima vrednost poslednjeg bita upisanog na najviše značajnu poziciju. fleg overflow je nedefinisan. Naznačajniji bit dobija vrednost 0. Povratna adresa se skida sa vrha steka.Pregled korišćenih naredbi Strana 58 Rotira odredišni operand kroz fleg carry u desno za navedeni broj mesta (neposredni operand ili registar cl). dst o M/? d - s - z - c M Rotira odredišni operand u levo za navedeni broj mesta (neposredni operand ili registar cl). ret o - d - s - z - c - Povratak iz potprograma. Ukoliko se pomera za više od jednog mesta. Fleg carry ima vrednost poslednjeg bita upisanog na najmanje značajnu poziciju. shr cnt. sar cnt. rol cnt. fleg overflow je nedefinisan. shl cnt. Ukoliko se rotira za više od jednog mesta. . Najmanje značajni bit dobija vrednost 0. fleg overflow je nedefinisan. Naznačajniji bit zadržava svoju vrednost. Ukoliko se pomera za više od jednog mesta. zatečeni prenos se uzima u obzir. fleg overflow je nedefinisan. dst o M/? d - s - z - c M Rotira odredišni operand u desno za navedeni broj mesta (neposredni operand ili registar cl). dst o M/? d - s M z M c M Pomera odredišni operand u levo za navedeni broj mesta (neposredni operand ili registar cl). Fleg carry ima vrednost poslednjeg bita istisnutog sa najmanje značajne pozicije. fleg overflow je nedefinisan. dst o M d - s M z c M TM Oduzima izvorni operand od odredišnog i rezultat smešta u odredišni operand. nakon čega se vrednost pokazivača na vrh steka poveća za 4. dst o M/? d - s M z M c M Pomera odredišni operand u desno za navedeni broj mesta (neposredni operand ili registar cl). sbb src. Prilikom oduzimanja. Fleg carry ima vrednost poslednjeg bita istisnutog sa najviše značajne pozicije. Ukoliko se rotira za više od jednog mesta. Ukoliko se pomera za više od jednog mesta. fleg overflow je nedefinisan. Fleg carry ima vrednost poslednjeg bita istisnutog sa najmanje značajne pozicije. dst o M/? d - s M z M c M Pomera odredišni operand u desno za navedeni broj mesta (neposredni operand ili registar cl). Ukoliko se rotira za više od jednog mesta. ror cnt.

dst o 0 d - s M z M c 0 Vrši operaciju ekskluzivnog ILI između korespondentnih bita izvornog i odredišnog operanda i rezultat smešta u odredišni. edi+2 -> edi za d=0. zatečeni prenos se ne uzima u obzir. ali ne menja odredišni operand. xchg src. edi+1 -> edi za d=0. test src. xor src. Prilikom oduzimanja. ima sledeće dejstvo: stosb # al -> (edi). std Postavlja direction fleg na 1. odnosno edi-4 -> edi za d=1 Podrazumevani segmentni registar je es (es:edi). odnosno edi-2 -> edi za d=1 stosl # eax -> (edi). odnosno edi-1 -> edi za d=1 stosw # ax -> (edi). sub src.Pregled korišćenih naredbi Strana 59 stc Postavlja carry fleg na 1. dst o 0 d - s M z M c 0 Vrši operaciju logičkog I između korespondentnih bita izvornog i odredišnog operanda. . dst o M d - s M z M c M Oduzima izvorni operand od odredišnog i rezultat smešta u odredišni operand. stos o - d - s - z - c 1 o - d 1 s - z - c - o - d - s - z - c - U zavisnosti od veličine podrazumevanog operanda. edi+4 -> edi za d=0. Za detaljniji pregled naredbi procesora Intel 80386 čitalac se upućuje na knjigu Intel 80386 Programmer's Reference Manual. dst o - d - s - z - c - Zamenjuje vrednosti izvornog i odredišnog operanda. postavlja flegove u skladu sa tim.

(dot) 00101111 / (forward slash) 00110000 0 00110001 1 00110010 2 00110011 3 00110100 4 00110101 5 . (comma) 00101101 .(minus or dash) 00101110 .----00000000 NUL (Null char. ASCII tabela Decimal Octal ------.Dodaci Strana 60 12. Block) 00011000 CAN (Cancel) 00011001 EM (End of Medium) 00011010 SUB (Substitute) 00011011 ESC (Escape) 00011100 FS (File Separator) 00011101 GS (Group Separator) 00011110 RS (Request to Send)(Record Separator) 00011111 US (Unit Separator) 00100000 SP (Space) 00100001 ! (exclamation mark) 00100010 " (double quote) 00100011 # (number sign) 00100100 $ (dollar sign) 00100101 % (percent) 00100110 & (ampersand) 00100111 ' (single quote) 00101000 ( (left/opening parenthesis) 00101001 ) (right/closing parenthesis) 00101010 * (asterisk) 00101011 + (plus) 00101100 .----000 000 001 001 002 002 003 003 004 004 005 005 006 006 007 007 008 010 009 011 010 012 011 013 012 014 013 015 014 016 015 017 016 020 017 021 018 022 019 023 020 024 021 025 022 026 023 027 024 030 025 031 026 032 027 033 028 034 029 035 030 036 031 037 032 040 033 041 034 042 035 043 036 044 037 045 038 046 039 047 040 050 041 051 042 052 043 053 044 054 045 055 046 056 047 057 048 060 049 061 050 062 051 063 052 064 053 065 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 -----.1. Dodaci 12.) 00000001 SOH (Start of Header) 00000010 STX (Start of Text) 00000011 ETX (End of Text) 00000100 EOT (End of Transmission) 00000101 ENQ (Enquiry) 00000110 ACK (Acknowledgment) 00000111 BEL (Bell) 00001000 BS (Backspace) 00001001 HT (Horizontal Tab) 00001010 LF (Line Feed) 00001011 VT (Vertical Tab) 00001100 FF (Form Feed) 00001101 CR (Carriage Return) 00001110 SO (Shift Out) 00001111 SI (Shift In) 00010000 DLE (Data Link Escape) 00010001 DC1 (XON/Device Control 1) 00010010 DC2 (Device Control 2) 00010011 DC3 (XOFF/Device Control 3) 00010100 DC4 (Device Control 4) 00010101 NAK (Negative Acknowledgement) 00010110 SYN (Synchronous Idle) 00010111 ETB (End of Trans.

< = > ? @ 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) (underscore) .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 01000011 01000100 01000101 01000110 01000111 01001000 01001001 01001010 01001011 01001100 01001101 01001110 01001111 01010000 01010001 01010010 01010011 01010100 01010101 01010110 01010111 01011000 01011001 01011010 01011011 01011100 01011101 01011110 01011111 01100000 01100001 01100010 01100011 01100100 01100101 01100110 01100111 01101000 01101001 01101010 01101011 01101100 01101101 01101110 01101111 01110000 01110001 01110010 01110011 01110100 6 7 8 9 : .

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

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

................24 Slika 10: Algoritam za množenje pomoću sabiranja i pomeranja.....................ls 4 man 4 mkdir 5 mv 5 pajp 6 PATH 3 preusmeravanje U/I 6 prompt 2 pwd 4 rm 4 rmdir 5 set 5 shell 2 touch 5 unalias 6 skriptovi aritmetički izrazi 10 echo 8....................................................................................................................................................................... 7 Slika 3: Midnight Commander.............................................13 Slika 5: DDD dibager.................. 16 Slika 6: Algoritam za izračunavanje NZD: (a) pseudokod i (b) C kôd............... 11 exit 10 for 10 if 9 operatori 9 pozicioni parametri 9 promenljive 8 shift 9 skript 8 uslovi 9 while 11 zamena komandi 11 stek 29 Indeks slika Slika 1: Linux sa KDE okruženjem.............................................................................................. 29 Slika 13: C funkcija: (a) izvorni kôd i (b) izgled frejma nakon poziva funkcije............. 43 Slika 17: Paritet na najznačajnijem bitu.....................7 Slika 4: Osnovni registri procesora Intel 80386.................................................................................................4 Tabela 2: Operatori bash-a...............................................21 Slika 8: Naredbe za rotiranje: princip rada (a) i primer rotiranja za 1 mesto (b)..............................................26 .......................................... 44 Indeks tabela Tabela 1: Džoker znaci.................................................................................................. 10 Tabela 3: Pomeranje i rotiranje u dvostrukoj preciznosti............... 35 Slika 15: Konverzija iz internog formata u binarni znakovni format....................................40 Slika 16: Paritet.....................................................................................................................43 Slika 18: Vertikalni paritet....................................................22 Slika 9: Množenje pomoću sabiranja (a) i deljenje pomoću oduzimanja (b).............................................2 Slika 2: konqueror browser................................................................................................. 31 Slika 14: Konverzija znakovnog zapisa neoznačenog dekadnog broja u interni format...................... a pre izvršavanja njenog tela......................24 Slika 11: Algoritam za brojanje dana sa temperaturom u zadatim granicama................. 27 Slika 12: Izgled 80386 steka pre i posle operacije pushl $0...................................................... 18 Slika 7: Naredbe za pomeranje: princip rada (a) i primer pomeranja za 1 mesto (b).....................................

Sign up to vote on this title
UsefulNot useful