You are on page 1of 37

Projekat – drugi kolokvijum

# Sekcija za zapis podataka (data section)


.data
# deklaracijaželjenih podataka
# ...
# Sekcija za zapis koda(text section)
.text
.globlmain
.entmain # opciono, nije obavezno u QtSpim-u

main:
# zapis programskog koda
# ...
# Kraj programskog koda
li $v0, 10
syscall
.end main
1. Napisati glavni program koji pita korisnika da unese dvije proizvoljne cjelobrojne
vrijednosti x i y, a zatim ih poredi i daje odgovarajuće obavještenje: “x je vece od
y”, “x je manje od y”, ili “x i y su jednaki” u zavisnosti od toga kakve su unijete
vrijednosti cijelih brojeva x i y. Program učitati u QtSpim simulator MIPS asemblera
i testirati ga.

.data
pitanje1: .asciiz "Unesite prvu cjelobrojnu vrijednost x: \n"
pitanje2: .asciiz "Unesite drugu cjelobrojnu vrijednost y: \n"
odgovor1: .asciiz "x je vece od y"
odgovor2: .asciiz "x je manje od y"
odgovor3: .asciiz "x i y su jednaki"
odgovor_br: .space 25

.text
.globl main
main:
li $v0, 4 # call code za print string pitanje1
la $a0, pitanje1 # adresa stringa
syscall # system call

li $v0, 5 # call code zaread integer x


syscall # system call

add $t0,$v0,$0 # cuvamo u t0

li $v0, 4 # call code za print string pitanje2


la $a0, pitanje2 # adresa stringa
syscall # system call

li $v0, 5 # call code za read integer y


syscall # system call

add $t1,$v0,$0 # cuvam y u t1

bgt $t0, $t1, L1 # stampaj odgovor 1


blt $t0, $t1, L2 # stampaj odgovor 2

# stampaj odgovor 3
li $v0, 4 # call code za print string odgovor 3
la $a0, odgovor3 # adresa stringa
syscall # system call

j Exit
L1: li $v0, 4 # call code za print string odgovor 1
la $a0, odgovor1 # adresa stringa
syscall # system call

j Exit

L2: li $v0, 4 # call code za print string odgovor 2


la $a0, odgovor2 # adresa stringa
syscall # system call

Exit:
li $v0, 10 # terminate
syscall # system call
.end main
2. Napisati glavni program koji treba da pita korisni kada unese proizvoljni string
dužine do 30 karaktera, a potom da izbroji koliko karaktera ima unijeti string i da
vrati poruku sljedeće sadržine: “Zadati string je duzine: X” (umjesto X je potrebno
prikazati broj karaktera). Program učitati u QtSpim simulator MIPS asemblera i
testirati ga.

.data
pitanje: .asciiz "Unesite proizvoljni string duzine do 30 karaktera: \n"
odgovor_br: .space 30
odgovor: .asciiz "Zadati string je duzine: "
rezultat: .word 0

.text
.globl main
main:
li $v0, 4 # call code za print string pitanje
la $a0, pitanje # adresa stringa
syscall # system call

li $v0, 8 # call code za read string


la $a0, odgovor_br # adresa na koju se smjes. string
li $a1, 30 # max broj kar. po stringu
syscall # system call

li $t0, 0 # brojac na nulu

L1:
lb $t1, ($a0) # citamo karaktere iz unijetog stringa
beqz $t1, L2 # stigli smo do kraja S A N E L 0
add $t0, $t0, 1 # brojimo
add $a0, $a0, 1 # pomjeramo adresu
j L1

L2:
sub $t0, $t0, 1 # zbog Enter-a
sw $t0, rezultat

li $v0, 4 # call code za print string odgovor


la $a0, odgovor # adresa stringa
syscall # system call

li $v0, 1 # call code, print integer


lw $a0, rezultat # vrijednost integera koji se ispisuje
syscall # system call

Exit:
li $v0, 10 # terminate
syscall # system call
.end main
3. Napisati glavni program koji vrši izračunavanje sume prvih 50 neparnih prirodnih
brojeva. Program treba da vrati poruku sljedeće sadržine: “Suma prvih 50 neparnih
prirodnih brojeva je: X” (umjesto X je potrebno prikazati proizvod). Program učitati
u QtSpim simulator MIPS asemblera i testirati ga.

# Deklaracija podataka
.data
poruka: .asciiz "Suma neparnih prirodnih brojeva manjih od 50 je: "
rezultat: .word 0

# Text/kod zadatka
.text
.globl main
main:
li $v0, 4 # call code za print string poruka
la $a0, poruka # adresa stringa
syscall # system call

