You are on page 1of 21

MIPS Korienje

procedura

Procedura
Procedure

su posebne cjeline koje se izvravaju kada ih program pozove

Naime: Program pozove proceduru a istovremeno u registru $31 zapamti adresu


sledee naredbe glavnog programa
Za ovo slui instrukcija JUMP AND LINK

jal

jal Procedure, Address


Instrukcija za povratak je JUMP RETURN

jr $31

jr

Pozivi procedura unutar


procedura
Procedura moe pozivati i neku drugu
proceduru i tu nam trebaju pointeri
da nam pokau gdje smo koju
proceduru smjestili i kako ih pozvati.
Registar $29 je pokaziva na vrh
steka (adresa vrha steka)

Primjer
Procedura A poziva proceduru B, a
procedura B poziva proceduru C.
Procedura C ne poziva vise ni jednu
proceduru. Prikazati MIPS
asemblerski kod za implementaciju
protokola poziva procedura

Analiza primjera
4 kljuna trenutka
1.
2.
3.
4.

Nakon to A pozove proceduru B


Trenutak prije nego sto B pozove C
Nakon to B pozove C
Trenutak nakon vraanja sa C na B

Analiza primjera
A: ...............
jal B
...............
B: ...............
addi $29,$29,-4 #uveavamo stek za jednu lokaciju
sw $31, 0($29) # na vrhu steka pamtimo vrijednost registra $31 kako bi umjeli da se
vratimo na proceduru A jer posle skoka na C vrijednost registra $31 ce cuvati povratak na
B
jal C
lw $31,0($29) # kad smo zavrsili sa procedurom C u registar $31 vracamo adresu
povratka na proceduru A
addi $29,$29,4 # vracamo vrijednost pokazivaca vrha steka
................
jr $31
C:................
................
jr $31

Promjenjive koje se prenose u


procedurama
Za prelazak parametara izmedju
procedura obino se koriste registri:

$4
$5
$6
$7

prvi parametar
drugi parametar
treci parametar
etvrti parematar

Zadatak
Data je procedura u programskom jeziku C koja
inicijalizuje lanove niza cijelih brojeva A, duine N,
na 0. Napisati odgovarajui MIPS kod.
Clear(int A[], int N)
{
int i;
for(i=0; i<N; i++)
A[i]=0;
}

Analiza zadatka
Prilikom prevoenja koda iz programskog jezika C
u MIPS kod pridravamo se sljedea tri generalna
koraka:
1. Alokacija registara za programske
promjenljive
Poto se ulazni argumenti procedura prosljeuju preko registara $4,
$5, $6 i $7, a naa funkcija ima dva ulazna argumenta, onda su tim
promjenljivima dodijeljeni registri $4 i $5, tj. A$4 i N$5. U okviru
same procedure jedina deklarisana promenljiva je i, pa njoj
moemo dodijeliti registar $15.

2. Pisanje koda tijela procedure

3. uvanje sadraja registara tokom


poziva procedura
U proceduri mijenjamo sadraj registara $15, $8 i $16, pa se
prije bilo kakve promjene njihov sadraj mora smjestiti na
stek radi uvanja njihovih originalnih vrijednosti. Registar
$29 sadri pokaziva na stek, pa se on mora umanjiti za
3*4=12 bajta, kako bi se napravilo prostora za ova tri
registra:

addi $29, $29, -12 # Stek raste od viih


niim i otuda

adresa ka

uvanje starih vrijednosti u registrima $15, $8 i


$16:

Poto naa procedura ne poziva nijednu drugu


proceduru onda nema potrebe da se $31 smjeta
na stek.
Nakon zavretka procedure vraamo sa steka
stare vrijednosti registara $15, $8 i $16 i
usklaujemo pokaziva na stek:

Posljednji korak je vraanje u


proceduru koja je pozvala nau
proceduru, i to na instrukciju prvu
posle poziva nae procedure:
jr $31 # vraanje u pozivajuu
proceduru.

RJESENJE ZADATKA

Zadatak
Data je procedura u programskom jeziku C koja broji koliko ima lanova
niza cijelih brojeva A koji su vei od ili jednaki 10 i manji od 24. Duina
niza A je N. Napisati MIPS kod.
int brojanje(int A[], int N)
{
int i, br=0;
for(i=0;i<N;i++)
{
if(A[i]>=10 && A[i]<24)
br++;
}
return br;
}

Zadatak
Napisati roceduru int bcopy(string a,
string b) u MIPS asemblerskom
jeziku. Program uzim dva argumenta,
pokaziva na string A koji se
zavrava nulom (preneena adresa u
registru $4) i pokaziva na odredini
string (registar $5)
Program kopira karaktere i vraa broj
prenijetih karaktera u registaru $2

Rjesenje
Bcopy: add $2,$0$0
lb $6, 0($4)
beq $6,$0, exit
loop: sb $6, 0($5)
addi $2,$2,1
addi $4,$4,1
addi $5,$5,1
lb $6, 0($4)
bne $6,$0,loop
Exit:sb $0,0($5) # na kraju smjesti 0 u niz b svaki niz karaktera se zavrsava 0
jr $31

Zadatak
Napisati potprogram bfind na MIPS asemblerskom
jeziku. Potprogram uzima jedan argument u registru $4
koji je pokaziva na tring terminisan sa nula. Potprogram
treba da locira prvi karakter b u stringu i vrati njegovu
adresu u registru $2. Ako ne postoji karakter b u stringu
bfind tada vraa adresu terminatora stringa.
Napomena ASCII kod za b je 98
NPR ako je string imbibb tada povratna vrijednost
treba da bude pokaziva na trei karakter u stringu
(adresa treeg karaktera)

Bfind: addi $29,$29,-8


sw $3,0($29)
sw $5,4($29)
Loop: addi $3, $0,98
lb $5,0($4)
beq $3, $5, Out
beq $5,$0, Out
addi $4,$4,1
j Loop
Out:add $2,$4,$0
lw $3,0($29)
lw $5,4($29)
addi $29,$29,8
jr $31

Zadatak - samostalno

You might also like