RACUNARI SA USKLADISTENIM PROGRAMOM (FON-NOJMANOVI RACUNARI)
============================================================

NAPOMENA: U nastavku je sazetak vezan za arhitekturu Fon-Nojmanovih
racunara. Za vise detalja procitati Dandamudi (str. 197-247),
Tanenbaum (str. 231-408) i Hamacher (str. 28-90 i 152-188).

*) Na nekom od prethodnih casova konstruisali smo model racunara sa
   fiksiranim programom. On se sastojao iz ALU jedinice (za
   izvrsavanje operacija), kontrolne jedinice (koja upravlja tokom
   izvrsavanja programa), memorije (koja sadrzi podatke nad kojima se
   vrse operacije) i odredjenog broja pomocnih registara (akumulator
   koji prihvata rezultat ALU jedinice, PSW registar koji cuva
   statusne flegove, P registar koji privremeno cuva jedan od
   operanada ALU jedinice, i td.).
   
*) Osnovni problem kod ovakvih racunara se sastojao u tome sto je
   program bio fiksiran, tj. bio je implementiran u hardveru,
   konfiguracijom konacnog automata kontrolne jedinice. Vrlo brzo se
   medju konstruktorima racunara javila ideja da program, kao i
   podaci, bude kodiran na binarnom jeziku (koji nazivamo masinski
   jezik) i da kao takav bude smesten u memoriju.  U tom slucaju bi
   kontrolna jedinica, umesto da izvrsava specifican algoritam, bila
   konfigurisana tako da implementira INTERPRETATOR masinskog
   jezika. Dakle, kontrolna jedinica i dalje u svom konacnom automatu
   implementira algoritam, ali ono sto taj algoritam radi je da
   ucitava instrukcije masinskog programa iz memorije, tumaci ih i
   izvrsava u ALU jedinici. Racunari koji funkcionisu na ovom principu
   nazivaju se RACUNARI SA USKLADISTENIM PROGRAMOM (engl. stored
   program computers). Ovakvi racunari su mnogo fleksibilniji, jer se
   sada programiranje vise ne svodi na rekonfiguraciju hardvera
   (redizajn automata konacne jedinice), vec na kodiranje programa na
   masinskom jeziku i smestanje istog u memoriju.

*) Postoje dva tipa racunara sa uskladistenim programom: Harvardski i
   fon-Nojmanovi racunari. Kod Harvardskog tipa racunara, postoje dve
   odvojene memorije (u dva razlicita adresna prostora): jedna za
   cuvanje podataka, a druga za cuvanje programa. Kod fon-Nojmanovog
   tipa, podaci i masinski program cuvaju se u istoj memoriji (samo na
   razlicitim adresama). fon-Nojmanov tip je dominantniji i gotovo svi
   savremeni racunari su fon-Nojmanovog tipa. Otuda cemo cesto
   fon-Nojmanove racunare koristiti kao sinonim za racunare sa
   uskladistenim programom.

*) Drugi problem na koji nailazimo je u komunikaciji sa memorijom. U
   nasem jednostavnom modelu, mi smo pretpostavljali da se citanje iz
   memorije i upis u memoriju moze obaviti u jednom ciklusu casovnika,
   te da ce podaci preko magistrale stici u istom ciklusu kada ih i
   zatrazimo. Tako nesto je realno samo za veoma male memorije (kao
   sto je bila memorija u nasem modelu, od 16 bajtova). Medjutim, tako
   male memorije nisu dovoljne za realizaciju iole slozenijeg
   algoritma koji koristi znacajno vise podataka. Sa druge strane,
   vece memorije su po pravilu mnogo sporije, te se brzina citanja i
   pisanja drasticno smanjuje. Realno je da kada od takve memorije
   zatrazimo podatak sa neke adrese, moramo da sacekamo nekoliko
   ciklusa casovnika pre nego sto taj podatak preko magistrale stigne
   do ALU jedinice. Otuda komunikacija i signalizacija preko
   magistrale postaje komplikovanija. 

*) Nakon sto smo memoriju ucinili vecom (samim tim i sporijom), nama
   ce i dalje potrebno da imamo na raspolaganju odredjeni memorijski
   prostor kome mozemo brzo pristupiti. Ovaj prostor se obicno
   obezbedjuje u vidu relativno malog broja registara koji su blizu
   ALU jedinice i pristupa im se veoma brzo. Ovi registri mogu cuvati
   podatke sa kojima se trenutno radi, kao i cuvati medjurezultate
   prilikom izracunavanja. U realnim racunarima, postoji citava
   HIJERARHIJA MEMORIJA, od onih koje su najblize procesoru (koje su
   najmanje, ali najbrze), do onih koje su najdalje od procesora (koje
   su najvece, ali najsporije).
   
*) Imajuci sve ovo u vidu, struktura racunarskog sistema se vremenom
   formirala na sledeci nacin. Na jednoj strani imamo komponente koje
   izvrsavaju program (kontrolna jedinica i ALU jedinica). Ove dve
   komponente, zajedno sa registrima cine CENTRALNU PROCESORSKU
   JEDINICU (engl. Central Processing Unit (CPU)), ili krace
   PROCESOR. Sa druge strane imamo OPERATIVNU MEMORIJU (danas poznatu
   i kao RAM, mada smo ranije diskutovali o tome koliko taj termin
   nije najsrecnije izabran). Procesor i memorija su povezani
   MEMORIJSKOM MAGISTRALOM koja se sastoji iz MAGISTRALE PODATAKA
   (preko koje se prenose podaci), ADRESNE MAGISTRALE (preko koje
   procesor memoriji salje adresu za citanje ili pisanje) i KONTROLNE
   MAGISTRALE (koja se sastoji iz kontrolnih linija kojima se prenose
   komande memoriji i primaju obavestenja od memorije o statusu
   zahtevane operacije).  Magistrala ima jasno definisan PROTOKOL koji
   odredjuje redosled slanja signala i nacin komunikacije izmedju
   uredjaja. (cpu_mem.png)

*) Registri procesora predstavljaju veoma brze memorijske elemente
   koji se smestaju uz ALU jedinicu procesora i omogucavaju veoma brzu
   isporuku podataka ALU jedinici i cuvanje rezultata. U pocetku,
   vecina registara su bili specijalne namene (poput programskog
   brojaca ili instrukcijskog registra), ali se vremenom pojavila
   potreba za vecim brojem registara opste namene u kojima se mogu
   cuvati podaci sa kojima procesor trenutno radi i/ili koje najcesce
   koristi. Registri opste namene predstavljaju malu i veoma brzu
   memoriju unutar samog procesora. Njihov broj nikada nije veliki
   (prvi procesori su imali samo akumulator kao registar opste namene,
   dok savremeni procesori mogu imati npr. 16, 32 ili vise registra
   opste namene). Veci broj registara opste namene znacajno povecava
   performanse procesora, jer omogucava programeru da podatke sa
   kojima najcesce radi drzi u registrima i brzo im pristupa (umesto
   da inicira veoma spore memorijske transfere).