li $t0, 1 # prvi broj za sabiranje


li $t1, 0 # brojac brojeva
li $t2, 0 # suma

Loop:
add $t2, $t2, $t0 # suma = suma + neparni element
add $t0, $t0, 2 # 1,3,5,7,9…
add $t1, $t1, 1 # brojac++
blt $t1, 50, Loop # ako je brojac manji od 50 idi na Loop

sw $t2, rezultat

li $v0, 1 # call code, print integer


lw $a0, rezultat # vrijednost integera koji se ispisuje
syscall # system call

li $v0, 10 # terminate
syscall # system call
.end main
4. Napisati glavni program koji vrši izračunavanje sume svakog drugog člana niza [1 0 -
1 5 3 7 -3 9 -5 21] (smatrati da numeracija elemenata niza počinje od jedan). Program
treba da vrati poruku sljedeće sadržine: “Trazena suma je: X” (umjesto X je potrebno
prikazati sumu). Program učitati u QtSpim simulator MIPS asemblera i testirati ga.
Napomena: Program mora da radi za sve nizove od 10 elemenata.

# Deklaracija podataka
.data
niz: .word 1, 0, -1, 5, 3
.word 7, -3, 9, -5, 21
duzina: .word 10
poruka: .asciiz "Trazena suma je: "
rezultat: .word 0

.text
.globl main
main:

li $t0, 0 # postavljanje sume na 0


li $t1, 0 # brojac elemenata

la $t2, niz # pocetna adresa niza


lw $t3, duzina # duzina niza

Loop:
lw $t4, ($t2) # ucitavanje elementa
add $t0, $t0, $t4
add $t1, $t1, 2 # brojimo +2
add $t2, $t2, 8
bne $t1, $t3, Loop

li $v0, 4 # call code za print string poruka


la $a0, poruka # adresa stringa
syscall # system call

sw $t0, rezultat

li $v0, 1 # call code, print integer


lw $a0, rezultat # vrijednost integera koji se ispisuje
syscall # system call

Exit:
li $v0, 10 # terminate
syscall # system call
.end main
5. Napisati glavni program koji pita korisni kada unese proizvoljnu cjelobrojnu
vrijednosti x. Ukoliko je x pozitivan broj program vraća vrijednost x2; ako je x
negativan broj program vraća x4; ako je x jednako 0 program vraća 0. Rezultate vratiti
u vidu obavještenja u konzoli. Program učitati u QtSpim simulator MIPS asemblera i
testirati ga.

.data
pitanje: .asciiz "Unesite cjelobrojnu vrijednost x: \n"
odgovor: .asciiz "Izlaz je:"
rezultat: .word 0

.text
.globl main
main:
li $v0, 4 # call code za print string pitanje
la $a0, pitanje # adresa stringa
syscall # system call

li $v0, 5 # call code za read integer x


syscall # system call

add $t0,$v0,$0 # cuvam x u t0

bgtz $t0, L1 # rezultat je x^2


bltz $t0, L2 # rezultat je x^4

li $t0, 0 # rezultat je 0

L: li $v0, 4 # call code za print string odgovor


la $a0, odgovor # adresa stringa
syscall # system call

li $v0, 1 # call code, print integer


add $a0, $t0,$0 # vrijednost integera koji se ispisuje
syscall # system call

j Exit

L1: mul $t0, $t0, $t0 # x^2


j L

L2: mul $t0, $t0, $t0 # x^2


mul $t0, $t0, $t0 # x^4
j L

Exit:
li $v0, 10 # terminate
syscall # system call
.end main
6. Napisati glavni program koji pita korisnika da unese proizvoljnu cjelobrojnu
vrijednosti x, a zatim je poredi sa nulom i daje odgovarajuće obavještenje: “x je
pozitivan broj”, “x je negativan broj”, ili “x je jednako 0” u zavisnosti od toga
kakva je unijeta vrijednost cijelog broja x. Program učitati u QtSpim simulator MIPS
asemblera i testirati ga.

.data
p1: .asciiz "\nUnesi X: "
p2: .asciiz "X je negativan broj"
p3: .asciiz "X je jednako 0"
p4: .asciiz "X je pozitivan broj"

.text
.globl main
main:
li $v0, 4 # stampamo poruku p1
la $a0, p1
syscall

li $v0, 5 # unosimo preko tastature X


syscall

add $t0, $v0, $0 # cuvamo X u $t0

bgtz $t0, L1 # da li je X vece od 0, ako jeste skoci na L1


bltz $t0, L2 # da li je X manje od 0, ako jeste skoci na L2

li $v0, 4 # stampa poruku da je X jednako nuli


la $a0, p3
syscall
j Exit

