You are on page 1of 37

INSTRUKCIJSKI SET

U ovom poglavlju obrađujemo centralnu temu o kompjuterskoj arhitekturi:


jezik razumljiv kompjuterskom hardveru, tzv. mašinski jezik. O mašinskom
jeziku se obićno govori u terminima njegovog assembly language-a, koji je
funkcionalni ekvivalent odgovarajućem mašinskom jeziku osim što
assembly language koristi intuitivnija imena kao što su: Add, r0, r2 koja su
lakše razumljiva i lakše se prepoznaju nego 0110101110010101.

Poćinjemo sa opisom The Instruction Set Architecture (ISA) po


pitanju mašine i njenih operacija. Ovaj aspekt ISA-e odgovara
assembly language-u / nivou mašinskog koda opisanog u primjeru
1-4: nalazi se između aspekta jezika visokog nivoa (high level
language view, gdje je malo ili nimalo mašinskog hardvera vidljivo
ili uzeto u obzir i kontrolni nivo (control level), gdje su mašinske
instrukcije predočene kao akcija prenosa registara (register transfer
actions) na nivo funkcionalne jedinice (functional unit level).
Da bi se opisala funkcija assembly jezika i programiranja u
assembly jeziku odabrali smo kao model arhirekturu ARC mašine,
koja predstavlja pojednostavljenu verziju komercijalne SPARC
arhitekture zajedničke za Sun kompjutere (dodatni modeli
arhirekture su obrađeni u izdanju - The Computer Architecture
Companion ).
Ovdje ilustriramo korisnost raznih klasa instrukcija sa praktičnim
primjerima programiranja u asemblerskom jeziku i završavamo sa
studijom slučaja Java bajtkodova kao primjerom uobičajenog,
prenosnog assembly jezika koji može biti implementiran
upotrebom "prirodnog" jezika druge mašine.

4.1. Hardverske komponente u ISA

ISA kompjutera predstavlja programer assembly jezika sa aspekta


mašine koja podrazumijeva sav hardver dostupan programeru, i
instrukcije kojima se manipuliše sa podacima unutar hardvera. U
ovom poglavlju posmatramo komponente hardvera sa aspekta
programera u assembly jeziku. Počinjemo sa razlaganjem sistema
kao cjeline: CPU koji interaktivno djeluje sa svojom internom
(glavnom) memorijom i izvedenim ulazom (input) i izlazom
(output) sa vanjskim svijetom.

4.1.1. Model sistemskog bus-a

Svrha bus-a je da smanji broj međuveza između CPU-a i njegovih


podsistema. CPU je povezan sa memorijom i I/O sistemima preko
zajedničkog bus-a. U kompleksnijim sistemima mogu postojati
odvojeni busevi između CPU-a i memorije i CPU-a i I/O-a.
Sve komponente nisu povezane sa sistemskim busom na isti način.
CPU generira adrese koje se smještaju na adresni bus i memorija
prima adrese sa adresnog bus-a. Memorija nikad ne generira adrese i
CPU nikad ne prima adrese, te tako i ne postoje odgovarajuće veze
u tim smjerovima.
U tipičnom scenariju korisnik piše program u programskom jeziku
visokog nivoa koji program za prevođenje prevodi u assembly jezik.
Asembler onda prevodi program assembly jezika u mašinski kod
koji je pohranjen na disk. Prije izvršenja program mašinskog koda je
prebačen sa diska u glavnu memoriju preko operativnog sistema.
Tokom programskog izvršenja, svaka je instrukcija unešena u ALU
iz memorije i to jedna po jedna, uporedo sa bilo kojim podatkom
koji je potreban radi izvršenja instrukcije.

2
Izlaz programa je smješten na uređaj kao što je video displej ili disk.
Svim ovim operacijama upravlja kontrolna jedinica. Komunikacija
između tri komponente (CPU, memorija i I/O) obavlja se preko bus-a.
Instrukcije se izvršavaju unutar ALU, iako su sve instrukcije inicijalno
pohranjene u memoriji. Ovo znači da se instrukcije i podaci moraju
prebaciti iz memorije u ALU registre i rezultati moraju biti pohranjeni
nazad u memoriju iz ALU registara.

4.1.2 Memorija

Kompjuterska memorija se sastoji od niza neprekidnih numerisanih


(adresiranih) registara od koji svaki od njih normalno nosi po jedan
BAJT - osam bita ( ponekad se označava kao oktet od strane
korisnika kompjutera naročito u oblasti kompjuterskih
komunikacija). Svaki registar ima adresu koja se naziva memorijska
lokacija. Nibble ili nybble kako se nekad piše, odnosi se na
kolekciju četiri "susjedna" bita. Značenje termina bit, bajt i nibble
su uopšteno dogovorena bez obzira na specifičnost arhitekture, ali
značenje riječi word ovisi od pojedinog procesora.
Tipične veličine riječi su 16,32,64,i 128 bita,sa 32-bita veličinom
riječi u sličnoj formi za obične kompjutere danas,i 64-bitnom riječi
čija popularnost raste.U ovim primjerima riječi će biti zamišljene
kao 32-bitne ,ukoliko nije drugačije naznačeno.Poredjenje ovih
tipova podataka prikazano je na slici 4-2 .
U byte-addressable mašini, najmanji objekt koji se može naći u
memoriji je bajt, međutim, obično se tu nalaze instrukcije koje
čitaju i pišu multi-bajt riječi. Multi-bajt riječi su pohranjene kao
sekvenca bajtova adresirana sa bajtom riječi koja ima najnižu
adresu. Većina mašina danas posjeduje instrukcije kojima su
dostupni bajtovi, riječi, poluriječi i duple riječi. Kad se koriste
multi-bajt riječi, postoje dva načina na koji će bajtovi biti pohranjeni
u memoriju: najznačajniji bajt na najnižoj adresi, koji se naziva big-
endian ili najmanje značajan bajt pohranjen na najnižoj adresi koji
se naziva little-endian. Termin "endian" (krajnji) dolazi od rasprave
da li jaja treba razbijati sa šire ili sa uže strane, što je uzrokovalo rat
od strane suprostavljenih političara u Guliverovim putovanjima.

3
Primjer formata big-endian i little-endian-a za riječ od četiri bajta,
32 bita je prikazana u primjeru 4-3.

4
Bajtovi u multi-bajt riječi su pohranjeni na redoslijednim adresama
kao što je prikazano u primjeru 4-3. U memoriji koja koristi bajtove
svaki bajt je dostupan putem svoje specifične adrese. Riječ od četiri
bajta je dostupna putem korištenja adrese bajta sa najnižom adresom
x u primjeru 4-3. Ovo je ispravno bez obzira na big-endian ili little-
endian. Pošto su adrese pobrojane po redu počinjući sa nulom,
najviša adresa je za jedan manja od veličine memorije. Najviša
adresa za 232 je 232 - 1. Najniža adresa je 0.

Primjer memorije koju ćemo koristiti za podsjetnik je prikazana u


primjeru 4-4. Ova memorija ima 32-bitni adresni prostor što znači
da su programu dostupni bajtovi memorije bilo gdje u opsegu od 0
do 232 - 1. Adresni prostor za naš primjer arhitekture je podijeljen
na odvojene regione koji se koriste za operativni sistem, input i
output (I/O), korisničke programe i sistemski stack, koji sadrže
memorijsku mapu, kao što je prikazano u primjeru 4-3.
Memorijska mapa se razlikuje od jedne implementacije do druge,
što je dijelom razlog zbog čega su programi koji su kompajlirani za
isti tip procesora, ne moraju biti kompatibilni kroz sisteme.

5
Niže 211 = 2048 adrese memorijske mape su rezervisane za upotrebu
od strane operativnog sistema. Korisnički prostor se nalazi tamo
gdje je pohranjen korisnički assembly program i može rasti tokom
operacije od lokacije 2048 sve dok se ne susretne sa sistemskim
stack-om. Sistemski stack počinje na lokaciji 231 - 4 i raste prema
nižim adresama. Dio prostora adrese između 2 31 i 232 - 1 je
rezervisano za I/O uređaje. Memorijska mapa se stoga ne sastoji u
potpunosti od realne memorije, i u stvari mogu postojati veliki
rascjepi (praznine) gdje ne postoji niti realna memorija niti I/O
uređaji.

Pošto se I/O uređaji tretiraju kao memorijske lokacije, mogu se


koristiti uobičajene memorijske komande za čitanje i pisanje na
uređajima za čitanje i pisanje. Ovo se naziva kao memorijski
mapirani I/O.

Važno je da se jasno odredi razlika između toga što je podatak, a što


je adresa. Adresa u ovom primjeru memorije je široka 32 bita, i riječ
je također široka 32 bita, ali one nisu jedno te isto. Adresa je
usmjerivač na memorijsku lokaciju koja sadrži podatke.

U ovom poglavlju predpostavljamo da je kompjuterska memorija


organizirana na području jedne adrese.
Termin prostor adrese se odnosi na numerički rang memorijskih
adresa na koje se može CPU odnositi. U poglavlju 7 (memorija),
vidjećemo da postoje drugi načini organiziranja memorije, ali za
sada, predpostavljamo da memorija kakvom je vidi CPU ima
jedinstven rang adresa. Šta odlučuje o veličini tog ranga? To je
veličina memorijske adrese koju CPU može smjestiti na bus adresa
(provodnik) tokom opreacija čitanja i pisanja. Memorijska adresa
čija je širina n -bita označava jedan od 2 n objekta. Pod ovom
adresom bi se moglo smatrati posjedovanje n-bit prostora adrese, ili
ekvivalentno posjedovanje (2n) bajt prostora adrese. Na primjer ,
mašina koja posjeduje 32-bit prostor adrese (adress space) imaće
maksimalni kapacitet od 232 ( 4 gb) memorije. Memorijske adrese će
biti rangirane od 0 do 232 - 1, što je 0 do 4,294,967,295 decimala, ili

6
na heksadecimalnom formatu jednostavnijem za upotrebu, od
00000000H do FFFFFFFFFH.
(H predstavlja heksadecimalni broj u mnogim assembly jezicima).

4.1.3. CPU

Pošto smo upoznali osnovne komponene sistemskog busa i


memorije, spremni smo da pogledamo u sadržaj CPU-a. U
najminimalnijem obliku, CPU se sastoji od sekcije podataka koja
sadrži registre i ALU, i kontrolne sekcije koja tumači instrukcije i
izvodi transfere registra, kao što je ilustrovano u primjeru 4-5. Pod
sekcijom podataka se također podrazumijeva put podataka (data
path).

Kontrolna jedinica kompjutera je odgovorna za izvršenje


programskih instrukcija, koje su pohranjene na glavnoj memoriji.
(Ovdje predpostavljamo da kontrolna jedinica tumači mašinske
kodove kao instrukcije jedan po jedan, iako ćemo u poglavlju 9
vidjeti da mnogi moderni procesori mogu obraditi nekoliko
instrukcija simultano).
Postoje dva registra koji formiraju interface između kontrolne
jedinice i jedinice podataka, poznati kao program counter (PC)
(programski brojač) i instrukcijski registar (IR). PC sadrži adresu
instrukcije koja se izvršava. Instrukcija koja je usmjerena od strane

7
PC je primljena u memoriju i pohranjena je u IR gdje se onda
tumači. Koraci koje kontrolna jeidnica provodi u izvršenju
programa jesu:

1) Prima slijedeću instrukciju koja se treba izvršiti iz memorije.