*) Pored procesora i memorije, savremeni racunarski sistem sadrzi i
   ulazno izlazne (U/I) uredjaje koji omogucavaju komunikaciju
   racunara sa okolinom (covekom, drugim racunarima, spoljnim
   memorijama). Ulazno izlazni uredjaji se na racunarski sistem
   povezuju putem U/I kontrolera, cija je uloga da sakriju
   specificnosti samog uredjaja i omoguce jednostavniju komunikaciju
   sa procesorom. Ulazno-izlazni kontroleri u sebi sadrze izvestan
   broj registara pomocu kojih komuniciraju sa procesorom (u njih se
   smestaju podaci, komande, statusne poruke i sl.). Ulazno izlazni
   kontroleri se takodje povezuju na procesor preko magistrale. U
   najjednostavnijem modelu, postoji samo jedna magistrala
   (tzv. SISTEMSKA MAGISTRALA) na koju se povezuju svi uredjaji
   (procesor, memorija, U/I kontroleri). Pritom, preko magistrale se u
   jednom trenutku moze obavljati samo jedan transfer. Kako bi
   procesor mogao da razlikuje U/I kontrolere od memorije, registrima
   U/I kontrolera se moraju dodeliti posebne adrese koje su disjunktne
   sa opsegom adresa koje su dodeljene memorijskim lokacijama. Tu
   dolazimo do pojma ADRESNOG PROSTORA procesora.  Adresni prostor
   predstavlja celokupan opseg adresa koje procesor moze da koristi
   (tj. koje moze da postavi na adresnu magistralu). Npr. ako su
   adrese 32-bitne, tada procesor ima na raspolaganju opseg adresa od
   0 do 2^32 - 1 (4GB prostora). Svi uredjaji sa kojima procesor
   komunicira (memorija, U/I kontroleri, DMA kontroler, kontroler
   prekida,...) moraju se "mapirati" u taj adresni prostor, tj. moramo
   im dodeliti disjunktne opsege adresa iz tog adresnog opsega
   (memorija, po pravilu, zauzima najveci deo tog prostora). Procesor
   sada zadaje adresu, a uredjaj u cijem je opsegu ta adresa se
   prepoznaje i odgovara na zahtev procesora. Napomenimo da postoje i
   varijante u kojima procesor ima dva odvojena adresna prostora --
   jedan za memoriju, a jedan za U/I uredjaje. (computer.png)
   
*) Sada kada smo se upoznali sa osnovnom strukturom racunarskog
   sistema, potrebno je da razjasnimo dva veoma bitna pojma koja stoje
   u naslovu ovog predmeta: to su ARHITEKTURA i ORGANIZACIJA racunara.
   
*) ARHITEKTURA RACUNARA se odnosi na sve one aspekte dizajna racunara
   koji odredjuju programerski model, tj. sve one aspekte koji su od
   interesa za nekoga ko pise programe koji treba da se izvrsavaju na
   tom racunaru.  Ovo pre svega ukljucuje arhitekturu skupa
   instrukcija (engl. instruction set architecture (ISA)) u koju spada
   skup registara, skup instrukcija, formati instrukcija, nacini
   adresiranja operanada, velicina memorijskog prostora (virtuelnog i
   stvarnog), rezimi rada, sistem prekida i sl. Arhitektura racunara
   takodje odredjuje iz kojih se funkcionalnih jedinica racunar
   sastoji (procesor, memorija, magistrale, DMA kontroler, U/I
   uredjaji, i sl.), kako se te jedinice ponasaju (posmatrane kao crne
   kutije, bez ulazenja u nacin njihove implementacije) i na koji
   nacin se povezuju u racunarski sistem.

*) ORGANIZACIJA RACUNARA (ili MIKROARHITEKTURA) se odnosi na aspekte
   implementacije zadate arhitekture. Na primer, dizajn kontrolne ili
   ALU jedinice spada u organizaciju racunara. Takodje, nacin
   implementacije memorije, U/I kontrolera ili magistrale takodje
   spada u organizaciju racunara. Dakle, arhitektura posmatra
   funkcionalne celine racunara kao crne kutije, ne ulazi u nacin
   njihove implementacije, vec posmatra samo njihov interfejs ka
   ostalim komponentama, kako bi se te komponente mogle ugradjivati u
   racunarski sistem i mogle komunicirati sa ostatkom sistema, kao i
   na koji nacin se mogu koristiti. Kada se jednom definise
   arhitektura, prelazi se na razmatranje aspekata organizacije,
   tj. nacina implementacije zahtevanih funkcionalnosti definisanih
   arhitekturom.
   
*) U nastavku se bavimo arhitekturom procesora, tj. arhitekturom skupa
   instrukcija, kao najznacajnijim aspektom arhitekture racunara.

*) Masinski program se sastoji iz niza MASINSKIH INSTRUKCIJA. Svaka
   masinska instrukcija je niz bitova koji se strukturno moze podeliti
   na OPERACIONI KOD (kodira koju operaciju instrukcija kodira) i
   OPERANDE (kodira na koje podatke se primenjuje
   operacija). Instrukcija moze imati nula ili vise operanada, ali
   retko vise od 3.

        _____________________________
       | OP KOD | OPR1 | OPR2 | OPR3 |
        -----------------------------

   Prema vrsti, operandi mogu bit:
      *) REGISTARSKI (podatak se nalazi u registru procesora)
      *) MEMORIJSKI  (podatak se nalazi u memoriji racunara)
      *) NEPOSREDNI  (podatak se kodira kao deo same instrukcije)
   
   FORMAT INSTRUKCIJE odredjuje nacin kodiranja gornjih komponenti u
   binarnom obliku u masinskoj instrukciji (implicitno odredjuje i
   duzinu instrukcije).  Proces tumacenja binarnog koda masinske
   instrukcije (odredjivanje operacije koju treba izvrsiti kao i
   operanada koji se u operaciji koriste) naziva se DEKODIRANJE
   INSTRUKCIJE. Dekodiranje moze biti komplikovano ako imamo veliki
   broj razlicitih formata instrukcija.