L1:
li $v0, 4 # stampa poruku da je X pozitivan broj
la $a0, p4
syscall
j Exit

L2:
li $v0, 4 # stampa se poruka da je Y negativan broj
la $a0, p2
syscall

Exit:
li $v0, 10
syscall
.end main
7. Napisati glavni program koji vrši izračunavanje proizvoda parnih prirodih brojeva do
10. Program treba da vrati poruku sljedeće sadržine: “Proizvod parnih prirodnih
brojeva do 10 je: X” (umjesto X je potrebno prikazati proizvod). Program učitati u
QtSpim simulator MIPS asemblera i testirati ga.

.data
p1: .asciiz "Proizvod parnih prirodnih brojeva do 10 je: "
rezultat: .word 0

.text
.globl main

main:
li $v0, 4 # stampamo poruku p1
la $a0, p1
syscall

li $t0, 2 # prvi broj za sabiranje, pocinjemo od 2


li $t1, 0 # brojac brojeva (2, 4, 6, 8, 10, 12, 14, 16, 18, 20)
li $t2, 1 # proizvod

Loop:
mul $t2, $t2, $t0 # proizvod = proizvod * parni broj
add $t0, $t0, 2 # prelazak na drugi parni broj
# parni broj + 2 = 4
add $t1, $t1, 1 # brojac++
blt $t1, 5, Loop # ako je brojac manji od 10, idi na Loop

sw $t2, rezultat # smjesti rezultat u $t2

li $v0, 1 # ispis rezultata


lw $a0, rezultat
syscall

Exit:
li $v0, 10
syscall
.end main
8. Napisati glavni program koji pita korisnika da unese proizvoljnu cjelobrojnu
vrijednost x, a koju potom prosljeđuje proceduri half_double kao ulazni argument.
Procedura ima dva izlazna podatka: x/2 i 2x. Glavni program poziva ovu proceduru i
vraća dva obavještenja: “Polovina unijetog broja je: Z” (umjesto Z je potrebno
prikazati x/2) i “Dupla vrijednost unijetog broja je: W” (umjesto W je potrebno
prikazati 2x). Program učitati u QtSpim simulator MIPS asemblera i testirati ga.

.data
p1: .asciiz "Unesi X: "
p2: .asciiz "\nPolovina unijetog broja je: "
p3: .asciiz "\nDupla vrijednost unijetog broja je: "
rezultat1: .word 0
rezultat2: .word 0

.text
.globl main
main:
li $v0, 4 # stampamo poruku da unesemo X
la $a0, p1
syscall

li $v0, 5 # unosimo X preko tastature


syscall

add $t0, $v0, $0 # cuvamo X u registar $t0

move $a0, $t0


jal half_double

sw $v0, rezultat1
sw $v1, rezultat2

li $v0, 4 # stampamo poruku polovina unijetog broja je


la $a0, p2
syscall

li $v0, 1 # stampamo rezultat iz funkcije za x/2


lw $a0, rezultat1
syscall

li $v0, 4 # stampamo poruku duple vrijednosti X-a


la $a0, p3
syscall

li $v0, 1 # stampamo rezultat iz funkcije za x*2


lw $a0, rezultat2
syscall

li $v0, 10
syscall
.end main
half_double:

# argument $a0

div $v0, $a0, 2 # X/2


mul $v1, $a0, 2 # X*2

jr $ra
9. Napisati proceduru divide koja dijeli dva ulazna argumenata. Izlazni argumeti su
rezultat dijeljenja i ostatak pri dijeljenju. Potom tu proceduru pozvati u glavnom
programu za vrijednosti: x=15, y=4. Glavni program vraća dva obavještenja: “Količnik
je: Z” (umjesto Z je potrebno prikazati količnik brojeva x i y) i “Ostatak je: W”
(umjesto W je potrebno prikazati ostatak prilikom dijeljenja brojeva x i y). Program
učitati u QtSpim simulator MIPS asemblera i testirati ga.

.data
x: .word 15
y: .word 4
p1: .asciiz "Kolicnik je: "
p2: .asciiz "\nOstatak je: "
rezultat1: .float 0.0
rezultat2: .word 0

.text
.globl main

main:

lw $a0, x
lw $a1, y
jal divide

sw $v0, rezultat1
sw $v1, rezultat2

li $v0, 4 # stampamo poruku kolicnik je


la $a0, p1
syscall

li $v0, 1 # stampamo rezultat iz funkcije za 15/4


lw $a0, rezultat1
syscall

li $v0, 4 # stampamo poruku ostatak je


la $a0, p2
syscall

li $v0, 1 # stampamo rezultat iz funkcije za 15%4


