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.