You are on page 1of 2

Asembler vjebe I

Sintaksa naredbi koje emo koristiti u okviru ovih vjebi:

sub rr, r1, r2 oduzimanje vrijednosti iz registara (r1-r2) i smijetanje rezultata u registar rr
add rr, r1, r2 sabiranje vrijednosti iz registara (r1+r2) i smijetanje rezultata u registar rr
lw rr, N(ri) load word uitavanje u registar rr i-tog elementa niza koji poinje od adrese N; ri je
registar koji sadri vrijednost i.
sw rr, N(ri) save word uitavanje iz registra rr u i-ti element niza koji poinje od adrese N; ri je
registar koji sadri vrijednost i.
# - komentar, traje do kraja tekueg reda.
slt rr, r1, r2 store less than uporeuje vrijednosti u r1 i r2, ukoliko je r1<r2, u rr se smijeta 1;
ako nije onda se u rr smijeta 0
beq r1, r2, lbl branch equal uporeuje vrijednosti u r1 i r2, ukoliko je r1=r2 skae na marker
lbl, ako nije onda se nastavlja sa izvravanjem naredne linije koda
j lbl jump bezuslovno skae na marker lbl
Prilikom postavljanja, marker se pie na poetku linije, prije koda, i razdvaja od koda sa :. Kada se
u okviru koda poziva marker, pie se samo njegov naziv, bez :.

1. Date su sljedee naredbe u programskom jeziku C. Napisati ih u MIPS asemblerskom jeziku pod
pretpostavkom da su promjenjivima a, b, c i d dodijeljeni registri $16, $17, $18 i $19,
respektivno.

a) a = bcd;
Ovo se ne moe sabrati direktno zbog toga to MIPS aritmetike instrukcije imaju tano 3
operanda, pa emo prvo oduzeti c od b, pa od toga kasnije oduzeti d, tj.: a = (bc)d.
Koristiemo privremeni registar $8 za smijetanje meurezultata b-c.

sub $8, $17, $18 # u registar $8 smijetamo b-c


sub $16, $8, $19 # u registar $16 (promenljiva a) smijetamo (b-c)-d.

Jedna razlika u odnosu na vie programske jezike je da su operandi MIPS instrukcija registri, kojih
u naem sluaju ima 32 (u oznaci $0, $1, ..., $31), a operandi viih jezika su promjenljive, kojih moe
biti proizvoljno mnogo. Duina registara, kao i duina jedne memorijske rijei, je takoe 32 bita.

Druga razlika u odnosu na veinu viih programskih jezika je da MIPS kod potuje pravilo
programske linije, tj. svaka instrukcija MIPS koda se nalazi u zasebnom redu. Sa druge strane,
komentari se zavravaju na kraju reda u kojem poinju.

b) a = b;
a=b emo napisati kao a=b+0, a 0 dobijamo kao sadraj registra $0 (programer ne moe
promijeniti sadraj registra $0)

add $16, $0, $17 # u registar $16 smijetamo vrijednost b+0=b.

Na ovaj nain smo doli do instrukcije move $16, $17 koja kopira sadraj jednog registra u drugi.
Iako nije hardverski implementirana, MIPS asembler prihvata ovu instrukciju. Ovakve instrukcije
se nazivaju pseudoinstrukcijama.
c) a = a;
a emo napisati kao 0-a, pa imamo:

sub $16, $0, $16 # u registar $16 smijetamo vrijednost a=0-a.

d) a=0
a=0 emo dobiti kao a=0+0:

add $16, $0, $0 # u registar $16 smijetamo vrijednost a=0+0.

2. Dat je dio koda u programskom jeziku C:

C[i] = A[i] B[i]

Napisati ovu naredbu u MIPS asemblerskom jeziku pod pretpostavkom da su poetne adrese nizova
A, B i C - 1000, 1400 i 1800, respektivno. Pretpostaviti da registar $18 sadri vrijednost 4*i.
Kao privremene registre koristiti $19 i $20.

Odgovarajui kod u MIPS asemblerskom jeziku je:

lw $19, 1000($18) # i-ti element niza A u registar $19


lw $20, 1400($18) # i-ti element niza B u registar $20
sub $20, $19, $20 # oduzimanje tih brojeva i rezultat u registar $20
sw $20, 1800($18) # registar $20 u i-ti element niza C.

3. Dat je dio koda u programskom jeziku C kojim se vri sabiranje prvih 100 prirodnih brojeva:

s=0;
i=0;
while (i<101) {
s=s+i;
i=i+1;
}

Napisati ovaj dio koda u MIPS asemblerskom jeziku pod pretpostavkom da su promjenjivima s i i
dodijeljeni registri $15 i $16, respektivno, dok su konstante 101 i 1 smjetene u registre $20 i $21.

Odgovarajui kod u MIPS asemblerskom jeziku je:

add $15, $0, $0 # s=0;


add $16, $0, $0 # i=0;
Loop: slt $8, $16, $20 # Ako je i<101 onda $8=1. Loop je standardni marker za poetak petlje
beq $8, $0, Exit # Ako je $8=0 skoi na marker Exit, standardni market za izlazak iz petlje
add $15, $15, $16 # s=s+i;
add $16, $16, $21 # i=i+1;
j Loop # skae na Loop
Exit: # iako je prazan, ne sadri kod, marker Exit mora da postoji, poto je pozvan u okviru koda

You might also like