lw $a0, rezultat2
syscall

li $v0, 10
syscall
.end main
divide:

# argumenti $a0, $a1

div $v0, $a0, $a1 # 15/4


rem $v1, $a0, $a1 # 15%4

jr $ra
10. Napisati glavni program koji treba da pita korisnika da unese jedan od 4 moguća
karaktera '+', '-', '*', '/', a potom da vrati jednu od ogovarajućih poruka: “Simbol
za sabiranje” ili “Simbol za oduzimanje” ili “Simbol za mnozenje” ili “Simbol za
dijeljenje” (u zavisnosti od toga koji je karakter korisnik unio). Program učitati u
QtSpim simulator MIPS asemblera i testirati ga.

.data
unos: .space 1
p1: .asciiz "Unesite jedan od 4 moguca karaktera (+,-,*,/): "
p2: .asciiz "Simbol za sabiranje"
p3: .asciiz "Simbol za oduzimanje"
p4: .asciiz "Simbol za mnozenje"
p5: .asciiz "Simbol za dijeljenje"

.text
.globl main
main:
li $v0, 4 # call code za print string pitanje
la $a0, p1 # adresa stringa
syscall # system call

li $v0, 8 # call code za read string


la $a0, unos # adresa na koju se smjes. string
move $t0, $a0
syscall # system call

li $t1, '+'
li $t2, '-'
li $t3, '*'
li $t4, '/'

lb $a0, ($t0)

beq $a0, $t1, L1


beq $a0, $t2, L2
beq $a0, $t3, L3
beq $a0, $t4, L4

L1:
li $v0, 4 # call code za print string pitanje
la $a0, p2 # adresa stringa
syscall # system call
j Exit

L2:
li $v0, 4 # call code za print string pitanje
la $a0, p3 # adresa stringa
syscall # system call
j Exit
L3:
li $v0, 4 # call code za print string pitanje
la $a0, p4 # adresa stringa
syscall # system call
j Exit

L4:
li $v0, 4 # call code za print string pitanje
la $a0, p5 # adresa stringa
syscall # system call

Exit:
li $v0, 10 # terminate
syscall # system call
.end main
11. Napisati program koji treba da pita korisnika da unese dva stringa iste duzine.
Glavni program treba da provjeri da li su strigovi jednaki i da salje odgovarajucu
poruku.

.data
unesi1: .ascii "Potrebno je unijeti dva stringa iste duzine."
.asciiz "\nUnesite prvi string: "
unesi2: .asciiz "\nUnesite drugi string: "
string1: .space 100
string2: .space 100
poruka: .asciiz "Stringovi su jednaki."
poruka2: .asciiz "Stringovi nisu jednaki."

.text
.globl main
main:

li $v0, 4
la $a0, unesi1
syscall

li $v0, 8
la $a0, string1 # ucitan prvi string u memoriji
syscall

li $v0, 4
la $a0, unesi2
syscall

li $v0, 8
la $a0, string2 # ucitan drugi string u memoriji
syscall

la $t3, string1
la $t4, string2

Loop:
lb $t5, ($t3) # element prvog stringa
lb $t6, ($t4) # element drugog stringa
beqz $t5, L
bne $t5, $t6, Exit
add $t3, $t3, 1
add $t4, $t4, 1
j Loop
Exit:
li $v0, 4
la $a0, poruka2
syscall
j End

L:
li $v0, 4
la $a0, poruka
syscall

End:

li $v0, 10
syscall
.end main
12. Napisati glavni program koji pita korisnika da unese dvije proizvoljne
cjelobrojne vrijednosti x i y, a zatim ih preko procedure poredi poredi i daje
odgovarajuće obavještenje: “x je vece od y”, “x je manje od y”, ili “x i y su jednaki”
u zavisnosti od toga kakve su unijete vrijednosti cijelih brojeva x i y. Program
učitati u QtSpim simulator MIPS asemblera i testirati ga.

.data
pitanje1: .asciiz "Unesite prvu cjelobrojnu vrijednost x: "
pitanje2: .asciiz "\nUnesite drugu cjelobrojnu vrijednost y: "
odgovor1: .asciiz "x je vece od y"
odgovor2: .asciiz "x je manje od y"
odgovor3: .asciiz "x i y su jednaki"
odgovor: .space 25

.text
.globl main
main:
li $v0, 4 # call code za print string pitanje1
la $a0, pitanje1 # adresa stringa
syscall # system call

li $v0, 5 # call code zaread integer x


syscall # system call

add $t0,$v0,$0 # cuvamo u t0

li $v0, 4 # call code za print string pitanje2


la $a0, pitanje2 # adresa stringa
syscall # system call