2) Dekodira operacioni kod.
3) Čita operande iz glavne memorije, ako ih ima.
4) Izvršava instrukcije i pohranjuje rezultate.
5) Vraća se na korak 1.

Ovo je poznato kao pripremno – izvršni ciklus.

Kontrolna jedinica je odgovorna za koordinaciju ovih različitih


jedinica u izvršenju kompjuterskog programa. Može se posmatrati
kao oblik "kompjutera unutar kompjutera" u smislu da donosi
odluke o tome kako će se ponašati ostali dijelovi mašine.
Datapath je napravljen od kolekcije registara poznati kao fajl
registar i aritmetička i logička jedinica (ALU), kao što je prikazano
u primjeru 4-6. Šema prikazuje datapath primjera procesora koji
ćemo koristiti u dljoj obradi.

Registarski fajl u primjeru može se posmatrati kao mala, brza


memorija, odvojena od sistemske memorije, koja se koristi za
privremeno pohranjivanje tokom obrade. Tipične veličine ze
registarski fajl kreću se od nekoliko do nekoliko hiljada registara.
Kao i sistemska memorija, svakom registru u registarskom fajlu se
dodjeljuje adresa u sekvenci počinjući od nule. Ove registarske
"adrese" su mnogo manje od adresa glavne memorije: registarski
fajl koji sadrži 32 registra bi na primjer imao samo 5-bit adresa.
Glavne razlike između registarskog fajla i sistemske memorije jeste
u tome da se registarski fajl nalazi unutar CPU, i stoga je mnogo
brži.
Instrukcija koja operira na podacima , često ima deset puta veću
brzinu nego ista instrukcija koja operira na podacima u memoriji.
Iz tog razloga, registar-intenzivni programi su brži od ekvivalentnih
memorijski intenzivnih programa (memory intensive program),

8
čak i ako je potrebno više registarskih operacija da se obave isti
zadaci koji bi zahtjevali manje operacija sa operandima lociranim u
memoriji.

Može se primjetiti da postoji nekoliko buseva unutar sekcije


podatak u primjeru 4-6. Tri busa povezuju sekciju podataka na
sistemski bus.
Ovo dozvoljava podacima da se mogu prenositi na i sa glavne
memorije i registarskog fajla. Tri dodatna busa povezuju registarski
fajl na ALU.
Ovi busevi omogućuju da dva operanda budu dostupna iz
registarskog fajla simultano, s kojima operira ALU, gdje se rezultati
vraćaju u registarski fajl.

ALU implementira raznolike binarne (dva operanda) i jedinične


(jedan operand) operacije.
Primjeri uključuju add, and, or, i multiply. Operacije i operandi koji
će se koristiti tokom operacija odabiraju se od strane kontrolne
jedinice.
Dva izvorna operanda se primaju sa registarskog fajla na buseve
labelirane kao "Register Source 1 (rs1)" i "Register Source 2 (rs2)".
Output sa ALU je smješten na bus labeliranu "Register Destination
(rd)", gdje se rezultati prenose nazad u registarski fajl. U većini
sistema ove veze također uključuju put (path) na Sistemski Bus tako
da memorija i uređaji mogu biti dostupni. Ovo je prikazano kao tri
veze labelirane "Sa busa podataka", "Prema busu podataka" i
"Prema busu adresa".

Instrukcijski set

Instrukcijski set je kolekcija instrukcija koje procesor može


izvršiti, i po svom efektu definira procesor. Instrukcijski setovi za
svaki tip procesora su u potpunosti različiti jedni od drugih.
Razlikuju se po veličini instrukcija, vrsti operacija koje omogućuju,