*) VRSTE ARHITEKTURA (PREMA BROJU OPERANADA)

   Arhitekture se mogu klasifikovati prema maksimalnom broju operanada
   koje instrukcije mogu imati. U tom smislu, delimo ih na:
   
   1) TROADRESNI (odvojeni izvorisni i odredisni operandi)

      PRIMER: x = a*b + c*d

      mul t, a, b
      mul s, c, d
      add x, t, s

      (program zahteva 3*4=12 pristupa memoriji)
      (ako su t i s registri, tada imamo samo 8 pristupa)

      Savremene RISC arhitekture su tipicno troadresne. 
      
   2) DVOADRESNI (prvi operand je i odredisni)

      PRIMER: x = a*b + c*d (isti kao gore)

      mov t, a
      mul t, b
      mov s, c
      mul s, d
      mov x, t
      add x, s

      (program zahteva 3 + 4 + 3 + 4 + 3 + 4 = 21 pristupa memoriji)
      (ako su t i s registri, tada imamo samo 12 pristupa memoriji)

      Tipican predstavnik dvoadresne arhitekture je Intelova
      arhitektura.

   3) JEDNOADRESNI (postoji registar koji se zove akumulator)

      PRIMER: x = a*b + c*d (isti kao gore)

      load a
      mul b
      store t
      load c
      mul d
      add t
      store x

      (program zahteva 7*2 = 14 pristupa memoriji)

      Jednoadresni racunari su bili karakteristicni za neke ranije
      generacije racunara, dok su savremene arhitekture obicno
      dvoadresne ili troadresne.

   4) NULOADRESNI (postoji stek, a operandi su implicitni)

      push a
      push b
      mul
      push c
      push d
      mul
      add
      pop x

      (program zahteva 5*2 + 3 = 13 pristupa memoriji)

      Nuloadresne arhitekture se zovu i STEK MASINE. Primer stek
      masine je matematicki koprocesor Intel-ove arhitekture (poznat i
      kao x87).

PROBLEM: Kod dvoadresnih i troadresnih racunara instrukcije postaju
duze, ako koristimo memorijske operande, pa je za ucitavanje
instrukcija potrebno vise memorijskih pristupa.

RESENJE1: Ogranicavanje broja memorijskih operanada (Intelova
arhitektura dozvoljava najvise jedan memorijski operand u instrukciji)

RESENJE2: Postoje posebne instrukcije kojima se vrsi transfer podataka
izmedju memorije i procesora i ove instrukcije su jedine instrukcije
koje mogu imati memorijski operand. Ostale instrukcije
(npr. aritmeticko-logicke) imaju iskljucivo registarske operande.
Ovakve arhitekture zovemo Load-Store arhitekture.


*) NACINI ADRESIRANJA OPERANADA

   0) IMPLICITNO ADRESIRANJE 
      -) Instrukcija ne sadrzi u svom kodu nikakvu informaciju o lokaciji
         operanda, vec se operand nalazi na lokaciji koja je implicitno
	 odredjena (npr. uvek u istom registru).
	 
   1) REGISTARSKO ADRESIRANJE 
      -) Instrukcija sadrzi binarni kod registra procesora cija se vrednost
      	 koristi kao operand

   2) NEPOSREDNO ADRESIRANJE
      -) Instrukcija sadrzi binarni kod konstantne vrednosti koja se koristi
      	 kao operand
      -) Ne moraju sve konstante biti dozvoljene, kako bi se ustedelo na
      	 bitovima
	 
   3) DIREKTNO ADRESIRANJE
      -) Instrukcija sadrzi apsolutnu adresu memorijskog operanda
      
   4) RELATIVNO ADRESIRANJE
      -) Instrukcija sadrzi relativnu adresu operanda u odnosu na adresu tekuce
         instrukcije (tj. u odnosu na vrednost PC registra).
	 
   5) INDIREKTNO ADRESIRANJE
      -) Instrukcija sadrzi adresu na kojoj se nalazi adresa
         memorijskog operanda.
      -) Cesto, adresa ne mora biti u memoriji, vec u nekom od
         registara procesora.
      -) U tom slucaju, instrukcija sadrzi binarni kod registra
         procesora cija se vrednost koristi kao adresa memorijskog
         operanda.
      -) Ovakva varijanta indirektnog adresiranja se naziva i
         REGISTARSKO INDIREKTNO ADRESIRANJE. Ono je u savremenim
         racunarima mnogo cesce od klasicnog indirektnog adresiranja,
         jer je efikasnije (ne moramo ici u memoriju po adresu).
      -) Indirektno adresiranje je korisno kada adresa operanda nije
         fiksirana i poznata u fazi prevodjenja (npr, kod
         dereferenciranja pokazivaca, iteracije kroz niz, i sl.)
	 
   6) BAZA + POMERAJ
      -) Instrukcija sadrzi binarni kod registra procesora (BAZNOG REGISTRA)
         i binarni kod konstante (POMERAJ). Vrednost kodiranog registra se 
         sabira sa konstantom i tako se dobija adresa memorijskog operanda
      -) Korisno za pristup podacima na steku (pomeraj u odnosu na vrh steka)

   7) INDEKSNO ADRESIRANJE (BAZA + INDEKS)
      -) Instrukcija sadrzi binarne kodove dva registra cije se vrednosti
         sabiraju i tako dobijamo adresu memorijskog operanda
      -) Obicno je vrednost jednog registra fiksirana, a drugi predstavlja
         indeks koji se pomera
      -) Korisno za pristup elementima niza
      -) Vrednost indeksnog registra se moze mnoziti konstantom (npr. 2, 4
      	 ili 8) pre sabiranja sa baznim registrom. Ovo je SKALIRANO
	 INDEKSNO ADRESIRANJE.
      -) Bazna adresa ne mora biti u registru, vec moze biti zadata
         kao apsolutna adresa na koju se dodaje vrednost indeksnog
         registra (uz eventualno prethodno skaliranje). Ovo je
	 APSOLUTNO INDEKSNO ADRESIRANJE.

   8) BAZA + FAKTOR*INDEKS + POMERAJ
      -) Instrukcija sadrzi binarne kodove dva registra (baznog i
         indeksnog), kao i binarni kod konstante koja predstavlja
         pomeraj. Indeksni registar moze biti i skaliran. Adresa
	 se dobija tako sto se saberu vrednosti baznog i indeksnog
	 registra (uz eventualno skaliranje indeksnog registra) i
	 vrednosti pomeraja.	 
      -) Ovaj nacin adresiranje uopstava indeksno, baza + pomeraj,
         direktno i indirektno adresiranje.
  
*) Postoji vise TIPOVA INSTRUKCIJA, u zavisnosti od namene:

   1) INSTRUKCIJE TRANSFERA
      -) Kopiraju podatke sa jedne na drugu lokaciju (u procesoru ili memoriji)
      -) Ponekad postoje odvojene instrukcije za transfer izmedju registara,
         i za transfer izmedju procesora i memorije (tipicno za Load/Store
	 arhitekture)
      -) Instrukcije za rad sa stekom su poseban vid ovih instrukcija

   2) ARITMETICKO LOGICKE INSTRUKCIJE
      -) Sabiranje i oduzimanje
      -) Mnozenje (rezultat moze imati duplo vise bitova)
      -) Deljenje (daje kolicnik i ostatak)
      -) Poredjenje
      -) Bitovske instrukcije
      
   3) INSTRUKCIJE KONTROLE TOKA
      -) Bezuslovni skok
      -) Uslovni skokovi
      -) Pozivi procedura i vracanje iz njih

   4) SISTEMSKE INSTRUKCIJE
      -) Instrukcije za promenu rezima rada
      -) Instrukcije za promenu nivoa privilegija
      -) Instrukcije za izazivanje softverskih prekida
      -) ...

   5) ULAZNO/IZLAZNE INSTRUKCIJE