li $v0, 5 # call code za read integer y


syscall # system call

add $t1,$v0,$0 # cuvam y u t1

move $a0, $t0


move $a1, $t1
jal poredi

li $v0, 4
la $a0, odgovor
syscall

li $v0, 10
syscall
.end main
poredi:
# argumenti $a0, $a1

bgt $a0, $a1, L1 # stampaj odgovor 1


blt $a0, $a1, L2 # stampaj odgovor 2

# stampaj odgovor 3
li $v0, 4 # call code za print string odgovor 3
la $a0, odgovor3 # adresa stringa
syscall # system call

j Exit

L1: li $v0, 4 # call code za print string odgovor 1


la $a0, odgovor1 # adresa stringa
syscall # system call

j Exit

L2: li $v0, 4 # call code za print string odgovor 2


la $a0, odgovor2 # adresa stringa
syscall # system call

Exit:
jr $ra
13. Napisati proceduru neparni koja vrši izračunavanje sume prvih 50 neparnih
prirodnih brojeva. Program treba da vrati poruku sljedeće sadržine: “Suma prvih 50
neparnih prirodnih brojeva je: X” (umjesto X je potrebno prikazati proizvod). Program
učitati u QtSpim simulator MIPS asemblera i testirati ga.

.data
suma: .word 0
poruka: .asciiz "Suma neparnih prirodnih brojeva manjih od 50 je: "
rezultat: .word 0

# Text/kod zadatka
.text
.globl main
main:
li $v0, 4 # call code za print string poruka
la $a0, poruka # adresa stringa
syscall # system call

lw $a0, suma
jal neparni

sw $v0, rezultat

li $v0, 1 # call code, print integer


lw $a0, rezultat # vrijednost integera koji se ispisuje
syscall # system call

li $v0, 10 # terminate
syscall # system call
.end main

neparni:
# $a0 = suma

li $t1, 1 # prvi element


li $t2, 0 # brojac

Loop:
add $a0, $a0, $t1 # suma = suma + neparni element
addi $t1, $t1, 2 # 1,3,5,7,9…
addi $t2, $t2, 1 # brojac++
blt $t2, 50, Loop # ako je brojac manji od 50 idi na Loop

move $v0, $a0


jr $ra
14. Napisati glavni program koji pita korisni kada unese proizvoljnu cjelobrojnu
vrijednosti x. Ukoliko je x pozitivan broj program preko procedure jednak vraća
vrijednost x2; ako je x negativan broj program vraća x4; ako je x jednako 0 program
vraća 0. Rezultate vratiti u vidu obavještenja u konzoli. Program učitati u QtSpim
simulator MIPS asemblera i testirati ga.

.data
pitanje: .asciiz "Unesite cjelobrojnu vrijednost x: "
odgovor: .asciiz "\nIzlaz je: "
rezultat: .word 0

.text
.globl main
main:
li $v0, 4 # call code za print string pitanje
la $a0, pitanje # adresa stringa
syscall # system call

li $v0, 5 # call code za read integer x


syscall # system call

move $a0, $v0


jal jednak

sw $v0, rezultat

li $v0, 4 # call code za print string odgovor


la $a0, odgovor # adresa stringa
syscall # system call

li $v0, 1 # call code, print integer


lw $a0, rezultat # vrijednost integera koji se ispisuje
syscall # system call

li $v0, 10 # terminate
syscall # system call
.end main
jednak:
# $a0 = x

bgtz $a0, L1 # rezultat je x^2


bltz $a0, L2 # rezultat je x^4

li $v0, 0 # rezultat je 0
j Exit

L1: mul $v0, $a0, $a0 # x^2


j Exit

L2: mul $v0, $a0, $a0 # x^2


mul $v0, $a0, $a0 # x^4
j Exit

Exit:
jr $ra
15. Napisati glavni program koji pita korisnika da unese proizvoljnu cjelobrojnu
vrijednosti x, a zatim je putem procedure negativan poredi sa nulom i daje
odgovarajuće obavještenje: “x je pozitivan broj”, “x je negativan broj”, ili “x je
jednako 0” u zavisnosti od toga kakva je unijeta vrijednost cijelog broja x. Program
učitati u QtSpim simulator MIPS asemblera i testirati ga.

.data
p1: .asciiz "\nUnesi X: "
p2: .asciiz "X je negativan broj"
p3: .asciiz "X je jednako 0"
p4: .asciiz "X je pozitivan broj"
odgovor: .space 25

.text
.globl main
main:
li $v0, 4 # stampamo poruku p1
la $a0, p1
syscall

li $v0, 5 # unosimo preko tastature X


syscall

