-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlab6demo.asm
41 lines (34 loc) · 815 Bytes
/
lab6demo.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
.data
en: .asciiz "n = "
eol: .asciiz "\n"
.text
main:
la $a0, en # print "n = "
li $v0, 4 #
syscall #
li $v0, 5 # read integer
syscall #
move $a0, $v0 # $a0 = $v0
jal fac # $v0 = fib(n)
add $a0,$v0,$zero
li $v0,1
syscall
li $v0,10
syscall
#base case
fac:
bne $a0, $zero, gen # if $a0 != 0, goto generic case
ori $v0, $zero, 1 # else set result $v0 = 1
jr $ra # return
#recursive case
gen:
addiu $sp, $sp, -8 # make room for 2 registers on stack
sw $ra, 4($sp) # save return address register $ra
sw $a0, 0($sp) # save argument register $a0=n
addiu $a0, $a0, -1 # $a0 = n-1
jal fac # $v0 = fac(n-1)
lw $a0, 0($sp) # restore $a0=n
lw $ra, 4($sp) # restore $ra
addiu $sp, $sp, 8 # multipop stack
mul $v0, $v0, $a0 # $v0 = fac(n-1) x n
jr $ra