*) O POZIVANJU PROCEDURA I SISTEMSKOM STEKU

   -- Pretpostavimo da prilikom izvrsavanja programa funkcija f()
   poziva funkciju g(), koja dalje poziva funkciju h(). Poziv funkcije
   h() ce se zavrsiti pre poziva funkcije g(), a poziv funkcije g() ce
   se zavrsiti pre poziva funkcije f(). Drugim recima, funkcija koja
   je poslednja pozvana prva ce se zavrsiti. Kako se parametri
   funkcije i njene lokalne promenljive dealociraju prilikom izlaska
   iz funkcije, sledi da je potrebno najpre dealocirati podatke
   funkcije koja je poslednja pozvana (a koja ce se prva
   zavrsiti). Otuda se stek prirodno namece kao struktura koja ce se
   koristiti za cuvanje lokalnih promenljivih i parametara funkcija.

   -- Poziv funkcije je slican obicnom bezuslovnom skoku, s tom
   razlikom da se pre skoka mora zapamtiti adresa povratka (tj. adresa
   instrukcije koja sledi neposredno nakon instrukcije skoka). Kao sto
   je ranije opisano, uvek se najpre vracamo iz funkcije u koju smo
   poslednju usli, pa je otuda i za povratne adrese prirodno da se
   cuvaju na steku.

   -- Stek se po pravilu nalazi u operativnoj memoriji. Na primer, na
   Intel-ovim procesorima podrazumeva se da se stek nalazi na visokim
   adresama u RAM-u, kao i da raste ka nizim adresama.  Za rad sa
   stekom neophodno je znati gde se u memoriji u svakom trenutku
   nalazi vrh steka. U ovu svrhu se moze koristiti neki od registara
   procesora [vecina modernih procesora ima poseban registar koji
   sluzi specijalno za tu namenu, kao i posebne instrukcije poput PUSH
   i POP koje rade sa ovim registrom].

   -- Alternativa koriscenju steka prilikom prenosa argumenata i
   cuvanja povratne adrese je da se u tu svrhu koriste registri
   procesora. Prednost ovog pristupa je u brzini, jer se registri
   nalaze u procesoru, dok je stek u memoriji. Sa druge strane, ovakav
   pristup zahteva da procesor ima dovoljan broj registara [na primer,
   32-bitni Intel-ovi procesori su imali svega 8 registara opste
   namene, pa je takav pristup bio nepraktican; sa druge strane,
   64-bitni Intel-ovi procesori imaju 16 registara, sto daje prostora
   da se primeni ovakav pristup; slicna situacija je i sa npr. ARM
   procesorima]. Nedostatak ovog pristupa je u slucaju kada imamo vise
   funkcija u lancu pozivanja: s obzirom da su registri isti za sve
   funkcije, ako imamo lanac pozivanja f() -> g() -> h(), tada
   funkcija g() prilikom pozivanja funkcije h() mora koristiti iste
   registre za prenos argumenata i cuvanje adrese povratka koje je
   koristila i funkcija f() prilikom poziva funkcije g(). Otuda
   funkcija g() mora svoje argumente i povratnu adresu izmestiti na
   neko drugo bezbedno mesto (verovatno opet na stek) pre nego sto
   pozove funkciju h(). Ovim se proces svodi na ono sto bismo imali i
   da smo odmah koristili stek. Medjutim, ispostavi se u praksi da su
   vrlo ceste funkcije koje sasvim jednostavne i koje ne pozivaju ni
   jednu drugu funkciju. Zbog toga se u praksi prenosenjem argumenata
   preko registara dobija na efikasnosti i taj pristup se kod modernih
   racunara sa vecim brojem registara po pravilu i koristi.

*) O RISC I CISC ARHITEKTURAMA

   -- RISC (reduced instruction set computer) je naziv koji oznacava
   arhitekture ciji se skup instrukcija sastoji iz relativno malog
   broja krajnje jednostavnih instrukcija koje obavljaju samo osnovne
   jednostavne operacije. Od aritmeticko logickih instrukcija to su
   uglavnom instrukcije sabiranja i oduzimanja, ponekad i instrukcije
   mnozenja, zatim instrukcije pomeranja i bitovskih logickih
   operacija.  Slozenije aritmeticke operacije se moraju
   implementirati softverski, svodjenjem na ove jednostavnije. Za RISC
   arhitekture je takodje karakteristicno da imaju uniformisani format
   instrukcija, kao i veoma jednostavne nacine adresiranja operanada.
   Tipicno se realizuju kao Load-Store arhitekture, gde postoje posebne
   instrukcije za ucitavanje podataka iz memorije u registre, kao i za
   cuvanje vrednosti registara u memoriju, dok sve ostale instrukcije
   rade iskljucivo sa registarskim (ili neposrednim) operandima. RISC
   arhitekture takodje imaju veci broj registara opste namene.

   -- CISC (complex instruction set computer) je naziv koji oznacava
   arhitekture ciji skup instrukcija moze sadrzati i instrukcije koje
   obavljaju prilicno slozene operacije (poput korena, sinusa,
   logaritma, i sl.). Ove operacije zahtevaju izracunavanje u velikom
   broju ciklusa unutar samog procesora, svodjenjem na jednostavnije
   koje direktno podrzava ALU jedinica. Otuda je organizacija ovakvih
   procesora po pravilu mnogo slozenija. CISC procesori takodje
   podrzavaju veliki broj razlicitih formata instrukcija kao i veci
   broj slozenih nacina adresiranja. Ista instrukcija moze imati vise
   varijanti, u zavisnosti od tipa operanada (npr. instrukcija
   sabiranja moze imati dva registarska operanda, a moze imati i jedan
   registarski i jedan memorijski operand). Mogucnost aritmetickih
   instrukcija da koriste podatke direktno iz memorije je tipicna
   karakteristika CISC arhitektura. Tradicionalno, CISC arhitekture
   su imale relativno mali broj registara opste namene (mada se to
   u novije vreme promenilo). 

   -- RISC arhitekture imaju tendenciju da zahtevaju duze programe,
   jer programer mora da pomocu jednostavnih operacija koje procesor
   podrzava realizuje komplikovane algoritme. Sa druge strane kod CISC
   arhitektura programi su obicno kraci, jer za mnoge slozene
   operacije postoje instrukcije koje procesor direktno
   podrzava. Takodje, cinjenica da aritmeticke instrukcije kod CISC
   arhitektura mogu imati memorijske operande omogucava da se podaci u
   memoriji mogu direktno koristiti, umesto da se najpre ucitaju u
   registre procesora, kao sto je slucaj kod RISC arhitektura. Zbog
   svega ovoga, CISC arhitekture su bile veoma popularne tokom 60tih i
   70tih godina, kada su memorije bile relativno male pa je bilo bilo
   bitno da programi budu sto kraci. Takodje, u to vreme su memorijski
   transferi bilo mnogo skuplji, jer je jaz u brzini izmedju procesora
   i memorije bio mnogo veci. Zato je bilo potrebno imati sto manji
   broj instrukcija u programu koje mogu da rade slozene stvari.
   Pocev od 80tih godina RISC arhitekture postaju sve popularnije, jer
   se pomenuti problemi postepeno gube [memorije postaju sve vece,
   memorijski transferi zahvaljujuci brzim kes memorijama postaju sve
   brzi, a programski prevodioci postaju sve bolji kada je u pitanju
   optimizacija koda, tako da implementacija slozenih operacija u
   softveru vise ne zaostaje u efikasnosti znacajno u odnosu na
   hardversku realizaciju; takodje, moderni procesori imaju sve veci
   broj registara, sto je neophodno u realizaciji load-store
   arhitektura, kao i drugih svojstava koja su karakteristicna za RISC
   procesore]. Treba imati u vidu da jednostavnost RISC arhitektura
   omogucava jednostavnu implementaciju procesora, sto cini
   izvrsavanje instrukcija veoma brzim, a takodje olaksava realizaciju
   nekih naprednih tehnika paralelizacije pri izvrsavanju instrukcija
   (poput tehnike preklapanja, engl. pipelining). Sa druge strane,
   CISC arhitekture su glomaznije, pa se cak i jednostavne instrukcije
   na njima izvrsavaju nesto sporije nego kod RISC procesora. Kako ove
   jednostavne instrukcije dominiraju u vecini realnih programa, jasno
   je da ce efikasnost RISC arhitektura doci do izrazaja u vecini
   prakticnih aplikacija. 

   -- Tipican predstavnik CISC arhitekture je Intel. Tipican
   predstavnik RISC arhitekture je ARM.