add $t0, $v0, $0 # cuvamo X u $t0

move $a0, $t0


jal negativan

li $v0, 4
la $a0, odgovor
syscall

li $v0, 10
syscall
.end main
negativan:
# argumenti $a0

bgtz $a0, L1 # da li je X vece od 0, ako jeste skoci na L1


bltz $a0, L2 # da li je X manje od 0, ako jeste skoci na L2

# stampaj odgovor 3
li $v0, 4 # call code za print string odgovor 3
la $a0, p3 # adresa stringa
syscall # system call

j Exit

L1: li $v0, 4 # call code za print string odgovor 1


la $a0, p4 # adresa stringa
syscall # system call

j Exit

L2: li $v0, 4 # call code za print string odgovor 2


la $a0, p2 # adresa stringa
syscall # system call

Exit:
jr $ra
16. Napisati proceduru drugi_clan_niza program koji vrši izračunavanje sume svakog
drugog člana niza [1 0 -1 5 3 7 -3 9 -5 21] (smatrati da numeracija elemenata niza
počinje od jedan). Program treba da vrati poruku sljedeće sadržine: “Trazena suma
je: X” (umjesto X je potrebno prikazati sumu). Program učitati u QtSpim simulator
MIPS asemblera i testirati ga. Napomena: Program mora da radi za sve nizove od 10
elemenata.

.data
niz: .word 1, 0, -1, 5, 3
.word 7, -3, 9, -4, 21
duzina: .word 10
poruka: .asciiz "Trazena suma je: "
rezultat: .word 0

# Text/kod zadatka
.text
.globl main
main:
li $v0, 4 # call code za print string poruka
la $a0, poruka # adresa stringa
syscall # system call

li $t0, 0 # postavljanje sume na 0


la $t1, niz # pocetna adresa
lw $t2, duzina # duzina niza

move $a0, $t0


move $a1, $t1
move $a2, $t2
jal drugi_clan_niza

sw $v0, rezultat

li $v0, 1 # call code, print integer


lw $a0, rezultat # vrijednost integera koji se ispisuje
syscall # system call

Exit: li $v0, 10 # terminate


syscall # system call
.end main
drugi_clan_niza:
# a0 = suma
# a1 = pocetna adresa
# a2 = duzina

li $t3, 0 # brojac

Loop:
lw $t4, ($a1) # ucitavanje elementa
add $a0, $a0, $t4
add $t3, $t3, 2 # brojimo +2
add $a1, $a1, 8
bne $t3, $a2, Loop

move $v0, $a0

jr $ra
17. Napisati glavni program koji treba da pita korisni kada unese proizvoljni
string dužine do 30 karaktera, a potom preko procedure izbroji da izbroji koliko
karaktera ima unijeti string i da vrati poruku sljedeće sadržine: “Zadati string je
duzine: X” (umjesto X je potrebno prikazati broj karaktera). Program učitati u QtSpim
simulator MIPS asemblera i testirati ga.

.data
pitanje: .asciiz "Unesite proizvoljni string duzine do 30 karaktera: "
odgovor_br: .space 30
odgovor: .asciiz "\nZadati string je duzine: "
br_karaktera: .word 0
rezultat: .word 0

.text
.globl main
main:
li $v0, 4 # call code za print string pitanje
la $a0, pitanje # adresa stringa
syscall # system call

li $v0, 8 # call code za read string


la $a0, odgovor_br # adresa na koju se smjes. string
li $a1, 30 # max broj kar. po stringu
syscall # system call

la $a0, odgovor_br
lw $a1, br_karaktera
jal izbroji

sw $v0, rezultat

li $v0, 4 # call code za print string odgovor


la $a0, odgovor # adresa stringa
syscall # system call

li $v0, 1 # call code, print integer


lw $a0, rezultat # vrijednost integera koji se ispisuje
syscall # system call

li $v0, 10 # terminate
syscall # system call
.end main
izbroji:
# a0 = string
# a1 = broj karaktera

li $t0, 0 # brojac na nulu

L1: lb $t1, ($a0) # citamo karaktere iz unijetog stringa


beqz $t1, L2 # stigli smo do kraja
add $a1, $a1, 1 # brojimo
add $a0, $a0, 1 # pomjeramo adresu
j L1

L2: sub $a1, $a1, 1 # zbog Enter-a

move $v0, $a1

jr $ra
18. Napisati glavni program koji pita korisnika da unese proizvoljnu cjelobrojnu
vrijednost x. Program vraća dva obavještenja: “Polovina unijetog broja je: Z” (umjesto
Z je potrebno prikazati x/2) i “Dupla vrijednost unijetog broja je: W” (umjesto W je
potrebno prikazati 2x). Program učitati u QtSpim simulator MIPS asemblera i testirati
ga.

