Professional Documents
Culture Documents
More MIPS: Recursion: Computer Science 104
More MIPS: Recursion: Computer Science 104
More MIPS: Recursion: Computer Science 104
Recursion
Computer Science 104
Lecture 9
Admin
Homework
Homework 1: graded. 50% As, 27% Bs
Homework 2: Due Wed
Midterm 1
This Wed
1 page of notes
CPS 104
Last time
What did we do last time?
CPS 104
Last time
What did we do last time?
More MIPS!
Functions:
jal
jr
Calling conventions
Stack Frames, saving registers
CPS 104
zero constant 0
16 s0 callee saves
at
...
23 s7
v1 function results
24 t8
a0 arguments
25 t9
a1
a2
27 k1
a3
t0
temporary (contd)
29 sp Stack pointer
...
30 fp
frame pointer
15 t7
31 ra
CPS 104
CPS 104
CPS 104
Review: Returning
On return from a call
Step-1: Put returned values in registers $v0.
(if a value is returned)
Step-2: Restore callee-saved registers.
Restore $fp and other saved registers. [$ra, $s0 - $s7]
Step-4: Return
Jump to the address in $ra.
jr
$ra
CPS 104
Today
More MIPS!
Recursion
Extra time?
Ill work example problems, answer review
questions, etc
Andrew D. Hilton / Alvin R. Lebeck
CPS 104
Recursion
Why do we want recursion?
Because recursion is a wonderful thing!
CPS 104
10
Factorial in C
int fact (int n) {
if (n <= 0) {
return 1;
}
return n * fact (n 1);
}
int x = fact(3);
CPS 104
11
Factorial in C
main
???
return 1;
}
return n * fact (n 1);
}
CPS 104
12
Factorial in C
main
return 1;
???
factorial
}
return n * fact (n 1);
n
return
3
C0
C0
CPS 104
13
Factorial in C
main
return 1;
???
factorial
}
return n * fact (n 1);
n
return
3
C0
C0
CPS 104
14
Factorial in C
main
return 1;
factorial
}
C1
return n * fact (n 1);
}
C0
???
n
return
3
C0
factorial
n
return
2
C1
int x = fact(3);
CPS 104
15
Factorial in C
main
return 1;
factorial
}
C1
return n * fact (n 1);
}
C0
???
n
return
3
C0
factorial
n
return
2
C1
int x = fact(3);
CPS 104
16
Factorial in C
main
return 1;
factorial
}
C1
return n * fact (n 1);
}
C0
???
n
return
3
C0
factorial
n
return
factorial
n
return
int x = fact(3);
2
C1
CPS 104
1
C1
17
Factorial in C
main
return 1;
factorial
}
C1
return n * fact (n 1);
}
C0
???
n
return
3
C0
factorial
n
return
factorial
n
return
int x = fact(3);
2
C1
CPS 104
1
C1
18
Factorial in C
main
return 1;
factorial
}
C1
return n * fact (n 1);
}
C0
???
n
return
3
C0
factorial
n
return
factorial
n
return
int x = fact(3);
2
C1
1
C1
factorial
CPS 104
n
return
0
C1
19
Factorial in C
main
return 1;
factorial
}
C1
return n * fact (n 1);
}
C0
???
n
return
3
C0
factorial
n
return
factorial
n
return
int x = fact(3);
2
C1
1
C1
factorial
CPS 104
n
return
0
C1
20
Factorial in C
main
return 1;
factorial
}
C1
return n * fact (n 1);
fact returned 1
C0
n
return
3
C0
factorial
n
return
2
C1
factorial
n
return
int x = fact(3);
???
CPS 104
1
C1
21
Factorial in C
main
return 1;
factorial
}
C1
return n * fact (n 1);
fact returned 1
C0
???
n
return
factorial
n
return
3
C0
2
C1
int x = fact(3);
CPS 104
22
Factorial in C
main
return 1;
factorial
}
return n * fact (n 1);
n
return
3
C0
fact returned 2
C0
???
CPS 104
23
Factorial in C
main
return 1;
}
return n * fact (n 1);
}
CPS 104
24
Factorial in Assembly
int fact (int n) {
if (n <= 0) {
return 1;
}
return n * fact (n 1);
Observe:
Parameter n in $a0
Need to put n-1 in $a0 to call
Need n after call
CPS 104
25
Factorial in Assembly
int fact (int n) {
if (n <= 0) {
Observe:
Parameter n in $a0
Need to put n-1 in $a0 to call
Need n after call
return 1;
}
return n * fact (n 1); Conclusion:
CPS 104
26
Factorial in Assembly
int fact (int n) {
if (n <= 0) {
Observe:
Parameter n in $a0
Need to put n-1 in $a0 to call
Need n after call
return 1;
}
return n * fact (n 1); Conclusion:
CPS 104
27
Convert C to Assembly
int fact (int n) {
if (n <= 0) {
return 1;
}
return n * fact (n 1);
}
CPS 104
28
Factorial in Assembly
Addr
Value
FF7C
FF78
fact:
FF74
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
FF70
FF6C
FF68
FF64
jal fact
mul $v0, $v0, $s0
FF60
Reg
factRet:
<<frame cleanup>> $a0
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0003
$s0
1234
$v0
ABCD
$sp
FF80
$fp
FFCC
$ra
4000
CPS 104
FF5C
FF58
FF54
FF50
FF4C
FF48
FF44
FF40
29
Factorial in Assembly
Value
FF7C
FF78
<<Frame Setup>>
addiu $sp, $sp, -16
sw $fp, 0($sp)
sw $ra, 4($sp)
sw $s0, 8($sp)
FF74
FF70
FF6C
FF68
FF64
Addr
FF60
Reg
Value
$a0
0003
$s0
1234
$v0
ABCD
$sp
FF80
$fp
FFCC
$ra
4000
CPS 104
FF5C
FF58
FF54
FF50
FF4C
FF48
FF44
FF40
30
Factorial in Assembly
Value
FF7C
FF78
<<Frame Setup>>
addiu $sp, $sp, -16
sw $fp, 0($sp)
sw $ra, 4($sp)
sw $s0, 8($sp)
FF74
FF70
FF6C
FF68
FF64
Addr
FF60
Reg
Value
$a0
0003
$s0
1234
$v0
ABCD
$sp
FF70
$fp
FFCC
$ra
4000
CPS 104
FF5C
FF58
FF54
FF50
FF4C
FF48
FF44
FF40
31
Factorial in Assembly
Value
FF7C
FF78
<<Frame Setup>>
addiu $sp, $sp, -16
sw $fp, 0($sp)
sw $ra, 4($sp)
sw $s0, 8($sp)
FF74
FF70
FFCC
FF6C
FF68
FF64
Addr
FF60
Reg
Value
$a0
0003
$s0
1234
$v0
ABCD
$sp
FF70
$fp
FFCC
$ra
4000
CPS 104
FF5C
FF58
FF54
FF50
FF4C
FF48
FF44
FF40
32
Factorial in Assembly
Value
FF7C
FF78
<<Frame Setup>>
addiu $sp, $sp, -16
sw $fp, 0($sp)
sw $ra, 4($sp)
sw $s0, 8($sp)
FF74
4000
FF70
FFCC
FF6C
FF68
FF64
Addr
FF60
Reg
Value
$a0
0003
$s0
1234
$v0
ABCD
$sp
FF70
$fp
FFCC
$ra
4000
CPS 104
FF5C
FF58
FF54
FF50
FF4C
FF48
FF44
FF40
33
Factorial in Assembly
<<Frame Setup>>
addiu $sp, $sp, -16
sw $fp, 0($sp)
sw $ra, 4($sp)
sw $s0, 8($sp)
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
FF68
FF64
Addr
FF60
Reg
Value
$a0
0003
$s0
1234
$v0
ABCD
$sp
FF70
$fp
FFCC
$ra
4000
CPS 104
FF5C
FF58
FF54
FF50
FF4C
FF48
FF44
FF40
34
Factorial in Assembly
<<Frame Setup>>
addiu $sp, $sp, -16
sw $fp, 0($sp)
sw $ra, 4($sp)
sw $s0, 8($sp)
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
FF68
FF64
Addr
FF60
Reg
Value
$a0
0003
$s0
1234
$v0
ABCD
$sp
FF70
$fp
FF7C
$ra
4000
CPS 104
FF5C
FF58
FF54
FF50
FF4C
FF48
FF44
FF40
35
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF68
FF64
FF60
Reg
factRet:
<<frame cleanup>> $a0
Value
FF6C
jal fact
mul $v0, $v0, $s0
jr $ra
factEndZero:
li $v0, 1
b factRet
Addr
Value
0003
$s0
1234
$v0
ABCD
$sp
FF70
$fp
FF7C
$ra
4000
CPS 104
FF5C
FF58
FF54
FF50
FF4C
FF48
FF44
FF40
36
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF68
FF64
FF60
Reg
factRet:
<<frame cleanup>> $a0
Value
FF6C
jal fact
mul $v0, $v0, $s0
jr $ra
factEndZero:
li $v0, 1
b factRet
Addr
Value
0003
$s0
0003
$v0
ABCD
$sp
FF70
$fp
FF7C
$ra
4000
CPS 104
FF5C
FF58
FF54
FF50
FF4C
FF48
FF44
FF40
37
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF68
FF64
FF60
Reg
factRet:
<<frame cleanup>> $a0
Value
FF6C
jal fact
mul $v0, $v0, $s0
jr $ra
factEndZero:
li $v0, 1
b factRet
Addr
Value
0003
$s0
0003
$v0
ABCD
$sp
FF70
$fp
FF7C
$ra
4000
CPS 104
FF5C
FF58
FF54
FF50
FF4C
FF48
FF44
FF40
38
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF68
FF64
FF60
Value
0002
$s0
0003
$v0
ABCD
$sp
FF70
$fp
FF7C
$ra
4000
CPS 104
Value
FF6C
Addr
FF5C
FF58
FF54
FF50
FF4C
FF48
FF44
FF40
39
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF68
FF64
FF60
Value
0002
$s0
0003
$v0
ABCD
$sp
FF70
$fp
FF7C
$ra
1044
CPS 104
Value
FF6C
Addr
FF5C
FF58
FF54
FF50
FF4C
FF48
FF44
FF40
40
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0002
$s0
0003
$v0
ABCD
$sp
FF60
$fp
FF6C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
FF54
FF50
FF4C
FF48
FF44
FF40
41
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0002
$s0
0002
$v0
ABCD
$sp
FF60
$fp
FF6C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
FF54
FF50
FF4C
FF48
FF44
FF40
42
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0002
$s0
0002
$v0
ABCD
$sp
FF60
$fp
FF6C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
FF54
FF50
FF4C
FF48
FF44
FF40
43
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0001
$s0
0002
$v0
ABCD
$sp
FF60
$fp
FF6C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
FF54
FF50
FF4C
FF48
FF44
FF40
44
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0001
$s0
0002
$v0
ABCD
$sp
FF60
$fp
FF6C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
FF54
FF50
FF4C
FF48
FF44
FF40
45
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0001
$s0
0002
$v0
ABCD
$sp
FF50
$fp
FF5C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
FF44
FF40
46
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0001
$s0
0001
$v0
ABCD
$sp
FF50
$fp
FF5C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
FF44
FF40
47
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0001
$s0
0001
$v0
ABCD
$sp
FF50
$fp
FF5C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
FF44
FF40
48
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0000
$s0
0001
$v0
ABCD
$sp
FF50
$fp
FF5C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
FF44
FF40
49
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0000
$s0
0001
$v0
ABCD
$sp
FF50
$fp
FF5C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
FF44
FF40
50
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0000
$s0
0001
$v0
ABCD
$sp
FF40
$fp
FF4C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
51
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0000
$s0
0000
$v0
ABCD
$sp
FF40
$fp
FF4C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
52
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0000
$s0
0000
$v0
ABCD
$sp
FF40
$fp
FF4C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
53
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0000
$s0
0000
$v0
0001
$sp
FF40
$fp
FF4C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
54
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0000
$s0
0000
$v0
0001
$sp
FF40
$fp
FF4C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
55
Factorial in Assembly
<<Frame Cleanup>>
lw $s0, 8($sp)
lw $ra, 4($sp)
lw $fp, 0($sp)
addiu $sp, $sp, 16
Addr
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Reg
Value
$a0
0000
$s0
0000
$v0
0001
$sp
FF40
$fp
FF4C
$ra
1044
CPS 104
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
56
Factorial in Assembly
<<Frame Cleanup>>
lw $s0, 8($sp)
lw $ra, 4($sp)
lw $fp, 0($sp)
addiu $sp, $sp, 16
Addr
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Reg
Value
$a0
0000
$s0
0001
$v0
0001
$sp
FF40
$fp
FF4C
$ra
1044
CPS 104
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
57
Factorial in Assembly
<<Frame Cleanup>>
lw $s0, 8($sp)
lw $ra, 4($sp)
lw $fp, 0($sp)
addiu $sp, $sp, 16
Addr
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Reg
Value
$a0
0000
$s0
0001
$v0
0001
$sp
FF40
$fp
FF4C
$ra
1044
CPS 104
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
58
Factorial in Assembly
<<Frame Cleanup>>
lw $s0, 8($sp)
lw $ra, 4($sp)
lw $fp, 0($sp)
addiu $sp, $sp, 16
Addr
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Reg
Value
$a0
0000
$s0
0001
$v0
0001
$sp
FF40
$fp
FF5C
$ra
1044
CPS 104
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
59
Factorial in Assembly
<<Frame Cleanup>>
lw $s0, 8($sp)
lw $ra, 4($sp)
lw $fp, 0($sp)
addiu $sp, $sp, 16
Addr
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Reg
Value
$a0
0000
$s0
0001
$v0
0001
$sp
FF50
$fp
FF5C
$ra
1044
CPS 104
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
60
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0000
$s0
0001
$v0
0001
$sp
FF50
$fp
FF5C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
61
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0000
$s0
0001
$v0
0001
$sp
FF50
$fp
FF5C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
62
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0000
$s0
0001
$v0
0001
$sp
FF50
$fp
FF5C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
63
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0000
$s0
0002
$v0
0001
$sp
FF60
$fp
FF6C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
64
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0000
$s0
0002
$v0
0001
$sp
FF60
$fp
FF6C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
65
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0000
$s0
0002
$v0
0002
$sp
FF60
$fp
FF6C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
66
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0000
$s0
0003
$v0
0002
$sp
FF70
$fp
FF7C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
67
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0000
$s0
0003
$v0
0002
$sp
FF70
$fp
FF7C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
68
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0000
$s0
0003
$v0
0006
$sp
FF70
$fp
FF7C
$ra
1044
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
69
Factorial in Assembly
<<Frame Cleanup>>
lw $s0, 8($sp)
lw $ra, 4($sp)
lw $fp, 0($sp)
addiu $sp, $sp, 16
Addr
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Reg
Value
$a0
0000
$s0
0003
$v0
0006
$sp
FF70
$fp
FF7C
$ra
1044
CPS 104
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
70
Factorial in Assembly
<<Frame Cleanup>>
lw $s0, 8($sp)
lw $ra, 4($sp)
lw $fp, 0($sp)
addiu $sp, $sp, 16
Addr
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Reg
Value
$a0
0000
$s0
1234
$v0
0006
$sp
FF70
$fp
FF7C
$ra
1044
CPS 104
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
71
Factorial in Assembly
<<Frame Cleanup>>
lw $s0, 8($sp)
lw $ra, 4($sp)
lw $fp, 0($sp)
addiu $sp, $sp, 16
Addr
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Reg
Value
$a0
0000
$s0
1234
$v0
0006
$sp
FF70
$fp
FF7C
$ra
4000
CPS 104
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
72
Factorial in Assembly
<<Frame Cleanup>>
lw $s0, 8($sp)
lw $ra, 4($sp)
lw $fp, 0($sp)
addiu $sp, $sp, 16
Addr
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Reg
Value
$a0
0000
$s0
1234
$v0
0006
$sp
FF70
$fp
FFCC
$ra
4000
CPS 104
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
73
Factorial in Assembly
<<Frame Cleanup>>
lw $s0, 8($sp)
lw $ra, 4($sp)
lw $fp, 0($sp)
addiu $sp, $sp, 16
Addr
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Reg
Value
$a0
0000
$s0
1234
$v0
0006
$sp
FF80
$fp
FFCC
$ra
4000
CPS 104
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
74
Factorial in Assembly
fact:
<<frame setup>>
move $s0, $a0
blez $s0, factEndZero
addi $a0, $a0, -1
jr $ra
factEndZero:
li $v0, 1
b factRet
Andrew D. Hilton / Alvin R. Lebeck
Value
0000
$s0
1234
$v0
0006
$sp
FF80
$fp
FFCC
$ra
4000
CPS 104
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Addr
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
75
Factorial in Assembly
main:
li $a0, 3
jal fact
move $a0, $v0
Addr
Value
FF7C
FF78
1234
FF74
4000
FF70
FFCC
FF6C
Reg
Value
$a0
0000
$s0
1234
$v0
0006
$sp
FF80
$fp
FFCC
$ra
4000
CPS 104
FF68
0003
FF64
1044
FF60
FF7C
FF5C
FF58
0002
FF54
1044
FF50
FF6C
FF4C
FF48
0001
FF44
1044
FF40
FF5C
76
Recursion De-mystified?
Recursion:
Assembly: not required on midterm1
Generally good to know
Hopefully de-mystified?
P.S. Some languages only have recursion
CPS 104
77
Other ISAs
Weve been studying MIPS
x86: Intel, AMDvery common, kind of ugly
Variable length insns (1-22 bytes)
Very complex insns
Not a load-store ISA (can do mem + reg -> mem)
ARM
CPS 104
78
CPS 104
79