*) U nastavku se bavimo aspektima organizacije procesora.
   
   
*) PUTANJA PODATAKA

    -- U organizacionom smislu, najjednostavniji procesor se sastoji 
    iz ALU jedinice, registara procesora, kontrolne jedinice, kao i 
    internih magistrala kojima se ove komponente medjusobno povezuju.
    Moderni procesori mogu sadrzati i druge komponente (memorijsku 
    jedinicu, kontroler memorije, kontroler magistrale, prediktor 
    grananja, i sl.), ali se mi time ovde necemo baviti. 
    
    -- Podaci se kroz procesor krecu izmedju registara i ALU jedinice,
    putem internih magistrala. Ovaj sklop se cesto oznacava
    terminom PUTANJA PODATAKA (engl.  datapath). Uloga putanje
    podataka je da omoguci izrsavanje elementarnih operacija koje
    hardver direktno podrzava. Te operacija ukljucuju transfer
    podataka izmedju registara, kao i aritmeticko-logicke operacije
    koje se izvrsavaju u ALU jedinici, a njihov rezultat pamti u
    odgovarajucem registru procesora. Ranije smo videli da se svaki
    algoritam moze svesti na niz ovakvih elementarnih operacija (pod
    uslovom da imamo dovoljno memorije, kao i da ALU jednica podrzava
    neki minimalni skup operacija, sto po pravilu jeste slucaj). 
    
    -- Kontrolu toka podataka na putanji podataka vrsi KONTROLNA
    JEDINICA (engl. control unit, CU), koja upravlja komponentama koje
    cine putanju podataka i na taj nacin odredjuje operacije koje ce
    se u okviru putanje podataka izvrsavati.
        
    -- Transfer podataka izmedju registara procesora (koji se nalaze u
    okviru putanje podataka) i lokacija izvan procesora (poput onih u
    operativnoj memoriji) se vrsi podsredstvom MAGISTRALA koje procesor
    povezuju sa drugim komponentama racunara. Ove magistrale koje se
    nalaze izvan procesora funkcionisu na dosta slozeniji nacin u
    odnosu na magistrale koje se nalaze unutar procesora i koje
    povezuju komponente procesora u okviru putanje podataka. Naime,
    kada se podatak prenosi izmedju registara unutar procesora ili se
    iz registra procesora prosledjuje ALU jedinici, tada se obicno
    moze pretpostaviti da se ovaj transfer moze obaviti u okviru
    jednog ciklusa casovnika, s obzirom da su ove komponente na veoma
    malim rastojanjima, kao i da su u pitanju prilicno homogene
    komponente, zasnovane na istoj tehnologiji, koje rade na istoj
    frekvenciji, imaju slicna kasnjenja, i sl. Sa druge strane, kada
    se transfer podataka obavlja izmedju procesora i neke udaljene
    komponente racunara (operativne memorije, ulazno izlaznog uredjaja, i
    sl.) tada se ne moze prosto postaviti podatak na magistralu i
    pretpostaviti da ce on stici na svoje odrediste u istom ciklusu
    casovnika.  Zbog toga je potrebno precizno definisati
    tzv. PROTOKOL MAGISTRALE, tj. skup pravila po kojima magistrala
    funkcionise, a sa kojim se moraju usaglasiti sve komponente koje u
    komunikaciji ucestvuju. Ova pravila definisu citav niz koraka koji
    je potrebno obaviti da bi se podatak uspesno preneo sa jedne
    lokacije na drugu putem te magistrale. O ovome cemo detaljnije
    govoriti u temi koja ce biti posvecena magistralama. Za sada treba
    reci da se putanja podataka koja se nalazi unutar procesora mora
    na neki nacin povezati sa spoljnim magistralama, kako bi se
    omogucila komunikacija izmedju komponenata procesora unutar
    putanje podataka sa komponentama racunarskog sistema koje su van
    procesora. U ovu svrhu procesor moze sadrzati razne interfejse ka
    razlicitim tipovima magistrala sa kojima se povezuje. U daljem
    tekstu mi cemo pretpostavljati da postoji samo jedna magistrala
    (tzv. sistemska magistrala) kao i da je interfejs procesora prema 
    njoj veoma jednostavan i sastoji se iz samo dva registra: MAR i MDR, 
    koji ce biti opisani u nastavku.
    
    -- Struktura putanje podataka moze biti razlicita, u zavisnosti od
    toga kako su komponente medjusobno povezane, kao i od broja
    internih magistrala koje su na raspolaganju. U prilogu uz ovaj
    fajl dati su primeri struktura putanja podataka sa jednom, dve i
    tri interne magistrale. Veci broj internih magistrala olaksava
    realizaciju operacija u okviru putanje podataka, jer je moguce
    vrsiti vise transfera u svakom ciklusu. Na primer, ako imamo tri
    magistrale podataka, tada se u slucaju binarnih operacija oba
    operanda mogu istovremeno dovesti na ulaze ALU jedinice (koristeci
    dve magistrale), a rezultat se u istom ciklusu moze dopremiti do
    svog odredista putem trece magistrale. To znaci da se citava
    operacija moze obaviti u jednom ciklusu. Ako imamo dve magistrale,
    tada se rezultat mora sacuvati u nekom pomocnom registru, a u
    odrediste se moze preneti tek u sledecim ciklusu, kada se
    magistrale oslobode. U slucaju jedne magistrale, bice potrebna dva
    pomocna registra -- jedan za rezultat, a drugi za jedan od
    operanda, buduci da se samo jedan od operanda u jednom trenutku
    moze pustiti na magistralu. Ovo znaci da ce nam za izvrsavanje
    binarne operacije biti potrebna tri ciklusa. Medjutim, realizacija
    putanje podataka sa vise magistrala je slozenija, jer je potrebno
    omoguciti veze registara sa vise magistrala. Ovo takodje povecava
    broj kontrolnih signala koje kontrolna jedinica mora da
    generise. Uprkos tome, moderni procesori obicno imaju veci broj
    internih magistrala i prilicno slozene putanje podataka (slozenije
    od ovih koje mi ovde prikazujemo).
   