.data
p1: .asciiz "Unesi X: "
p2: .asciiz "\nPolovina unijetog broja je: "
p3: .asciiz "\nDupla vrijednost unijetog broja je: "
rezultat1: .word 0
rezultat2: .word 0

.text
.globl main

main:
li $v0, 4 # stampamo poruku da unesemo X
la $a0, p1
syscall

li $v0, 5 # unosimo X preko tastature


syscall

add $t0, $v0, $0 # cuvamo X u registar $t0

div $t1, $t0, 2


mul $t2, $t0, 2

sw $t1, rezultat1
sw $t2, rezultat2

li $v0, 4 # stampamo poruku polovina unijetog broja je


la $a0, p2
syscall

li $v0, 1 # stampamo rezultata iz funkcije za x/2


lw $a0, rezultat1
syscall

li $v0, 4 # stampamo poruku duple vrijednosti X-a


la $a0, p3
syscall

li $v0, 1 # # stampamo rezultata iz funkcije za x*2


lw $a0, rezultat2
syscall

li $v0, 10
syscall
.end main
19. Napisati glavni program koji za argumente ima: x=15, y=4. Glavni program vraća
dva obavještenja: “Količnik je: Z” (umjesto Z je potrebno prikazati količnik brojeva
x i y) i “Ostatak je: W” (umjesto W je potrebno prikazati ostatak prilikom dijeljenja
brojeva x i y). Program učitati u QtSpim simulator MIPS asemblera i testirati ga.

.data
x: .word 14
y: .word 4
p1: .asciiz "Kolicnik je: "
p2: .asciiz "\nOstatak je: "
rezultat1: .float 0.0
rezultat2: .word 0

.text
.globl main

main:

lw $t0, x
lw $t1, y

div $t2, $t0, $t1 # 15/4


rem $t3, $t0, $t1 # 15%4

sw $t2, rezultat1
sw $t3, rezultat2

li $v0, 4 # stampamo poruku kolicnik je


la $a0, p1
syscall

li $v0, 1 # stampamo rezultat iz funkcije za 15/4


lw $a0, rezultat1
syscall

li $v0, 4 # stampamo poruku ostatak je


la $a0, p2
syscall

li $v0, 1 # stampamo rezultat iz funkcije za 15%4


lw $a0, rezultat2
syscall

li $v0, 10
syscall
.end main
20. Napisati glavni program koji treba da pita korisnika da unese jedan od 4 moguća
karaktera '+', '-', '*', '/', a potom preko procedure simbol da vrati jednu od
ogovarajućih poruka: “Simbol za sabiranje” ili “Simbol za oduzimanje” ili “Simbol za
mnozenje” ili “Simbol za dijeljenje” (u zavisnosti od toga koji je karakter korisnik
unio). Program učitati u QtSpim simulator MIPS asemblera i testirati ga.

.data
unos: .space 1
p1: .asciiz "Unesite jedan od 4 moguca karaktera (+,-,*,/): "
p2: .asciiz "Simbol za sabiranje"
p3: .asciiz "Simbol za oduzimanje"
p4: .asciiz "Simbol za mnozenje"
p5: .asciiz "Simbol za dijeljenje"
odgovor: .space 25

.text
.globl main
main:
li $v0, 4 # call code za print string pitanje
la $a0, p1 # adresa stringa
syscall # system call

li $v0, 8 # call code za read string


la $a0, unos # adresa na koju se smjes. string
move $t0, $a0
syscall # system call

la $a0, unos
jal simbol

li $v0, 4
la $a0, odgovor
syscall

li $v0, 10 # terminate
syscall # system call
.end main
simbol:
# a0 = simbol

li $t1, '+'
li $t2, '-'
li $t3, '*'
li $t4, '/'

lb $a0, ($a0)

beq $a0, $t1, L1


beq $a0, $t2, L2
beq $a0, $t3, L3
beq $a0, $t4, L4

L1:
li $v0, 4 # call code za print string pitanje
la $a0, p2 # adresa stringa
syscall # system call
j Exit

L2:
li $v0, 4 # call code za print string pitanje
la $a0, p3 # adresa stringa
syscall # system call
j Exit

L3:
li $v0, 4 # call code za print string pitanje
la $a0, p4 # adresa stringa
syscall # system call
j Exit

L4:
li $v0, 4 # call code za print string pitanje
la $a0, p5 # adresa stringa
syscall # system call

Exit:
jr $ra
Peti termin

1. Ispisivanje stringa i integera.