9
tipu operanda kojim operišu, i tipovima rezultata koje daju. Ova
nekompatibilnost instrukcijskih setova predstavlja oštar kontrast
kompatibilnosti jezika višeg nivoa kao što su C, Pascal i Ada.
Programi pisani u ovim jezicima višeg nivoa mogu djelovati skoro
nepromjenjeni na mnogo različitih procesora ako se re-
kompajliraju za ciljani porcesor.

(Jedan izuzetak kod ove nekompatibilnosti mašinskih jezika su


programi kompilirani u Java bajtkodove, koji su mašinski jezik za
virtualnu mašinu. Oni će djelovati nepromjenjeni na bilo kojem
procesoru koji posjeduje Java virtualnu mašinu. Java virtualna
mašina , pisana na assembly jeziku ciljanog procesora, presreće
svaki Java bajtkod i izvršava ga kao da je djelovao na Java hardveru
("stvarne") mašine. Vidi Studiju slučaja na kraju poglavlja radi više
podataka.)

Zbog ove nekompatibilnosti među instrukcijskih setova ,


kompjuterski sistemi se često indentificiraju od strane CPU-a koja je
inkorporirana u kompjuterski sistem. Instrukcijski set određuje
programe koje sistem može izvršiti i ima značajan uticaj na izvedbu.
Programi kompajlirani za IMB PC (ili kompatibilni) sistem koriste
instrukcijski set od 80x86 CPU, gdje je x zamjenjeno sa brojkom
koja odgovara verziji, kao što je 80586, češće poznat kao Pentium
procesor. Ovi programi neće djelovati na Macintoshu bez
ekstenzivnih modifikacija, zbog razlika u operacijskim sistemima i
I/O konvencijama.

Softver za generiranje programa mašinskih jezika

Kompajler je kompjuterski program koji prevodi program pisan na


jeziku visokog nivoa kao što je C, Pascal, ili Fortran, na mašinski
jezik. Kompajleri za isti jezik visokog nivoa uopšteno imaju isti
"prednji kraj", dio koji prepoznaje izjave u jeziku visokog nivoa.
Oni će imati različite "zadnje krajeve", za svaki ciljani procesor.
Kompajlerov zadnji kraj je odgovoran za generiranje mašinskog
koda za specifične ciljane procesore. Na drugoj strani, isti program,
kompajliran od strane različitih C kompajlera za istu mašinu može

10
proizvesti različite kompilirane programe za isti izvorni kod, kao što
ćemo vidjeti.

U procesu kompiliranja programa ( predstavljenog kao proces


prevođenja), izvorni program visokog nivoa (high leve source
program) je transformiran u assembly jezik i onda se assembly
jezik prevodi na mašinski kod za ciljanu mašinu od strane
asemblera. Ovi prevodi se odvijaju u compile vremenu i assembly
vremenu. Rezultirajući objektni program (resulting object program)
može biti povezan sa drugim objektnim programima u link
vremenu. Povezani program, obično pohranjen na disku, je unešen
u glavnu memoriju u load vremenu, i izvršen od strane CPU-a u
run vremenu.

Iako je većina kodova pisana na jezicima visokog nivoa, programeri


mogu koristiti assembly jezik za programe ili fragmente programa
koji su kritični po pitanju vremena ili prostora.U prilog tome,
kompajleri možda neće biti dostupni za neke procesore sa
specifičnom svrhom, ili njihovi kompajleri mogu biti ne adekvatni
za izražavanje specijalnih operacija koje se zahtjevaju. U ovim
slučajevima također, programer će možda trebati da resortira na
programiranje u assembly jeziku.

Jezici visokog nivoa omogućuju nam da ignorišemo ciljanu


kompjutersku arhitekturu tokom kodiranja. Na nivou mašinskog
jezika, međutim, osnovna (underlying) arhitektura zauzima
primarno mjesto. Program pisan na jeziku visokog nivoa kao što je
naprimjer C, Pascal ili Fortran mogu izgledati isto i izvršavati
funkcije ispravno nakon kompilacije na nekoliko različitih
kompjuterskih sistema. Objektni kod koji kompajler proizvodi za
svaku mašinu, međutim, može biti veoma različit za svaki
kompjuterski sistem, čak i ako sistemi koriste isti instrukcijski set,
kao što su programi kompajlirani za Power PC ali koji djeluju na
Macintoshu nasuprot onome što djeluje na IMB RS6000.

11
Nakon što smo objasnili sistemski bus, glavnu memoriju, i CPU,
sad ćemo pregledati detalje modela instrukcijskog seta, ARC-a.

4.2 ARC, (RISC kompjuter)

U ostatku ovog poglavlja, prostudiraćemo model arhitekture koji je


zasnovan na komercijalnom Scalable Processor Architecture
(SPARC) procesoru koji je razvijen u Sun mikrosistemima
sredinom osamdesetih. SPARC je postao popularna arhitektura od
svojeg uvođenja, je dijelom zbog svoje otvorene prirode: puna
definicija SPARC arhitekture je spremno predstavljena kao
dostupna javnosti (SPARC, 1992).
U ovom poglavlju, pogledaćemo samo subset SPARC_a koji
nazivamo A RISC Computer (ARC). "RISC" je još jedan akronim ,
za reducirani instrukcijski set kompjutera, o kojem se govori u
poglavlju 9. ARC ima većinu važnih odlika SPARC arhitekture, ali
bez nekih kompleksnijih odlika koje su prisutne u komercijalnom
procesoru.

4.2.1 ARC memorija

ARC je 32-bit mašina sa memorijom bajt adresa: može manipulirati


sa 32-bit tipovima podataka, ali su svi podaci pohranjeni u memoriji
kao bajtovi,
i adresa 32-bit riječi je adresa njenog bajta koji ima najnižu adresu.
Kao što je opisano ranije u poglavlju u kontekstu primjera 4-4, ARC
ima prostor 32-bit adresa, u kojem je naš primjer arhitekture
podijeljen na izdvojene regije za upotrebu od strane operirajućeg
sistemskog koda, koda korisničkog programa, sistemskog zbirnika
(system stack) (korištenog za pohranjivanje privremenih podatak), i
input i autput, I/O.
Ovi memorijski regioni su pojašnjeni kako slijedi:

 najniže 211= 2048 adrese memorijske mape su rezervisane za


upotrebu od strane operativnog sistema

12
 Korisnički prostor je gdje je unešen program asembliran od
strane korisnika, i može rasti tokom operacije od lokacije 2048
dok se ne sretne sa sistemskim spremnikom.
 Sistemski spremnik počinje na lokaciji 231-4 i raste prema nižim
adresama. Razlog za ovakvu organizaciju programa koji rastu
prema gore ka memoriji i sistemskih spremnika koji rastu prema
dole može se vidjeti u primjeru 4-4: olakšava djelovanje i velikih
programa sa malim spremnicima i malim programima sa velikim
spremnicima.
 Dio prostora adresa između 231 i 232 je rezerviran za I/O uređaje-
svaki uređaj ima kolekciju memorijskih adresa gdje su njegovi
podaci pohranjeni, koji se maziva "memory mapped I/O"
(memorijski mapiran I/O).

ARC ima nekoliko tipova podatak (bajt, poluriječ, integrer, itd.) ali
sad ćemo uzeti u obzir samo 32-bit integrer tip podataka. Svaki
integrer je pohranjen u memoriji kao kolekcija četiri bajta. ARC je
big-endian arhitektura, tako da je bajt najvišeg reda pohranjen na
najnižoj adresi. Najveća moguća bajt adresa u ARC-u je 2 32-1, tako
da je adresa najviše riječi u memorijskoj mapi tri bajta niža od ove,
ili 232-4.

4.2.2 ARC instrukcijski set

Pošto sve detaljnije objašnjavamo ARC instrukcijski set, mogli bi