*) INTERNI REGISTRI PROCESORA

   Pored registara opste namene koje poseduje svaki procesor i koji su
   deo arhitekture (u smislu da su vidljivi programeru i mogu se
   koristiti kao operandi instrukcija), procesori u okviru putanje
   podataka obicno sadrze i neke registre koji sluze za implementaciju
   internih funkcionalnosti procesora i nisu deo arhitekture (tj. nisu
   vidljivi za programera i ne mogu se kodirati kao operandi
   instrukcija). Neke najznacajnije opisujemo u nastavku:
   
   -- PC: programski brojac (ponekad je dostupan kao deo arhitekture):
      sadrzi memorijsku adresu instrukcije koja se trenutno
      izvrsava. Na ovaj nacin procesor zna "gde je stao" u izvrsavanju
      tekuceg programa koji se nalazi u memoriji. Ovaj registar se
      nakon zavrsetka tekuce instrukcije automatski uvecava za
      odgovarajuci broj bajtova (jednak velicini tekuce instrukcije)
      kako bi ukazivao na sledecu instrukciju u memoriji.
      
   -- IR: instrukcioni registar: sadrzi operacioni kod i ostale
      komponente instrukcije koje uticu na rad kontrolne jedinice. Ove
      komponente se dobijaju nakon dekodiranja ucitane instrukcije, a
      vrednost ovog registra se sprovodi na ulaz kontrolne jedinice,
      kako bi ona znala koje korake da sprovodi u nastavku (ovi koraci
      zavise od instrukcije koja se izvrsava).
      
   -- MAR: adresni registar: njegov izlaz je povezan na adresnu
      magistralu i sadrzi adresu memorijske lokacije cija se vrednost
      ocitava ili se u nju vrednost upisuje. Samim tim, svaki
      memorijski transfer pocinje upisom memorijske adrese u ovaj
      registar.
      
   -- MDR: prihvatni registar memorije: povezan je na magistralu
      podataka i preko njega se vrsi tranfer podataka izmedju
      procesora i memorije.
      
   -- PSW: statusni registar (engl. process status word): sadrzi
      FLEGOVE koji opisuju stanje rezultata prethodne
      instrukcije. Vrednost ovog registra izracunava se u ALU
      jedinici, a sprovodi se na ulaz kontrolne jedinice, s obzirom da
      status prethodne operacije moze uticati na sledece korake u
      izvrsavanju (npr. instrukcija uslovnog skoka moze da skoci ili
      da ne skoci, u zavisnosti od uslova koji je predstavljen stanjem
      flegova).
      
   -- CW: kontrolni registar: sadrzi FLEGOVE cijim postavljanjem
      odredjujemo buduce ponasanje procesora. Ponekad su PSW i CW
      objedinjeni u jedan registar (poput Intel-ovog EFLAGS registra)
      
*) FAZE IZVRSAVANJA INSTRUKCIJE

   Izvrsavanje svake masinske instrukcije sastoji se iz nekoliko faza
   koje se realizuju kroz stanja automata kontrolne jedinice. U svakoj
   od tih faza kontrolna jedinica generise odgovarajuce kontrolne
   signale kojima upravlja komponentama u okviru putanje podataka (kao
   i eksternim komponentama, poput memorije). Opis ovih faza sledi u
   nastavku:

   1) DOHVATANJE INSTRUKCIJE (FETCH): instrukcija se ucitava iz
   memorije sa adrese na koju ukazuje PC registar i prebacuje u MDR
   registar.  Postupak dohvatanja iz memorije se sastoji u tome da se
   u MAR registar prebaci vrednost PC registra (putem neke od internih
   magistrala procesora), nakon cega se izda komanda za citanje
   memoriji (tj. aktivira se odgovarajuci kontrolni signal kojim se od
   memorije zahteva da na magistralu podataka postavi vrednost sa
   trazene adrese). Nakon sto vrednost stigne preko magistrale
   podataka do MDR registra, ona se u njemu zapamti i time je
   dohvatanje zavrseno. Postupak dohvatanja moze zahtevati i vise
   ciklusa casovnika, ukoliko je memorija spora.

   2) DEKODIRANJE INSTRUKCIJE (DECODE): instrukcija se prebacuje u IR
   registar cija se vrednost salje na ulaze kontrolne jedinice. Kada
   vrednost IR registra dodje na ulaze kontrolne jedinice, na osnovu
   nje se usmerava dalji rad kontrolne jedinice. Faza dekodiranja je,
   u stvari, trenutak kada kontrolna jedinica utvrdjuje koju
   instrukciju zapravo izvrsava i koje korake treba da preduzme u
   nastavku. Ovi koraci zavise kako od same instrukcije, tako i od
   nacina adresiranja operanada, a informacije o tome su sadrzane u
   operacionom kodu instrukcije koji se sada nalazi u IR registru (i
   tu ostaje dokle god se ne zavrsi izvrsavanje instrukcije).

   U slucaju razlicitih formata instrukcije, u fazi dekodiranja se
   utvrdjuje o kom se formatu radi i po potrebi se ucitavaju ostali
   delovi instrukcije (u slucaju dugackih instrukcija).

   3) IZVRSAVANJE INSTRUKCIJE (EXECUTE): izvrsava se odgovarajuca
   operacija. Nacin izvrsavanja instrukcije zavisi od tipa
   instrukcije. Ova faza moze zahtevati vise ciklusa, ako je operacija
   slozena.  Ukoliko instrukcija sadrzi memorijske operande, u ovoj
   fazi se vrsi i dohvatanje operanada iz memorije (u nekim knjigama
   se ova faza izdvaja u posebnu fazu). Dohvatanje operanada se
   obavlja na slican nacin kao i dohvatanje same instrukcije (adresa
   operanda se prebacuje u MAR registar i zahteva se citanje iz
   memorije. Vrednost koja stigne preko magistrale podataka se smesta
   u MDR registar). U slucaju aritmeticko-logickih instrukcija,
   vrednosti operanada (nakon eventualnog dohvatanja iz memorije) se
   propustaju kroz ALU da bi se izracunao rezultat. Rezultat se obicno
   pamti u nekom privremenom registru. U slucaju instrukcije
   transfera, izvrsavanje zavisi od toga da li su operandi registri
   ili memorijski podaci. U slucaju transfera izmedju registara,
   vrednost izvorisnog registra se propusta kroz ALU bez ikakve
   operacije (no_operation) i prebacuje u odredisni registar. U
   slucaju transfera iz memorije u registar najpre se vrsi dohvatanje
   operanda u MDR, nakon cega se u sledecem koraku MDR prebacuje u
   odredisni registar. U slucaju transfera iz registra u memoriju,
   vrednost iz izvorisnog registra se kopira u MDR registar i vrsi se
   priprema za upis u memoriju (sledeca faza WRITE). U slucaju
   instrukcija skoka, izvrsavanje moze zavisiti od ispunjenosti uslova
   (kod uslovnih skokova): ukoliko stanje flegova ukazuje da je uslov
   ispunjen, vrsi se upis adrese na koju se skace u PC
   registar. Ukoliko uslov nije ispunjen, ne radi se nista.

   4) UPIS REZULTATA (WRITE): rezultat operacije se cuva na
   odgovarajucoj lokaciji. Odrediste rezultata moze biti registar ili
   memorija. Ako je odrediste memorija, tada je potrebno obaviti
   memorijski transfer. Ovo se radi tako sto se vrednost rezultata
   upisuje u MDR registar, a adresa odredista u MAR registar. Nakon
   toga se memoriji salje komanda za upis. Memorija preko magistrale
   podataka dobija podatak, a preko adresne magistrale adresu i vrsi
   upis datog podatka na datu adresu. Kod nekih instrukcija ova faza
   ne postoji (npr. instrukcija poredjenja, ili instrukcija skoka).

   U literaturi se ova faza cesto ne izdvaja kao posebna faza, vec
   se razmatra u sklopu EXECUTE faze.

   5) OBRADA PREKIDA (INTERRUPT): Proverava se da li je dosao neki
   spoljasnji signal za prekid, u kom slucaju treba sacuvati stanje
   procesora i pozvati odgovarajucu funkciju operativnog sistema za
   obradu prekida. O ovome cemo vise govoriti kasnije u toku semestra.