.data
hdr: .ascii “Primjer\n”
.asciiz “Priblizna vrijednost konstante pi je: ”
number: .word 3

.text
.globl main
main:
la $a0, hdr # adresa nulom terminisanog stringa
li $v0, 4 # call code, print string
syscall # system call

li $v0, 1 # call code, print integer


lw $a0, number # vrijednost integera koji se ispisuje
syscall # system call

li $v0, 10
syscall
.end main
2. Ispisivanje niza.

.data
hdr: .ascii „Elementi niza su:\n"
.asciiz "------------------------\n\n"
spaces: .asciiz " "
NoviRed: .asciiz "\n"

niz: .word 11, 13, 15, 17, 19


.word 21, 23, 25, 27, 29
.word 31, 33, 35, 37, 39
.word 41, 43, 45, 47
duzina: .word 19

.text
.globl main
main:
li $v0, 4 # call code, print string
la $a0, hdr # adresa nulom terminisanog stringa
syscall # system call

la $s0, niz
li $s1, 0 # brojac
lw $s2, duzina
Loop:
li $vo, 1 # call code za print int
lw $a0, ($s0) # niz[i]
syscall
li $v0, 4 # print spaces
la $a0, spaces
syscall
addu $s0, $s0, 4 # update-uj adresu
add $s1, $s1, 1 # brojac++
rem $t0, $s1, 5 # provjerava je li broj prikazanih integera
# djeljiv sa 5, kako bi ispisao tacno po 5
# u jednoj liniji
bnez $st0, PreskociNoviRed
li $v0, 4 # print novi red
la $a0, NoviRed
syscall
PreskociNoviRed:
bne $s1, $s2, Loop

li $v0, 10
syscall
.end main
3. Citanje integera

.data
hdr: .ascii "Primjer kvadriranja\n"
.asciiz "Unesi vrijednost: "
poruka: .asciiz " Kvadrirana vrijednost je: "
vrijednost: .word 0

.text
.globl main
main:
li $v0, 4
la $a0, hdr
syscall

li $v0, 5 # call code za read integer


syscall

mul $t0, $vo, $v0 # kvadriranje


sw $t0, vrijednost

li $v0, 4 # call code za print string


la $a0, poruka # adresa stringa
syscall

li $v0, 10
syscall
.end main
4. Citanje stringa

.data
hdr: .ascii "Primjer citanja karaktera\n\n"
.asciiz "Unesite vase ime: "
poruka: .asciiz "\nZdravo, "
odgovor_br: .space 52 # otprilike procijenjena
# duzina odgovora

.text
.globl main
main:
li $v0, 4 # call code zaprint string
la $a0, hdr # adresastringa
syscall # system call

li $v0, 8 # call code zaread string


la $a0, odgovor_br # adresanakojuse smjes. kar.
li $a1, 52 # max brojkar. postringu
syscall # system call

li $v0, 4 # call code zaprint string


la $a0, poruka # adresastringa
syscall # system call

li $v0, 4 # call code zaprint string


la $a0, odgovor_br # addresastringa
syscall # system call

li $v0, 10
syscall
.end main
Sesti termin

1. Za prikazanu kvadratnu matricu napisati proceduru koja će izračunati sumu elemenata


sa glavne dijagonale, a rezultate prikazati pomoću konzole.

.data
11 12 13 14 15
matrica: .word 11, 12, 13, 14, 15
.word 16, 17, 18, 19, 20 16 17 18 19 20
.word 21, 22, 23, 24, 25 21 22 23 24 25
.word 26, 27, 28, 29, 30 26 27 28 29 30
.word 31, 32, 33, 34, 35 31 32 33 34 35
dimenzija: .word 5
suma: .word 0
poruka: .asciiz "Suma elemenata na dijagonali= "

.text
.globl main
main:
# Poziv procedure za sumiranje
la $a0, matrica # pocetna adresa
lw $a1, dimenzija # dimenzija
jal sumiranje
sw $v0, suma
# Prikazivanje rezultata
li $v0, 4 # print string
la $a0, poruka
syscall

li $v0, 1 # print integer


lw $a0, suma
syscall
li $v0, 10 # terminate
syscall # system call
.end main
# Elementi na dijagonali imaju istu brojnu oznaku vrste i kolone

sumiranje:
li $v0, 0 # suma=0
li $t1, 0 # indeks i=0

Loop:
mul $t3, $t1, $a1 # racunanje adrese
add $t3, $t3, $t1
mul $t3, $t3, 4
add $t4, $a0, $t3

lw $t5, ($t4)
add $v0, $v0, $t5
add $t1, $t1, 1 # i=i+1
blt $t1, $a1, Loop
jr $ra

You might also like