-
5-1
5.
NAINI ADRESIRANJA
Referenca operanda u instrukciji sadri ili stvarnu vrednost
operanda (neposrednu) ili
referencu na adresu operanda. U raznim skupovima instrukcija
koristi se irok spektar
razliitih naina adresiranja. Naini adresiranja obuhvataju
direktno (adresa operanda je u
polju adrese), indirektno (polje adrese pokazuje na lokaciju
koja sadri adresu operanda),
registarsko, registarsko indirektno i razne oblike adresiranja
sa pomerajem, u kojima se
vrednost u registru dodaje vrednosti adrese da bi se proizvela
adresa operanda.
Format instrukcije definie raspored polja u instrukciji. Dizajn
formata instrukcije je
sloen zadatak, koji obuhvata razmatranja kao to su duina
instrukcije, fiksna ili promenljiva
duina, broj bitova dodeljenih kodu operacije i svakoj referenci
operanda i kako se odreuje
nain adresiranja.
Adresno polje, ili polja, u tipinom formatu instrukcije su
relativno mala. eljeni cilj je
da se referencira irok opseg lokacija u glavnoj ili virtuelnoj
memoriji. Da bi se postigao taj
cilj, primenjuju se razne tehnike adresiranja. Sve one
podrazumevaju neki kompromis izmeu
opsega adresa, sa jedne strane, i/ili fleksibilnosti
izraunavanja adrese, sa druge strane.
Najzastupljenije tehnike adresiranja su:
- Neposredno,
- Memorijski direktno,
- Memorijski indirektno,
- Registarsko,
- Registarsko indirektno,
- Adresiranje sa pomerajem,
- Adresiranje pomou steka.
Ovi naini adresiranja su ilustrovani na slici 1. Notacija
podrazumeva sledee:
A sadraj polja adrese u instrukciji,
R sadraj polja adrese u instrukciji koji referencira (upuuje na)
registar
-
5-2
EA stvarna (efektivna) adresa lokacije koja sadri referencirani
operand,
(X) sadraj memorijske lokacije X ili registra X.
Slika 1. Naini adresiranja
U tabeli 1 su prikazani naini dobijanja adrese operanda za svaki
od naina adresiranja.
Tabela 1. Naini dobijanja adrese operanda za svaki od naina
adresiranja
Nain adresiranja
Algoritam Glavna
prednost
Glavni nedostatak
Neposredno Operand = A Nema reference
memorije
Ograniena veliina operanda
Memorijski
direktno
EA = A Jednostavno Ogranien adresni prostor
Memorijski
indirektno
EA = (A) Veliki adresni
prostor
Viestruke reference memorije
Registarsko
direktno
EA = R Nema reference
memorije
Ogranien adresni prostor
-
5-3
Registarsko
indirektno
EA = (R) Veliki adresni
prostor
Dodatna memorijska
referenca
Sa
pomerajem
EA = A + (R) Fleksibilnost Sloenost
Pomou steka
EA = vrh
steka
Nema reference
memorije
Ograniena primenljivost
Skoro sve arhitekture raunara obezbeuju vie od jednog od tih
naina adresiranja.
Postavlja se pitanje kako procesor moe da odredi koji nain
adresiranja se koristi u odreenoj
instrukciji. Preduzima se vie pristupa. esto e razliiti kodovi
operacije koristiti razliite
naina adresiranja. Takoe, jedan ili vie bitova u formatu
instrukcije mogu da se upotrebe
kao polje za nain adresiranja. Vrednost polja za nain
adresiranja odreuje koji se nain
koristi.
U sistemu bez virtuelne memorije, efektivna adresa e biti ili
adresa u glavnoj memoriji
ili registar. Stvarno preslikavanje na fiziku adresu je funkcija
mehanizma stranienja i
nevidljivo je za programera.
Nain adresiranja se moe specificirati kao poseban deo
instrukcije, u okviru koda
operacije, ili kao zasebno polje (slika 2). Takoe, veliina
prenosa (bajt, polure, re,) se
moe specificirati u instrukciji.
Slika 2. Specificiranje naina adresiranja kao dela
instrukcije
5.1 Neposredno adresiranje
Najjednostavniji oblik adresiranja je neposredno adresiranje, u
kome je vrednost
operanda prisutna u instrukciji (slika 3).
Operand = A
Slika 3. Neposredno adresiranje
Taj nain moe da se upotrebi da definie i koristi konstante ili
da postavlja poetne
vrednosti promenljivih. Tipino, broj e biti uskladiten u obliku
komplementa dvojke; krajnji
-
5-4
levi bit polja za operand se koristi kao bit predznaka. Kada se
operand uita u registar za
podatke, bit predznaka se proiruje nalevo do potpune veliine rei
podatka.
Primer.
Prednost neposrednog adresiranja je to nema drugih referenci
memorije sem donoenja
instrukcije koje se zahteva da bi se dobio operand, pa se prema
tome tedi jedan ciklus
memorije ili kea u ciklusu instrukcije. Nedostatak je to je
veliina broja ograniena
dimenzijom polja za adresu, koja je, u veini skupova
instrukcija, mala u poreenju sa
duinom rei.
5.2 Memorijski direktno adresiranje
Memorijski direktno adresiranje je veoma jednostavan oblik
adresiranja, u kome polje
za adresu sadri efektivnu adresu operanda (slika 4):
EA = A
Slika 4. Memorijski direktno adresiranje
-
5-5
Ta tehnika je bila uobiajena u ranijim generacijama raunara, ali
se ne sree esto u
savremenim arhitekturama. Zahteva samo jednu referencu memorije
i nema posebnih
izraunavanja. Oigledno ogranienje je to to obezbeuje samo
ogranien adresni prostor.
Primer.
5.3 Memorijski indirektno adresiranje
Kod memorijski direktnog adresiranja, duina polja za adrese je
obino manja od duine
rei, to ograniava adresni opseg. Jedno reenje je da se u
adresnom polju referencira na
adresu rei u memoriji, koja sa svoje strane sadri adresu
operanda potpune duine. To je
poznato kao memorijski indirektno adresiranje (slika 5):
EA = (A)
Slika 5. Memorijski indirektno adresiranje
-
5-6
Kao to je ranije definisano, zagrade se tumae kao znaenje
sadraja. Oigledna
prednost tog pristupa je da je sada, za duinu rei od N, na
raspolaganju prostor od 2N.
Nedostatak je to izvrenje instrukcije zahteva dve reference
memorije da bi se dobio
operand: jednu da se dobije njegova adresa i drugu da se dobije
njegova vrednost.
Mada je broj rei koje mogu da se adresiraju sada jednak 2N, broj
razliitih efektivnih
adresa koje mogu da se referenciraju u bilo kom trenutku je
ogranien na 2k gde je k duina
polja za adrese. Tipino, to nije toliko neugodno ogranienje kao
to bi se moglo pomisliti i
ak moe da bude prednost.
Retko koriena varijanta memorijski indirektnog adresiranja je
adresiranje u vie nivoa
ili kaskadno indirektno adresiranje:
EA = (...(A)...)
U tom sluaju, jedan od bitova adrese pune rei je indirektni
marker (I). Ako je bit I
jednak 0, onda re sadri EA. Ako je bit I jednak 1, onda se
poziva drugi nivo indirektnosti.
Izgleda da nema neke naroite prednosti tog pristupa, a njegov
nedostatak je to to bi se
zahtevalo tri ili vie memorijskih referenci da bi se dobio
operand.
5.4 Registarsko direktno adresiranje
Registarsko adresiranje je slino memorijski direktnom
adresiranju. Jedina razlika je to
to adresno polje referencira registar, a ne adresu u glavnoj
memoriji (slika 6):
EA = R
Slika 6. Registarsko direktno adresiranje
Radi razjanjenja, ako je sadraj registarskog adresnog polja u
instrukciji 5, onda je
registar R5 nameravana adresa, a vrednost operanda se nalazi u
R5. Tipino, adresno polje
koje referencira adrese imae od 3 do 5 bitova, tako da moe da se
referencira od 8 do 32
registra opte namene.
Prednosti registarskog adresiranja su to se (1) zahteva samo
malo adresno polje u
instrukciji i (2) to se ne zahtevaju nikakve memorijske
reference koje troe vreme. Vreme
pristupa memoriji za registar koji se nalazi unutar procesora je
mnogo manje od onoga za
-
5-7
pristup glavnoj memoriji. Nedostatak registarskog adresiranja je
to je adresni prostor veoma
ogranien.
Primer.
Ako se u skupu instrukcija mnogo koristi registarsko
adresiranje, to nagovetava da e
se mnogo koristiti registri procesora. Zbog strogog ogranienja
broja registara (u poreenju sa
lokacijama glavne memorije), njihova upotreba na taj nain ima
smisla samo ako se koriste
efikasno. Ako se svaki operand donosi u registar iz glavne
memorije, jednom izvri operacija
i zatim vraa u glavnu memoriju, tada se dodaje nepotreban
meukorak. Ako, umesto toga,
operand u registru ostaje u upotrebi za vie operacija, onda se
postie stvarna uteda. Primer
je meurezultat u proraunu. Posebno, pretpostavite da algoritam
za mnoenje u
komplementu dvojke treba da se implementira u softveru.
Na programeru je da odlui koje vrednosti bi trebalo da ostanu u
registrima, a koje bi
trebalo skladititi u glavnoj memoriji. Veina savremenih
procesora ima registre opte
namene, to teret efikasnog izvrenja prebacuje na programera u
asemblerskom jeziku
(odnosno, programera kompajlera).
5.5 Registarsko indirektno adresiranje
Ba kao to je registarsko direktno adresiranje analogno
memorijski direktnom
adresiranju, registarsko indirektno adresiranje je analogno
memorijski indirektnom
-
5-8
adresiranju. U oba sluaja, jedina razlika je da li adresno polje
referencira memorijsku
lokaciju ili registar. Prema tome, za registarsku indirektnu
adresu (slika 7),
EA = (R)
Slika 7. Registarsko indirektno adresiranje
Prednosti i ogranienja registarskog indirektnog adresiranja su u
osnovi ista kao za
indirektno adresiranje. U oba sluaja, ogranienje adresnog
prostora (ogranien opseg adresa)
polja za adrese prevazilazi se poljem kojim se obraa na lokaciju
duine rei u kojoj se nalazi
adresa. Pored toga, registarsko indirektno adresiranje koristi
jednu memorijsku referencu
manje od indirektnog adresiranja.
Primer.
-
5-9
5.6 Adresiranje sa pomerajem
Veoma moan nain adresiranja kombinuje sposobnosti direktnog i
registarskog indi-
rektnog adresiranja. On je poznat pod raznim nazivima koji
zavise od konteksta njegove
upotrebe, ali osnovni mehanizam je isti. Mi emo se na njega
pozivati kao na adresiranje sa
pomerajem (engl. displacement addressing, slika 8):
EA = A + (R)
Slika 8. Adresiranje sa pomerajem
Adresiranje sa pomerajem zahteva da instrukcija ima dva adresna
polja, od kojih je
najmanje jedno eksplicitno. Vrednost koja se sadri u jednom
adresnom polju (vrednost A)
koristi se direktno. Drugo adresno polje, ili implicitna
referenca zasnovana na kodu operacije,
odnosi se na registar iji sadraj se dodaje A da bi se proizvela
efektivna adresa.
Primer.
Opisaemo tri najee upotrebe adresiranja sa pomerajem:
- relativno adresiranje;
- adresiranje sa baznim registrom;
- indeksiranje.
Relativno adresiranje. Za relativno adresiranje, koje se takoe
zove i adresiranje relativno
prema PC, implicitno referencirani registar je programski broja
(PC). Odnosno, adresa
-
5-10
sledee instrukcije dodaje se adresnom polju da bi se proizvela
EA. Tipino, sa adresnim
poljem se za ovu operaciju postupa kao sa brojem u komplementu
dvojke. Prema tome,
efektivna adresa je pomeraj relativan u odnosu na adresu
instrukcije.
Relativno adresiranje koristi koncept lokalnosti. Ako je veina
referenci memorije
relativno bliska instrukciji koja se izvrava, onda upotreba
relativnog adresiranja tedi adresne
bitove u instrukciji.
Adresiranje sa baznim registrom. Za adresiranje sa baznim
registrom postoji sledee
tumaenje: referencirani registar sadri adresu u glavnoj
memoriji, a adresno polje sadri
pomeraj (obino u predstavljanju neoznaenog celog broja) od te
adrese. Referenca registra
moe biti eksplicitna ili implicitna.
Adresiranje sa osnovnim registrom takoe koristi lokalnost
memorijskih referenci. U
nekim implementacijama, koristi se jedan segmentni osnovni
registar da dri osnovnu adresu
segmenta, a instrukcije moraju eksplicitno da ga referenciraju.
U tom poslednjem sluaju, ako
je duina adresnog polja K, a broj moguih registara N, onda jedna
instrukcija moe da
referencira bilo koju od N oblasti od po 2K rei.
Indeksiranje. Za indeksiranje, tipino tumaenje je sledee:
adresno polje referencira adresu
u glavnoj memoriji, a referencirani registar sadri pozitivan
pomeraj od te adrese. Obratite
panju na to da je ta upotreba upravo suprotna od tumaenja za
adresiranje sa baznim
registrom. Naravno, to je vie nego samo stvar korisnikovog
tumaenja. Zbog toga to se
adresno polje smatra memorijskom adresom u indeksiranju, ono
obino sadri vie bitova od
adresnog polja u uporedivoj instrukciji sa osnovnim registrom.
Svejedno, metoda prorauna
EA je ista i za adresiranje sa osnovnim registrom i za
indeksiranje, a u oba sluaja referenca
registra je ponekad eksplicitna, a ponekad implicitna (za
razliite vrste procesora).
Slika 9. Primena indeksiranja u radu sa nizovima
-
5-11
Znaajna upotreba indeksiranja je da obezbedi efikasan mehanizam
za izvoenje
iterativnih operacija (slika 9). Razmotrite, na primer, listu
brojeva koji su uskladiteni poevi
od lokacije A. Pretpostavite da bismo eleli da dodamo 1 svakom
elementu na listi. Treba da
donesemo svaku vrednost, dodamo joj 1 i opet je uskladitimo
nazad. Sekvenca efektivnih
adresa koje su nam potrebne je A, A + 1, A + 2,..., sve do
poslednje lokacije na listi. Sa
indeksiranjem, to se lako uradi. Vrednost A se uskladiti u
adresno polje instrukcije, a
izabrani registar, koji se zove indeksni registar, inicijalizuje
se na 0. Posle svake operacije,
indeksni registar se poveava za 1.
Zbog toga to se indeksni registar obino koristi za takve
iterativne zadatke, tipino je
da postoji potreba za poveavanjem ili smanjivanjem indeksnog
registra posle svake reference
na njega. Imajui u vidu da je to esta operacija, neki sistemi je
rade automatski, kao deo istog
instrukcijskog ciklusa. To je poznato kao autoindeksiranje. Ako
su izvesni registri posveeni
iskljuivo indeksiranju, onda se autoindeksiranje moe pozvati
implicitno i automatski. Ako
se koriste registri opte namene, moe biti potrebno da se
operacija autoindeksiranja
signalizira pomou jednog bita u instrukciji. Autoindeksiranje
koje koristi poveavanje moe
da se opie na sledei nain:
EA = A + (R)
(R) (R) + 1
U nekim mainama, obezbeeni su i indirektno adresiranje i
indeksiranje, a mogue je
primeniti i oba u istoj instrukciji. Postoje dve mogunosti:
indeksiranje se izvodi pre ili posle
indirekcije.
Ako se indeksiranje izvodi posle indirekcije, to se zove
postindeksiranje:
EA = (A) + (R)
Prvo se koristi sadraj adresnog polja da bi se pristupilo
memorijskoj lokaciji koja
sadri direktnu adresu. Ta adresa se onda indeksira vrednou
registra. Ta tehnika je korisna
za pristupanje jednom od izvesnog broja blokova podataka fiksnog
formata. Operacije koje se
izvode su iste, bez obzira na to kojim blokom se manipulie.
Prema tome, adrese instrukcija
koje referenciraju blok bi mogle da pokau na lokaciju (vrednost
A) koja sadri promenljivi
pokaziva na poetak bloka za upravljanje procesom. Indeksni
registar sadri pomeraj unutar
bloka.
Kod preindeksiranja, indeksiranje se izvodi pre indirekcije:
EA = (A + (R))
Adresa se proraunava kao kod jednostavnog indeksiranja. Meutim,
u ovom sluaju,
izraunata adresa ne sadri operand, nego adresu operanda. Primer
upotrebe te tehnike je kada
-
5-12
se konstruie tabela grananja na vie putanja. U odreenoj taki u
programu, moe postojati
grananje na jednu od nekoliko lokacija, zavisno od uslova. Moe
da se uspostavi tabela koja
poinje na lokaciji A. Indeksiranjem u toj tabeli, moe da se
pronae zahtevana lokacija.
Skup instrukcija tipino ne sadri i preindeksiranje i
postindeksiranje.
5.7 Adresiranje pomou steka
Poslednji nain adresiranja koji razmatramo je adresiranje pomou
steka. Stek je
rezervisan blok lokacija. Stavke se dodaju na vrh steka tako da
je, u svakom datom trenutku,
blok delimino popunjen. Steku je pridruen pokaziva, ija vrednost
je adresa vrha steka.
Alternativno, dva gornja elementa steka mogu da budu u
registrima procesora, u kom sluaju
pokaziva steka referencira trei element steka. Pokaziva steka se
odrava u registru. Prema
tome, reference na lokacije steka u memoriji su, ustvari,
registarske indirektne adrese.
Nain adresiranja pomou steka je oblik implicitnog adresiranja.
Mainske instrukcije
ne ukljuuju memorijsku referencu, nego implicitno rade na vrhu
steka.
-
5-13
Zadatak 1. Na slici je prikazan sadraj registara procesora i
dela memorije neposredno pre
izvravanja neke instrukcije. Odrediti sadraj registara i
memorije posle sukcesivnog
izvravanja tri instrukcije. Instrukcije su jednoadresne i duine
dva bajta, gde prvi bajt
oznaava kod operacije i nain adresiranja, dok drugi bajt
predstavlja operand, osim
instrukcije POP koja je bezadresna i duine jedan bajt. Adrese i
operandi su osmobitni i
prikazani u heksadecimalnom formatu u komplementu dvojke.
Pokaziva steka SP pokazuje
na adresu memorijske lokacije koja se nalazi na vrhu steka.
itanjem podatka sa steka SP se
inkrementira, a upisom na stek SP se dekrementira.
Procesor
PC 4A
Acc 07
SP 8B
Instrukcija Komentar Sadraj registara procesora nakon
instrukcije
Sadraj memorije nakon instrukcije
POP (Acc) 1C (PC) = 4B (uveava se za jedan bajt)
(Acc) = 1C
(SP) = 8C
Isti
SUB #2F (Acc) (Acc) 2F = ED
(PC) = 4D (uveava se za dva bajta)
(Acc) = ED
(SP) = 8C
Isti
STORE [69] (Mem:69) =
(Acc) = ED
(PC) = 4F
(Acc) = ED
(SP) = 8C
Sadraj lokacije 69 je ED
Adresa Sadraj memorije
48 LOAD Memorijski indirektno
49 6A
4A POP Bezadresna
4B SUB Neposredno
4C 2F
4D STORE Memorijski direktno
4F 69
69 3F
6A 78
8B 1C
-
5-14
Zadatak 2. Na slici je prikazan sadraj registara procesora i
dela memorije neposredno pre
izvravanja neke instrukcije. Odrediti sadraj registara i
memorije posle sukcesivnog
izvravanja etiri instrukcije. Instrukcije su jednoadresne i
duine dva bajta, gde prvi bajt
oznaava kod operacije i nain adresiranja, dok drugi bajt
predstavlja operand, osim
instrukcija PUSH i POP koje su bezadresne i duine jedan bajt.
Adrese i operandi su
osmobitni i prikazani u heksadecimalnom formatu u komplementu
dvojke. Pokaziva steka
SP pokazuje na adresu memorijske lokacije koja se nalazi na vrhu
steka. itanjem podatka sa
steka SP se dekrementira, a upisom na stek SP se
inkrementira.
Procesor
PC 48
Acc 07
SP 8B
R1 A4
BR 69
Instrukcija Komentar Sadraj registara procesora nakon
instrukcije
Sadraj memorije nakon
instrukcije
LOAD [[6A]] (Acc) 25 (PC) = 4A (Acc) = 25
(SP) = 8B
Isti
ADD R1 (Acc) (Acc) + A4 = C9 (PC) = 4C (Acc) = C9
(SP) = 8B
Isti
PUSH (stek) (Acc) = C9 (PC) = 4D (Acc) = C9
Sadraj lokacije 8C je C9
Adresa Sadraj memorije
48 LOAD Memorijski indirektno
49 6A
4A ADD Registarsko direktno
4B R1
4C PUSH Bezadresna
4D STORE Bazno sa pomerajem
02
4F POP Bezadresna
69 3F
6A 78
6B 4C
78 25
8B 1C
8C 23
-
5-15
(SP) = 8C
STORE 02[BR] (Mem:69 + 02) = (Mem:6B) =
(Acc) = C9
(PC) = 4F
(Acc) = C9
(SP) = 8C
Sadraj lokacije 8C je C9
Sadraj lokacije 6B je C9