*) NACINI IMPLEMENTACIJE KONTROLNE JEDINICE
   ========================================

Postoje dva osnovna nacina realizacije kontrolne jedinice:   
   
1) TVRDO OZICENA IMPLEMENTACIJA (engl. hardwired control unit)

  -) Koristi se i termin "hardverska implementacija". 
  -) Dizajnira se sekvencijalno kolo koje funkcionise kao konacni
     automat.
  -) Na ulazu automata se nalazi vrednosti IR i PSW registara,
     dok se na izlazu nalazi skup kontrolnih signala koji se salju
     putanji podataka (datapath), memoriji, i ostalim delovima
     racunarskog sistema.   
  -) Stanja konacnog automata kontrolne jedinice odgovaraju fazama
      izvrsavanja instrukcije (FETCH, DECODE, EXECUTE, WRITE).   
  -) Mogu postojati i medjustanja u slucaju komplikovanih operacija.
     Na primer, u slucaju FETCH stanja neophodno je inicirati
     memorijski transfer. Komunikacija sa memorijom cesto zahteva vise
     koraka koji se realizuju prolaskom kroz vise stanja. Slicno, u
     slucaju slozenijih aritmeticko-logickih instrukcija cije operacije
     nisu direktno podrzane u ALU jedinici neophodno je svesti ih na
     vise jednostavnijih operacija, pa je faza izvrsenja slozenija i
     zahteva vise koraka [npr. ako se mnozenje svodi na uzastopne
     operacije sabiranja i pomeranja, kao kod Butovog algoritma].
  -) Pogodna za procesore sa jednostavnim skupom instrukcija (RISC).
  -) U slucaju velikog broja slozenih instrukcija postaje previse
     komplikovana (npr. kod CISC procesora).
  -) Losa strana: nema fleksibilnosti (u slucaju bilo kakvih promena
     u skupu instrukcija mora se celo kolo dizajnirati iz pocetka).
  -) Dobra strana: brzina

2) MIKROPROGRAMIRANA IMPLEMENTACIJA (engl. microprogrammed control unit)

   -) MIKROINSTRUKCIJA:

      --------------------------------------
      | KONTROLNI SIGNALI | ADRESNI BITOVI |
      --------------------------------------

   -) Kontrolna jedinica sadrzi memoriju koja se zove kontrolna
    memorija (engl. control store). Svaka adresibilna lokacija u ovoj
    memoriji sadrzi jednu mikroinstrukciju. Ova memorija je obicno ROM
    memorija, mada neki njeni delovi mogu biti i izmenjivi, sto
    omogucava nadogradnju mikrokoda procesora (ovo je slucaj sa
    modernim Intel-ovim i AMD-ovim procesorima).

   -) Svaka mikroinstrukcija se izvrsava u jednom ciklusu. Kontrolni
   signali iz mikroinstrukcije upravljaju komponentama racunarskog
   sistema u tom ciklusu.

   -) Adresni bitovi iz tekuce mikroinstrukcije se kombinuju na
    odgovarajuci nacin sa vrednoscu IR i PSW registra cime se dobija
    adresa sledece mikroinstrukcije u kontrolnoj memoriji.

                _____________________
    IR  ---->   |                    |
    PSw ---->   |  RACUNANJE ADRESE  | /____ ADRESNI BITOVI IZ MIR
                |____________________| \   |
                                           |
                        |    |             |
                        |    |             |
		        |    |             |
			\    /             |
			 \  /              |
                          \/               |
                 ____________________      |
		|                    |     |
		|     KONTROLNA      |     |
		|     MEMORIJA       |     |
		|____________________|     |
                                           |
                        |    |             |
			|    |             |
			|    |             |
			\    /             |
			 \  /              |
                          \/               |
                 _____________________     |
		|                     |  --|
		|       M I R         |  ---> KONTROLNI SIGNALI IZ MIR
		|_____________________|


   -) MIR registar (Micro Instruction Register) sadrzi tekucu
    mikroinstrukciju. Njegova vrednost se menja npr. na uzlaznoj ivici
    casovnika. Tokom trajanja ciklusa se na osnovu IR i PWD registara,
    kao i povratne sprege iz MIR-a (adresni bitovi mikroinstrukcije)
    racuna adresa sledece mikroinstrukcije. Pri sledecoj ulaznoj ivici
    ce se sledeca mikroinstrukcija ucitati u MIR registar.

   -) Kontrolna memorija, kao i kolo za racunanje adrese su
    kombinatorna kola (kontrolna memorija je ROM, a to je kombinatorno
    kolo). Sa druge strane, MIR je registar, tj. sekvencijalno kolo
    koje se sastoji iz flip-flopova i koje reaguje na casovnik.

   -) Niz mikroinstrukcija u kontrolnoj memoriji naziva se
    MIKROPROGRAM. Svakoj instrukciji obicno odgovara poseban
    mikroprogram u memoriji koji implementira funkcionalnost te
    instrukcije. Takodje, postoji poseban mikroprogram koji vrsi
    dohvatanje instrukcije i dekodiranje -- ovaj mikroprogram ne
    zavisi od instrukcije jer se uvek izvrsava na isti nacin (u
    trenutku kada instrukcija jos uvek nije ni ucitana, tj. nije
    dosla do IR registra). Slicno, postoje mikroprogrami za
    dohvatanje podatka, za upis podatka u memoriju, i sl.

   -) PSW registar takodje utice na adresu, tj. na izbor mikroprograma
    koji ce se izvrsavati, jer se pojedine instrukcije izvrsavaju
    drugacije u zavisnosti da li je neki uslov ispunjen ili ne
    (npr. instrukcije uslovnog skoka).

   -) Mikroprogramirana kontrolna jedinica omogucava da se dizajn
   kontrolne jedinice svede na programiranje (tj. mikroprogramiranje).
   Ovo dizajn cini jednostavnijim u slucaju slozenih skupova
   instrukcija (CISC). Takodje, mikroprogramirana kontrolna jedinica
   je fleksibilnija, jer se mnoge promene arhitekture (npr. dodavanje
   novih instrukcija, ispravljanje nekih gresaka) moze obaviti
   promenom mikroprograma.

   -) Losa strana: sporija od tvrdo-ozicene implementacije. 

   -) Mikroinstrukcije mogu imati HORIZONTALNU i VERTIKALNU strukturu.
   Kod HORIZONTALNE strukture svi kontolni signali postoje kao
   pojedinacni bitovi mikroinstrukcije i mogu se direktno usmeriti ka
   odgovarajucim komponentama procesora. Kod VERTIKALNE strukture
   ideja je da se duzina mikroinstrukcije smanji, kako bi se smanjila
   velicina kontrolne memorije i time realizacija ucinila jeftinijom.
   Ovo se radi tako sto se prepoznaju tipicne kombinacije bitova koje
   se javljaju u kontrolnim recima, koje se zatim kompaktnije
   kodiraju. Ovako kodirane mikroinstrukcije se moraju dekodirati na
   izlazu, pomocu dekodera, kako bi se dobile odgovarajuce
   "raspakovane" kontrolne reci. Ovaj proces dekodiranja donekle
   usporava rad kontrolne jedinice, ali je cini znatno jeftinijom.
   
   
