Professional Documents
Culture Documents
4 Poglavlje
4 Poglavlje
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
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.
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.
6
na heksadecimalnom formatu jednostavnijem za upotrebu, od
00000000H do FFFFFFFFFH.
(H predstavlja heksadecimalni broj u mnogim assembly jezicima).
4.1.3. CPU
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:
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.
Instrukcijski set
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.
10
proizvesti različite kompilirane programe za isti izvorni kod, kao što
ćemo vidjeti.
11
Nakon što smo objasnili sistemski bus, glavnu memoriju, i CPU,
sad ćemo pregledati detalje modela instrukcijskog seta, ARC-a.
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.
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.
14
konstruiranje arbitrarne 32-bit konstante u registru, u konjukciji sa
drugom instrukcijom koja postavlja 10 bita niskog reda u registru.
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.
Kontrolne instrukcije
16
Svaki assembly jezik ima svoju sintaksu. Pratićemo SPARC
assembly language sintaksu, kako je prikazano u primjeru 4-8.
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.
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.
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.
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).
22
9. neoznačena integer dupla
10. plutajuća točka single
11. plutajuća točka dupla
12. plutajuća točka quad
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
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).
27
Program: Zbrajanje dva cijela broja
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.
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).
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.
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.
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
mult B, C, A
add D, A, A
Dvo-adresne instrukcije
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
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.
35
assembly vrijeme, (2) sadržaji registra, (3) zbir dvaju registara, i (4)
zbir registra i konstante.
36
poznate kao stack frame (stack okvir), o kojem se govori u
slijedećem poglavlju.
37