početi sa jednim pregledom CPU-a:
* ARC ima 32 (registre opšte namjene, kao i PC i IR.
* Tu je i Processor Status Register (PSR) koji sadrži informacije o
stanju procesora, uključujući i informacije o rezultatima
aritmetičkih operacija. "Aritmetičkim flags" u PSR se nazivaju
kodovi stanja (condition codes). Oni određuju da li je određena
aritmetička operacija rezultirala nulom (z), negativnom vrijednošću
(n), izvodom iz 32-bit ALU-a ( c), Ili prelivanjem overflow (v). V
bit se dobije kad su rezultati aritmetičkih operacija preveliki da bi ih
ALU mogao koristiti.

13
* Sve instrukcije su u veličini jedne riječi (32 bita).
* ARC je load-store mašina (unošenje-pohranjivanje), jedini
dostupni pristup memorije ka operacijama (allowable memory
access operations) sprema vrijednost na jedan od registara, ili
pohranjuje vrijednost sadržanu u jednom od registara u memorijskoj
lokaciji. Sve aritmetičke operacije operišu na vrijednostima koje se
nalaze u registrima, i rezultati se smještaju na registar. Postoji od
prilike 200 instrukcija u SPARC instrukcijskom setu, na osnovu
kojih se ARC instrukcijski set zasniva. Subset 15 instrukcija je
prikazan u primjeru 4-7. Svaka je instrukcija predstavljena sa
mnemoničkom, sto je ime koje predstavlja instrukciju.

Instrukcije za prenošenje podataka

Prve dvije instrukcije: ld (load) i st (store) prenose riječ između


glavne memorije i jednog od ARC registara. Ovo su jedine
instrukcije koje mogu ući u memoriju u ARC.

Sethi instrukcija postavlja 22 najznačajnija bita (MSBs) registra sa


22 bita konstantno sadržana unutar instrukcije. Obično se koristi za

14
konstruiranje arbitrarne 32-bit konstante u registru, u konjukciji sa
drugom instrukcijom koja postavlja 10 bita niskog reda u registru.

Primjer 4-7 Subset instrukcijskog seta za ARC ISA.

1. ld napuni registar iz memorije


2. st pohrani registar u memoriju
3. sethi napuni 22 najznačajnija bita memorije
4. andcc bitwisc logical AND
5. orcc bitwisc logical OR
6. orncc bitwisc logical NOR
7. arl Proslijedi desno (logički)
8. addcc dodaj
9. call zovi subrutinu
10. jmpl jump and link ( povrat iz poziva subrutine)
11. be ogranak ako jednako
12. bneg ogranak ako negativno
13. bca ogranak na prenosu (on carry)
14. bva ogranak na prelivu (overflow)
15. ba Ogranak uvijek

Aritmetičke i logičke instrukcije

Andcc, orcc i orncc instrukcije izvode bit-by-bit AND, OR i NOR


operacije, ovisno o njihovim operandima. Jedan od dva izvorna
operanda mora biti u registru. Drugi može biti ili u registru, ili može
biti 13-bit druga dopunska konstanta koja se sadrži u instrukciji,
koja je znakovno proširena na 32-bita kad je u upotrebi. Rezultat je
pohranjen u registru.

Za andcc instrukciju, svaki bit rezultata je određen na 1 ako su oba


odgovarajuća bita oba operanda 1, inače je odgovarajući bit

15
rezultata određen na 0. Orcc operacija je nadopuna orcc-a, tako da
svaki bit rezultata je 0 ako su ijedan od bitova odgovarajućih
operanda 1, inače je bit rezultata određen na 1. "cc" sufiksi određuju
da nakon izvođenja operacije, da se bitovi koda stanja u PRS
reviziraju da bi očitovali rezultate operacije. Posebno, z bit je
određen ako rezultirajućiregistar sadrži sve nule, n bit je određen
ako je najznačajniji bit rezultirajućeg registra 1, i c i v zastave su
razjašnjene za ove određene insrukcije.

Shift instrukcije šalju sadržaje iz jednog registra u drugi. Srl (shift


right logical) instrukcija šalje registar na desno, i kopira nule u
lijeve bitove. Sra (shift right arithmetic) instrukcija (nije prikazana),
šalje originalne sadržaje registra na desno smještajući kopiju MSB-a
originalnog registra na novo stvorene slobodne bitove ili bit na
desnoj strani registra. Ovo rezultira u znakovnom proširivanju broja,
i s time čuva svoj aritmetički znak.

Adcc instrukcija izvodi 32-bit drugi komplementarni prilog na


svojim operandima.

Kontrolne instrukcije

Call i jmpl instrukcije formiraju par koji se koristi za poziv i


vraćanje iz subrutine, ovisno o slučaju. Jmpl se također koristi radi
prenosa kontrole u drugi dio programa.
Nižih pet instrukcija se zovu instrukcije Uslovnih ogranaka
(conditional branch instructions). Be, bneg, bcs, bvs, i ba
instrukcije stvaraju ogranak pri izvršenju programa. Nazivaju se
uslovni jer testiraju jedan ili više bitova koda stanja u PSR, te ako
bitovi indiciraju stanje susreće se ogranak. Koriste se u
implementiranju konstrukata visokog nivoa kao što su goto, if-then-
else i do-while. Detaljni opisi ovih instrukcija i primjera njihove
upotrebe su dati u slijedećim pasusima.

4.2.3 ARC assembly language format

16
Svaki assembly jezik ima svoju sintaksu. Pratićemo SPARC
assembly language sintaksu, kako je prikazano u primjeru 4-8.

Format se sastoji od četiri polja: optional label field ( polja za


opcionalno labeliranje, opcode field (opkod polja)jednog od više
polja koja određuju izvorne i odredišne operande (ako ima
operanada), i optional comment field (polje opcionalnog
komentara). Label (oznaka) se sastoji od bilo koje kombinacije
alfabetskih ili numeričkih znakova, podlinija (_), znakova dolara, ili
znakova tačaka (.), sve dok prva oznaka ne bude broj. Oznaka mora
biti praćena dvotačkom. Jezik je osjetljiv na slučaj, jer se na taj
način pravi razlika između viših i nižih slova slučaja. Jezik je
"slobodni format" u smislu da bilo koje polje može započeti u bilo
kojoj koloni, ali relativno lijevo-na-desno određivanje se mora
održavati.

ARC arhitektura sadrži 32 registra označenih %r0 - %r31, koji nose


32- bit riječ. Tu je također i 32-bit Processor State Register (PSR)
koji opisuje trenutno stanje procesora, i 32-bit Program Counter
(PC), koji vodi evidenciju izvršenih instrukcija kao što je prikazano
u primjeru 4-9.

17
PSR je označenb %psr. I PC Registar je oznacen %pc.Registar %r0
uvijek sadrži vrijednost 0, koja ne može biti promijenjena. Registri
%r14 i %r15 imaju dodatnu upotrebu kao pokazivač na stack (stack
pointer) (%sp) i link register (registar veza), ovisno o slučaju.

Operandi u assembly language iskazima razdvojeni su zarezima, i


odredišni operand se uvijek pojavljuje na desnoj poziciji u polju
operanada . Stoga, primjer 4-8 specifikuje dodatne registre %r1 i
%r2, sa rezultatom smještenim u %r3. Ako se %r0 pojavi u polju
odredišnog operanda umjesto %r3, rezultat se odbacuje. Default
baza za numerički operand je 10, tako da assembly language iskaz :
addcc %r1, 12, %r3
prikazuje operand od (12)10 koji će biti dodan na %r1, sa rezultatom
smještenim u %r3. Brojevi su na bazi 10 osim ako im ne predhodi
"0x" ili završavaju na "H"., koji označavaju heksadecimalni broj.
Polje komentara slijedi polje operanda i počinje sa znakom
uskličnika "!" i završava na kraju linije.

4.2.4 ARC instrukcijski formati

Instrukcijski format određuje kako su razna polja bitova instrukcije


formirani od strane asemblera, i kako su protumačeni od strane
ARC kontrolne jedinice. ARC arhitektura ima samo nekoliko
instrukcijskih formata. Pet formata su: SETHI, Branch, Call,
Arithmetic, i Memory, kako je prikazano u primjeru 4-10.

18
Svaka instrukcija ima mnemoničku formu kao što je "ld", i opkod.
Određeni instrukcijski format može imati više od jednog opkod
polja, koje kolektivno identificiraju instrukciju u jednoj od raznih
formi.
Dva lijeva bita svake instrukcije iz op polja (opcode), su ta koja
identificiraju format. SETHI i Branch formati oba sadrže 00 u op
polju, te se zajedno mogu posmatrati kao SETHI/Branch format.
Stvarni SETHI ili Branch format je određen uzorkom bita u op2
opcode polju
(010 = Branch; = SETHI). Bit 29 u Branch formatu uvijek sadrži
nulu. Pet-bitno rd polje identificira ciljani registar za SETHI
operaciju.

19
Cond polje identificira tip ogranke, na osnovu bitova koda stanja
(condition code bit) (n, z, v, i c) u PSR, kako je indicirano u dnu
primjera 4-10. Rezultat izvršenja instrukcije u kojoj mnemonic
završava sa "cc" postavlja bitove kodova stanja kao što su u n=1 ako
je rezultat operacije negativan; z=1 ako je rezultat nula; v=1 ako
operacija uzrokuje prelivanje (overflow); I c=1 ako operacija
proizvede prenos (carry).
Instrukcije koje ne završavaju na "cc" ne utiču na kodove stanja.
Imm22 i disp22 polja oba sadrže 22-bitnu konstantu koja se koristi
kao operand za SETHI format (za imm22) ili za izračunavanje
promijenjenog rasporeda (displacement) adresa ogranaka (za
disp22).

CALL format sadrži samo dva polja; op polje koje sadrži uzorak
bita 01, I disp30 polje, koje sadrži 30-bitni promijenjeni raspored
koji se koristi u izračunavanju adrese pozvane rutine.

Aritmetički (op=10) i memorijski (op= 11) formati koriste rd polja


bilo da bi identificirali izvorni registar za st, ili odredišni registar za
preostale instrukcije. Rs1 polje identificira prvi izvorni registar irs2
polje identificira drugi izvorni registar. Op3 opcode polje
idenitificira instrukciju prema op3 tabelama prikazanim u primjeru
4-10.

Simm13 polje je 13-bitna neposredna vrijednost koja je znakovno


proširena na 32 bita za drugi izvor kad je i (immediate) polje 1.
Značenje "znakovno proširen" je u tome da je lijevi bit simm13
polja (znakovni bit) kopiran na lijevo u preostale bitove koji
sačinjavaju 32-bitni integer, prije njegovog dodavanja na rs1 u
ovom slučaju. Ovo osigurava da drugi dvojčani komplementni
negativni broj ostane negativan (i drugi pozititivni komplementni
broj ostane pozitivan).
Naprimjer, (-13)10= (1111111110011)2 i nakon znakovnog
proširenja na 32-bitni integer ,
mi onda imamo (11111111111111111111111111110011)2 koji je
još ekvivalentan sa (-13)10.

20
Aritmetičkim instrukcijama su potrebna dva izvorna operanda i
odredišni operand, ukupno tri operanda. Memorijskim instrukcijama
su potrebna samo dva operanda, jdan za adresu jedan za podatke.
Međutim, preostali izvorni operand se također koristi za adresu.
Operandi u rs1 i rs2 polju i u simm13 polju su dodani da bi
održavali adresu. U prvih nekoliko primjera sa kojima ćemo se
susresti, %r0 će se koristiti za rs2 te će se stoga specificirati samo
preostali izvorni operand.

4.2.5 ARC DATA formati

ARC podržava 12 različitih formata podataka kako je predstavljeno


u primjeru 4-11. Formati podataka su grupirani u tri tipa: označeni
integer, neoznačeni integer, i plutajuća tačka (floating point). Unutar
ovih tipova, dozvoljene širine formata su bajt (osam bita),
poluriječ(16 bita), riječ/samoriječ (32 bita), tagged riječi (koje se
povlače) (32 bita u kojima dva najmanje bitna bita formiraju tag i
najznačajnijih 30 bita formiraju vrijednost), dupla riječ (64 bita), i
quad riječ (128 bita).

U stvarnosti, ARC ne diferencira između označenih i neoznačenih


integera. Oba su pohranjena i njima se manipuliše kao sa dvojnim
komplementnim integerima. Njihova je interpretacija ta koja varira.
U određenom slučaju, subset ogranka instrukcija predpostavlja da su
vrijednosti koje se upoređuju označeni integeri, dok drugi subset
predpostavlja da su neoznačeni. Slično tome, C bit indicira
prelivanje neoznačenih integera i v bit označava prelivanje
označenih integera.

Tagged riječ koristi dva najmanje značajna bita da bi indicirala


prelivanje, u kojima je učinjen pokušaj da se pohrani vrijednost koja
je veća od 30 bita u alociranih 30 bita 32-bitne riječi. Tagged
aritmetičke operacije se koriste u jezicima sa dinamički tipiziranim
podacima, kao što su lisp i Smalltalk. U svokoj generičkoj formi, 1
u bilo kojem bitu tag polja indicira situaciju prelivanja za tu riječ.
Tagovi mogu biti korišteni dabi se osigurali odgovarajući uslovi

21
poravnanja (da riječi počinju na 4-bitnim granicama, quad riječi na
8-bitnim granicama, itd.), posebno za usmjerivače.
Formati plutajuće tačke (floating point) prilagođeni su za IEEE754-
1985 standard .Postoje specijalne instrukcije koje evociraju formate
plutajućih tačaka, a koji nisu ovdje opisani, i mogu se naći u
(SPARC, 1992).

Figure 4-11 ARC formati podataka

1. označeni integer bajt


2. označena integer poluriječ
3. označena integer riječ
4. označena integer dupla
5. neoznačeni integer bajt
6. neoznačena integer pluriječ
7. neoznačena integer riječ
8. prateća (tagged) riječ

22
9. neoznačena integer dupla
10. plutajuća točka single
11. plutajuća točka dupla
12. plutajuća točka quad

4.2.6 Opisi ARC instrukcija

Sad kad smo upoznati sa formatima instrukcija, možemo dati


detaljne opise 15 instrukcia prikazanih u primjeru 4-7, koje su
predhodno date. Prevod na objektni kod dat je samo kao referenca, i
detaljno je opisana u tekstu, referenca sadržaja memorijske lokacije
(za ld i st) je indicirana sa kvadratnim zagradama kao u "1d (x),
%r1" koja kopira sadržaje lokacije x u %r1.
Referenca adrese memorijske lokacije je specificirana direktno, bez
zagrada, kao u "call sub_r." koja pravi poziv subrutini sub_r. Samo
1d i st imaju pristup memoriji, stoga samo ld i st koriste zagrade.
Registri se uvijek označavaju prema svom sadržaju, i nikad prema
adresama, tako da nema potrebe da se reference registara zatvaraju u
zagrade.

Instrukcija: ld
Opis: Unesi registar sa glavne memorije. Memorijska adresa mora
biti poravnata na granici riječi (tj. Adresa mora biti prema slučaju
djeljiva sa 4). Adresa se izračunava dodavanjem sadržaja registra u
rs1 polju ili u sadržaje registra u rs2 polju ili na vrijednost u
simm13 polju, kako odgovara kontekstu.
Primjer upotrebe: ld [x], %r1
ili ld [x], %r0, %r1
ili ld %r0+x, %r1
Značenje: kopiraj sadržaje memorijske lokacije x u registar %r1.
Objektni kod: 11000010000000000010100000010000 (x = 2064)

Instrukcija: st
Opis: Pohrani registar u glavnu memoriju. Memorijska adresa mora
biti poravnana na granici riječi. Adresa se izračunava dodavanjem

23
sadržaja registra u rs1 polju na ili sadržaje registra u rs2 polju ili na
vrijednost u simm13 polju, kako već odgovara kontekstu. Rd polje
ove instrukcije se u stvari koristi za izvorni registar.
Primjer upotrebe: st %r1, [x]
Značenje: Kopiraj sadržaje registra %r1 u memorijsku lokaciju x.
Objektni kod: 11000010001000000010100000010000
( x= 2064)

Instrukcija: sethi
Značenje: Odredi visokih 22 bita i nuliraj niskih 10 bita registra.
Ako je operand 0 i registar %r0, onda se instrukcija ponaša kao no-
op (NOP), što znači da se ne odvija ni jedna operacija.
Primjer upotrebe: sethi 0x304F15, %r1
Značenje: Odredi visokih 22 bita %r1 za (304F15)16, I odredi
niskih 10 bita na nulu.
Objektni kod: 00000011001100000100111100010101

Instrukcija: andcc
Opis: Bitwise AND i izvorne operande u odredišni operand. Kodovi
stanja se određuju prema rezultatu.
Primjer upotrebe: andcc %r1, %r2, %r3
Značenje: logički AND %r1 i %r2 i smjesti rezultat u %r3.
Objektni kod:10000110100010000100000000000010

Instrukcija: jmpl
Opis: Jump and link ( povratak iz subrutine). "Skoči" (jump) u novu
adresu i pohrani adresu trenutne instrukcije ( gdje je jmpl instrukcija
locirana) u odredišnom registru.
Primjer upotrebe: jmpl %r15 + 4, %r0
Značenje: Vrati se izsubrutine. Vrijednost PC-a za call (pozivnu)
instrukciju je predhodno pohranjena u %r15, i stoga bi se povratna
adresa trebala izračunati za instrukciju koja slijedi poziv, na %r15 +
4. Trenutna adresa je odbačena u %r0.
Objektni kod: 100000011100001111100000000000100

24
Instrukcija: be
Opis: Ako je z kod stanja 1, onda onda se ogranak adrese izračunava
dodavanjem 4 x disp22 u format za instrukciju ogranka (branch
instruction format) na adresu trenutne instrukcije. Ako je z kod
stanja 0, onda je kontrola prenešena na instrukciju koja prati be.
Primjer upotrebe: be label
Značenje: Ogranak na oznaku ako je z kod stanja 1. Za objektni
kod prikazan ispod, oznaka je pet riječi dalje u memoriji nego be
instrukcija.
Objektni kod: 0001100100000000000000000000101

Instrukcija: bcs
Opis: Ako je c kod stanja 1, onda ogranak na adresu izračunatu
dodavanjem 4 x disp22 u Branch Instruction Format na adresu
rtenutne instrukcije. Ako je c kod stanja 0, onda je konterola
prenešena na instrukciju koja slijedi bcs.
Primjer upotrebe: bcs label
Značenje:
Ogranak na oznaku ako je c kod stanja 1. Za objektni kod prikazan
niže, oznaka je pet riječi dalje od bcs instrukcije.
Objektni kod: 00001010100000000000000000000101

Instrukcija: bvs
Opis: Ako je v kod stanja 1, onda ogranak na adresu izračunatu
dodavanjem 4 x disp22 u Branch Instruction Formatu na adresu
trenutne instrukcije. Ako je v kod stanja 0, onda se kontrola prenosi
na instrukciju koja slijedi bvs.
Primjer upotrebe: bvs label
Značenje: Ogranak na oznaku ako je v kod stanja 1. Za objektni
kod prikazan niže, oznaka je pet riječi dalje u memoriji nego bvs
instrukcija.
Objektni kod: 00001110100000000000000000000101

25
Instrukcija: ba
Opis: Ogranak na adresu izračunatu dodavanjem 4 x disp22 u
Branch Instruction Format na adresu trenutne instrukcije.
Primjer upotrebe: bvs label
Značenje: Ogranak na oznaku bez obzira na seting kodova stanja.
Za objektni kod prikazan niže, oznaka je pet riječi ranije u
memeoriji nego ba instrukcija.
Objektni kod: 00010000101111111111111111111011

4.3 Pseudo-Ops

Kao dodatak ARC instrukcijama koje podržava arhitektura, nalaze


se također i pseudo-operacije (pseudo-ops) koje uopšte nisu
opkodovi, već prije instrukcije asembleru da izvodi neke akcije u
assembly vrijeme.
Lista pseudo-ops-a i primjeri njihove upotrebe su prikazani u
primjeru 4-12. Možete primjetiti da za razliku od opkodova
procesora, koji su specifični za određenu mašinu, vrsta i priroda
pseudo-opsa je specifična za dati asembler, jer se izvršavaju od
strane samog asemblera.

.equ pseudo-op daje instrukcije asembleru da izjednači vrijednost


(equate=jednačina) ili da oznaku (ovdje character) poveže sa
simbolom, tako da se simbol može koristiti kroz program kao da je
oznaka ili veza (string) napisana na svom mjestu. .begin i . end

26
pseudo-ops govore asembleru kad da počne i da završi asembliranje.
Bilo koje izjave koje se pojave prije .begin ili nakon .end se
ignorišu. Jedan program može imati više od jednog .begin/. end
para,, ali tu mora biti a . end za svaki . begin, i mora postojati barem
jedan . begin. Upotreba . begin i . end su korisni u stvaranju dijelova
programa koji su nevidljivi za asembler tokom "trebljenja"
(debugging).

.org (origin-porijeklo) pseudo-op uzrokuje asembliranje druge


instrukcije sa predpostavkom da će biti smještena u specificiranu
memorijsku lokaciju u vrijeme rada (runtime) (loakcija 2048 u
primjeru 4-12).
.dwb (define word block -definiraj blok riječi) pseudo-op rezervira
blok 4-bitnih riječi, što je tipično za prikaz. Lokacijski brojač ( koji
vodi evidenciju o tome koja se instrukcija asemblira od strane
asemblera) se pomjera ispred bloka u zavisnosti od broja riječi
specificiranih od strane argumenta na . dwb pomnoženim sa 4.
. global i . extern pseudo-ops bave se sa imenima varijabli i adresa
koje su definirane u jednom modulu asembly koda i koriste se u
drugom.
.global pseudo-op čini oznaku (label) dostupnu ostalim modulima.
.extern pseudo-op identificira oznaku koja je korištena u lokalnom
modulu i definirana je u drugom modulu (koji bi trebao biti označen
sa . global u tom modulu). Vidjećemo kako su . global i . extern
korišteni u povezivanju i punjenju (linking and loading) koji su
obrađeni u slijedećim poglavljima. .macro, . endmacro, . if, i . endif
pseudo-ops su također obrađeni u slijedećem poglavlju.

4.4 Primjeri assembly language programa

Proces pisanja assembly language programa je sličan procesu


pisanja programa visokog nivoa, osim što su mnogi detalji koji su
uklonjeni u programima visokog nivoa, učinjeni su eksplicitnim u
assembly language programima. U ovom dijelu posmatraćemo dva
primjera ARC assembly language programa.

27
Program: Zbrajanje dva cijela broja

Podrazumijeva pisanje ARC assembly language programa koji


zbraja cij. brojeve 15 i 9. Jedno moguće kodiranje je prikazano u
primjeru 4-13. Program počinje i završava sa . begin/ .end
parom. .org pseudo-op daje instrukciju asembleru da počne
asembliranje tako da je asembliran kod prebačen u memoriju
počinjući na lokaciji 2048.
Operandi 15 i 9 su pohranjeni u varijablama x i y, zavisno od
slučaja.
Mi možemo samo dodati brojeve pohranjene u registre u ARC-u
(zato što samo 1d i st mogu ući u glavnu memoriju), i tako program
počinje sa prebacivanjem registara %r1 i %r2 sa x i y.

Addcc instrukcija dodaje %r1 i %r2 i smješta rezultat u %r3.


St instrukcija onda pohranjuje %r3 u memorijsku lokaciju z.
jmpl instrukcija sa operandima %r15 + 4, %r0 uzrokuje povratak
na slijedeću instrukciju u pozivnoj rutini, koja je operativni sistem
ako je ovo najviši nivo korisničkog programa kao što možemo
predpostaviti da jeste. Varijable x, y, i z prate program.

U praksi, SPARC kod ekvivalentan ARC kodu prikazan u primjeru


4-13 nije u potpunosti tačan. 1d, st, i jmpl instrukcijama je potrebno

28
skoro dva ciklusa da se kompletiraju, i pošto SPARC počinje sa
novom instrukcijom svaki put kad sat kucne, ove instukcije trebaju
biti praćene instrukcijom koja ne ovisi o njihovim rezultatima. Ovo
područje (property) lansiranja nove instrukcije prije nego što je
predhodna kompletirana, naziva se pipelining, i detaljnije je
opisana u poglavlju 9.

Program: Izračunavanje poretka integera

Sad podrazumijeva kompleksniji program koji izračunava poredak


integera. Jedno moguće kodiranje je prikazano u primjeru 4-14. Kao
u predhodnom primjeru, program počinje i završava sa . begin/ .end
parom. . org pseudo-op daje instrukcije asembleru da započne
asembliranje tako da je asemblirani kod unešen u memoriju na
početnoj lokaciji 2048. Pseudo-operand je stvoren za simbol a_start
kojemu je dodijeljena vrijednost od 3000.
Program počinje sa unošenjem širine poretka a, koja je data u
bajtovima, u %r1. Program onda unosi početne adrese poretka a u
%r2, i čisti (clears) %r3 koji će držati djelomičnu sumu. Registar
%3 je očišćen sa ANDiranjem sa %r0, koji uvijek nosi vrijednost 0.
Registar %r0 može biti ANDiran sa bilo kojim registrom i rezultat
će opet biti nula.

29
Label loop počinje loop koji dodaje sucesivne (uzastopne) elemente
poretka u parcijalnoj sumi (%r3) pri svakom ponavljanju. Loop
počinje provjeravanjem da li broj preostalih elemenata poretka koji
se trebaju zbrojiti (%r1) je nula. Ovo izvodi putem ANDiranja %r1
sa samim sobom, koji ima nuspojavu setiranja kodova stanja. Nas
zanima z zastava, koja će biti određena na 1 ako %r1=0. Preostale
zastave (n, v, i c) su određene prema tome. Vrijednost z je testirana
kroz korištenje be instrukcije. Ako više nema preostalih elemenata
poredka da se zbroje (izračunaju), onda programski ogranak na done
koji se vraća u calling routine (koja bi mogla biti operativni sistem,
ako je gornji nivo korisničkog programa).
Ako loop nije izazvan nakon testa za %r1 = 0, onda je %r1
umanjen za dužinu riječi u bajtovima (4) dodavanjem -4. Početna
adresa poredka a (koja je pohranjena u %r2) i indeks u a (%r1) su su

30
dodani u %r4, koji onda usmjerava na novi element u a. Element
pokazan od strane %r4 je onda unešen u %r5 koji je dodan
djelomičnom zbiru (%r3). Vrh loopa je onda revisited kao rezultat
"ba loop" izjave. Širina varijable je pohranjena nakon instrukcija.
Pet elemenata poretka je smješteno u područje memorije u odnosu
na argument .org pseudo-opa (lokacija 3000).

Može se primjetiti da postoje tri instrukcije za izračunavanje adrese


slijedećeg elementa poredka, s tim da je adresa gornjeg elementa u
%r2, i širina poredka u bajtovima u %r1:

addcc %r1, -4, %r1 ! usmjeri na novi element koji se treba dodati
addcc %r1, %r2, %r4 ! dodaj ga na osnovu poredka
1d %r4, %r5 ! unesi slijedeći element u %r5.

Tehnika izračunavanja adrese vrijednosti podataka kao zbira osnove


plus indexa se tako često koristi da ARC i mnogi drugi assembly
jezici imaju specijalne "adressing modes" za njeno ostvarivanje.
U slučaju ARC-a ,ld instrukcijska adresa je izračunata kao zbir
dvaju registara ili registra plus 13-bitne konstante. Prisjetite se da
registar %r0 uvijek sadrži vrijednos nula, tako da putem
specificiranja %r0 koje se vrši implicitno u 1d liniji iznad, gubimo
mogućnost da nam 1d instrukcija sama izvodi izračunavanje adrese.
Jedan registar može nositi adresu operanda, i to možemo ostvariti u
dvije instrukcije za što je potrebno tri instrukcije u primjeru:

addcc %r1, -4, %r1 ! usmjeri na slijedeći element koji treba


dodati
1d %r1 + %r2, %r5 ! unesi slijedeći element u %r5.

Možete primjetiti da također čuvamo registar, %r4, koji je korišten


kao privremeni nosač adrese.

4.4.1. Varijacije u mašinskim arhitekturama i adresiranju

31
ARC je tipičan unesi/pohrani kompjuter. Programi pisani za
unesi/pohrani mašine obično se izvršavaju brže, što je dijelom zbog
smanjenja prometa u CPU memoriji putem unošenja operanada u
CPU samo jednom, i pohranjivane rezultata se vrši samo kad je
izračunavanje kompletirano. Porast u veličini programske memorije
se obično smatra kao cijena koju je vrijedno platiti.
To nije bio slučaj kad su memorije bile redovi puno skuplje
magnitude i CPU-e manje magnitude, kao što je bila situacija ranije
u dobu kompjutera. Pod tim ranijim uslovima, za CPU koje su imale
možda samo jedan registar koji je nosio aritmetičke vrijednosti,
neposredni rezultati morali su biti pohranjeni u memoriji. Mašine su
imale tro-adresne, dvo-adresne i jedno-adresne aritmetičke
instrukcije. Pod ovim mislimo da je instrukcija mogla izvoditi
aritmetiku sa 3, 2, ili 1 svojih operanada ili rezultata u memoriji, što
je suprotno od ARC-a, gdje svi aritmetički i logički operandi moraju
biti u registrima.

Dozvolite nam da uzmemo u obzir kako C izraz A=B*C+D može


biti procjenjen od strane svakog tri-dva-jedno-adresnih
instrukcijskih tipova. U primjerima ispod, kad se govori o varijabli
"A" u stvari ona znači "operand čija je adresa A". Da bi se
izračunala izvedbena statistika za fragmente programa napravićemo
slijedeće predpostavke:

 Adrese i riječi podataka su 16-bitne- ne neuobičajena veličina u


prijašnjih mašina.

 Opkodovi su po veličini 8-bitni.

 Operandi i opkodovi su premješteni iz i u memoriju jedna po


jedna riječ.

Izračunat ćemo programsku veličinu, i u bajtovima, i prometu


programske memorije sa ovim predpostavkama.

32
Memorijski promet ima dvije komponente: sam kod, dopremljen iz
memorije u CPU da bi se sa njim operisalo, te rezultati premješteni
nazad u memoriju kad je izračunavanje gotovo. Posmatranje ovih
izračunavanja omogućuje nam da vizualiziramo neke od razmjena
između programske veličine i memorijskog prometa što nude razne
klase instrukcija.

Tro-adresne instrukcije

U tro-adresnoj instrukciji, izraz A=B*C+D može biti kodiran kao:

mult B, C, A

add D, A, A

što znači množi B sa C i pohrani rezultat u A. (mult i add operacije


su generičke; to nisu ARC instrukcije.) Onda, dodaj D ka A ( na
ovoj tački u programu, A nosi privremeni rezultat množenja B C) i
pohrani rezultat na adresi A. Programska veličina je 7x2 ili 14
bajtova. Memorijski promet je 16 + 2x(2x#) ili 28 bajtova.

Dvo-adresne instrukcije

Na dvo-adresnoj instrukciji, preko jednog od operanda je prepisan


rezultat. Ovdje, kod za izraz A=B*C+D je:
load B, A
mult C, A
add D, A
Programska veličina je sad 3x(3x2) ili 18 bajtova. Memorijski
promet je 18 + 2x2 + 2x2x3 ili 34 bajta.

Jedno-adresne ili akumulatorske adrese

Jedno-adresna instrukcija upošljava jedan aritmetički registar u


CPU, poznat kao akumulator. Akumulator tipično nosi jedaan
aritmetički operand, i također služi kao meta za rezultat aritmetičkih
operacija.

33
Jedno-adresni format nije uobičajen ovih dana, ali je bio
uobičajeniji u ranim danima korištenja kompjutera kad su registri
bili skuplji i često su imali višestruku primjenu. Služi kao
privremeno spremište za jedan od operanada i također za rezultat.
Kod za izraz A=B*C + D je sad:
load B
mult C
add D
store A

Load instrukcija unosi B u akumulator, mult množi C putem


akumulatora i pohranjuje rezultat u akumulator, i add izvodi
odgovarajuće dodavanje. Store instrukcija pohranjuje akumulator u
A. Programska veličina je sad 2x2x4 ili 16 bajtova, i memorijski
promet je 16+4x2 ili 24 bajta.

Registri posebne svrhe

U prilog registrima opšte svrhe i akumulatoru opisanom ranije,


većina modernih arhitektura uključuju druge registre koji su
posvećeni posebnim svrhama. Primjeri uključuju:

 memory index registri: Intel 80x86 Source Index (SI) i


Destination Index (DI) registri. Ovi se koriste da bi ukazali na
početak ili kraj poredka u memoriji. Posebne "vezne" (strig)
instrukcije prenose bajt ili riječ iz početne memorijske lokacije
pokazane od strane SI ka završnoj memorijskoj lokaciji
pokazanoj od strane DI, i onda povećanje ili smanjenje ovih
registara da se usmjeri na slijedeći bajt ili riječ.
 Floating point registri: Mnogi procesori sadašnje generacije
imaju posebne registre i instrukcije koje operišu sa floating point
brojevima.
 Registri za podršku vremena, tajming operacija: The PowerPC
601 procesor sadrži Real-time Clock (sat stvarnog vremena)
registre koji obezbjeđuju visoku rezoluciju mjere stvarnog
vremena za indiciranje datuma i vremena dana (sati) .

34
Obezbjeđuju opseg od prilike 135 godina, sa rezolucijom od 128
ns.
 Registri za podršku operacijskog sistema: mnogo modernih
procesora imaju registre za podršku memorijskih sistema.
 Registri u koje se može ući samo preko "privilegovanih
instrukcija", ili u "Supervisor mode". Da bi se spriječila slučajna
ili namjerna oštećenja sistema, mnogi procesori imaju posebne
instrukcije i registre koji nisu dostupni običnom korisničkom i
aplikacijskom programu. Ove instrukcije i registre koristi samo
operativni sistem.

4.4.2 Izvedba Instruction Set Architecture

Dok se izračunate statistike o veličini programa i memorijskoj


upotrebi posmatraju van konteksta većih programa u kojima bi bili
sadržani, neće pokazivati da bi posjedovanje iti jednog registra za
privremeno pohranjivanje u CPU moglo imati značajan uticaj na
izvedbu programa. U stvari, Intel Pentium procesor, koji se smatra
za jedan od bržih od CPU-a opšte svrhe, ima samo jedan
akumulator, iako ima broj registara za posebnu svrhu koji je
podržavaju. Postoje mnogi drugi faktori koji utiču na stvaran svijet
izvedbe instrukcijskog seta, kao što je vrijeme koje je potrebno
instrukciji da izvede svoju funkciju, i brzina pri kojoj procesor može
raditi.

4.5 Pristup podacima u memoriji- adresirajući modovi

Do ove tačke, vidjeli smo četiri načina izračunavanja adrese


vrijednosti u memoriji: (1) konstantna vrijednost, poznata kao

35
assembly vrijeme, (2) sadržaji registra, (3) zbir dvaju registara, i (4)
zbir registra i konstante.

Tabela 4.1 daje imena ovim adresirajućim modovima, i pokazuje


nekoliko drugih također. Može se primjetiti da se sintaksa tabele
razlikuje od one u ARC. Ovo je uobičajena, nesrećna crta assembly
jezika: svaki se razlikuje od ostalih po svojim sintaksnim
konvencijama. Sistem označavanja M[x] u koloni Značenje
predpostavlja da je memorija poredak, M, čiji je bajt index dat
putem izračunavanja adrese u zagradama. Može se činiti da postoji
zbunjući izbor adresirajućih modova, ali svaki ima svoju upotrebu:

 Neposredno adresiranje dopušta obraćanje na konstantu koja je


poznata kao assembly vrijeme.
 Direktno adresiranje se koristi za pristup podacima čija je adresa
poznata kao assembly vrijeme.
 Indirektno adresiranje se koristi da bi se pristupilo varijabli
usmjerivača čija adresa je poznata kao compile vrijeme. Ovaj
adresirajući mod rijetko je podržan u modernim procesorima jer
zahtjeva dvije memorijske reference da bi se pristupilo operandu,
što ga čini komplikovanom instrukcijom. Programeri koji žele da
pristupe podacima na ovaj način moraju koristiti dvije
instrukcije, jednu da bi pristupili usmjerivaču i jednu da bi
pristupili vrijednosti na koju se odnosi. Ovo ima korisnu
nuspojavu izlaganja kompleksnosti adresirajućeg moda, što
vjerovatno ima za posljedicu obeshrabrenje za njegovu upotrebu.
 Indirektno adesiranje od strane registra se koristi kad adresa
operanda nije poznata do vremena rada (run time). Stack
operandi se uklapaju u ovaj opis, dostupni su preko indirektnog
adresiranja putem registra, često u formi push and pop instrukcija
koje također smanjuju ili povećavaju registar ovisno od slučaja.
 Registar indeksirano, registar zasnovano, i registar indeksirano-
zasnovano adresiranje se koristi da bi se pristupilo
komponentama poredka kao što je onaj u primjeru 4-14, i
komponente "zakopane" ispod vrha stack-a, u strukturi podataka

36
poznate kao stack frame (stack okvir), o kojem se govori u
slijedećem poglavlju.

37

You might also like