PRIMER RACUNANJA ADRESE MIKROINSTRUKCIJE:

   Pretpostavimo da se mikroinstrukcija sastoji iz 36 bitova od kojih
   su visa 32 bita kontrolni signali, a niza 4 bita su adresni bitovi:

   -----------------------------------------
  |          CONTROL WORD        |  ADDR    |
   -----------------------------------------

  Pretpostavimo dalje da je IR registar 8-bitni, kao i da je PSW
  registar 4-bitni (flegovi OSZC). Neka je kontrolna memorija
  sastavljena iz 2^16 36-bitnih memorijskih lokacija od kojih svaka
  moze da cuva jednu mikroinstrukciju. Adresa svake mikroinstrukcije
  (koja je 16-bitna) se moze logicki podeliti na sledeci nacin:

   ----------------------------------------
  |      IR       |   PSW    |   ADDR      |
   ----------------------------------------

  U tom slucaju, kolo za racunanje adresa bi bilo veoma jednostavno:
  ono bi samo trebalo da slozi bitove na svojim ulazima na ovaj nacin.

  Posledica ovakvog nacina racunanja adrese mikroinstrukcije je da bi
  kontrolna memorija bila u tom slucaju bila logicki podeljena na
  blokove od po 16 susednih lokacija: bitovi IR i PSW bi odredjivali
  redni broj bloka, a bitovi ADDR bi odredjivali konkretnu lokaciju
  unutar bloka. Svaki takav blok bi odgovarao mikroprogramu za
  konkretnu instrukciju (odredjenu IR registrom) za konkretnu
  kombinaciju flegova (odredjenu PSW registrom). Sve sto bi
  mikroprogramer trebalo da uradi je da za svaku instrukciju i svaku
  kombinaciju flegova napise mikroprogram (ne duzi od 16
  mikroinstrukcija). Svaka mikroinstrukcija bi, pored kontrolnih
  signala koji se salju ostalim komponentama procesora, morala da
  sadrzi i redni broj sledece mikroinstrukcije unutar bloka (ADDR
  bitovi). Tipicno bi pocetak svakog bloka bio isti i odgovarao bi
  koracima dohvatanja instrukcije. Nakon sto se instrukcija dohvati i
  dekodira (stigne u IR registar), tog trenutka se IR ulaz u kontrolnu
  jedinicu menja, sto za posledicu ima "skok" iz tekuceg bloka
  kontrolne memorije u blok koji odgovara upravo dekodiranoj
  instrukciji (pri cemu bi mikrokod u tom novom bloku bio izvrsavan ne
  od pocetka, vec od lokacije odredjene ADDR bitovima, sto je upravo
  mikroinstrukcija nakon dekodiranja, tj. mikroinstrukcija kojom
  pocinje faza izvrsavanja instrukcije). Poslednja mikroinstrukcija u
  mikrokodu svake instrukcije bi u ADDR polju sadrzala 0000, sto znaci
  da bismo se vracali na pocetak bloka i zapoceli novo dohvatanje i
  dekodiranje instrukcije (koje bi nas bacilo u neki drugi blok
  kontrolne memorije, i td.).

  Ovakav nacin organizacije je veoma jednostavan, ali prilicno
  neefikasan u smislu upotrebe kontrolne memorije. Naime,
  mikroinstrukcije za dohvatanje i dekodiranje instrukcije (koje su
  uvek iste) bi se nepotrebno nalazile u svakom bloku kontrolne
  memorije. Takodje, za svaku instrukciju bismo imali 16 blokova u
  zavisnosti od stanja flegova, iako vecina instrukcija ne zavisi od
  flegova i uvek se izvrsavaju isto. To znaci da bi kod vecine
  instrukcija sadrzaj svih 16 blokova bio identican, sto je rasipanje
  skupe kontrolne memorije.

  Zbog toga se pribegava komplikovanijim nacinima izracunavanja
  adrese, sa ciljem da se mikroinstrukcije ne dupliraju, odnosno da
  postoji jedinstven mikroprogram za dohvatanje i dekodiranje, kao i
  da instrukcije koje ne zavise od flegova imaju samo jednu kopiju
  svog mikroprograma. Ovo komplikuje kolo za racunanje adresa, ali
  zato mnogo efikasnije koristi kontrolnu memoriju, sto je od
  izuzetnog znacaja. Primer realizacije jednog komplikovanog (ali
  mnogo efikasnijeg) kodiranja mikroadresa mozete pogledati u
  Tanenbaum-ovoj knjizi.