More MIPS:
Recursion
Computer Science 104
Lecture 9
2 © Andrew D. Hilton / Alvin R. Lebeck CPS 104
Homework
•
Homework 1: graded. 50% As, 27% Bs
•
Homework 2: Due Wed
Midterm 1
•
This Wed
•
1 page of notes
3 © Andrew D. Hilton / Alvin R. Lebeck
Last time…
What did we do last time?
4 © Andrew D. Hilton / Alvin R. Lebeck
Last time…
What did we do last time?
•
More MIPS!
•
Functions:
− jal
− jr
− Calling conventions
− Stack Frames, saving registers
•
Worked “bubble sort” example
5 © Andrew D. Hilton / Alvin R. Lebeck CPS 104
0 zero constant 0
1 at reserved for assembler 2 v0 expression evaluation & 3 v1 function results
4 a0 arguments
5 a1 6 a2 7 a3
8 t0 temporary: caller saves
. . . 15 t7 16 s0 callee saves . . . 23 s7 24 t8 temporary (cont’d) 25 t9
26 k0 reserved for OS kernel 27 k1
28 gp Pointer to global area 29 sp Stack pointer
30 fp frame pointer
31 ra Return Address (HW)
Review: MIPS Registers
6 © Andrew D. Hilton / Alvin R. Lebeck CPS 104
Review: Calling a function
Calling Procedure
Step-1: Setup the arguments:
• The first four arguments (arg0-arg3) are passed in registers $a0-$a3
• Remaining arguments are pushed onto the stack
(in reverse order arg5 is at the top of the stack).
Step-2: Save
caller-saved
registers
• Save registers $t0-$t9 if they contain live values at the call site.
Step-3: Execute a
jal
instruction.
7 © Andrew D. Hilton / Alvin R. Lebeck CPS 104
Review: Callee setup
Called Routine
Step-1: Establish stack frame.
• Subtract the frame size from the stack pointer.
addiu $sp, $sp, - <frame-size>
• Typically, minimum frame size is 32 bytes (8 words).
Step-2: Save callee saved registers in the
frame.
• Register $fp is always saved.
• Register $ra is saved if routine makes a call.
• Registers $s0-$s7 are saved if they are used.
Step-3: Establish Frame pointer
• Add the stack <frame size> - 4 to the address in $sp
8 © Andrew D. Hilton / Alvin R. Lebeck 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-3: Pop the stack
• Add the frame size to $sp.
addiu $sp, $sp, <frame-size>
Step-4: Return
• Jump to the address in $ra.
9 © Andrew D. Hilton / Alvin R. Lebeck
Today
More MIPS!
•
Recursion
Won’t be required on the exam…
•
But you could use recursion if you want…
•
And good MIPSing practice anyways
Extra time?
•
I’ll work example problems, answer review
questions, etc…
10 © Andrew D. Hilton / Alvin R. Lebeck
Recursion
Why do we want recursion?
•
Because recursion is a wonderful thing!
Canonical recursion example?
•
Factorial
11 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in C
int fact (int n) {
if (n <= 0) {
return 1;
}
return n * fact (n – 1);
}
…
int x = fact(3);
CPS 10412 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in C
int fact (int n) {
if (n <= 0) {
return 1;
}
return n * fact (n – 1);
}
…
int main (void) {
int x = fact(3);
…
CPS 104
main
13 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in C
int fact (int n) {
if (n <= 0) {
return 1;
}
return n * fact (n – 1);
}
…
int main (void) {
int x = fact(3);
…
CPS 104 main x ??? C0 factorial n 3 return C014 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in C
int fact (int n) {
if (n <= 0) {
return 1;
}
return n * fact (n – 1);
}
…
int main (void) {
int x = fact(3);
…
CPS 104 main x ??? C0 factorial n 3 return C015 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in C
int fact (int n) {
if (n <= 0) {
return 1;
}
return n * fact (n – 1);
}
…
int main (void) {
int x = fact(3);
…
CPS 104 main x ??? C0 factorial n 3 return C0 C1 factorial n 2 return C116 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in C
int fact (int n) {
if (n <= 0) {
return 1;
}
return n * fact (n – 1);
}
…
int main (void) {
int x = fact(3);
…
CPS 104 main x ??? C0 factorial n 3 return C0 C1 factorial n 2 return C117 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in C
int fact (int n) {
if (n <= 0) {
return 1;
}
return n * fact (n – 1);
}
…
int main (void) {
int x = fact(3);
…
CPS 104 main x ??? C0 factorial n 3 return C0 C1 factorial n 2 return C1 factorial n 1 return C118 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in C
int fact (int n) {
if (n <= 0) {
return 1;
}
return n * fact (n – 1);
}
…
int main (void) {
int x = fact(3);
…
CPS 104 main x ??? C0 factorial n 3 return C0 C1 factorial n 2 return C1 factorial n 1 return C119 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in C
int fact (int n) {
if (n <= 0) {
return 1;
}
return n * fact (n – 1);
}
…
int main (void) {
int x = fact(3);
…
CPS 104 main x ??? C0 factorial n 3 return C0 C1 factorial n 2 return C1 factorial n 1 return C1 factorial n 0 return C120 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in C
int fact (int n) {
if (n <= 0) {
return 1;
}
return n * fact (n – 1);
}
…
int main (void) {
int x = fact(3);
…
CPS 104 main x ??? C0 factorial n 3 return C0 C1 factorial n 2 return C1 factorial n 1 return C1 factorial n 0 return C121 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in C
int fact (int n) {
if (n <= 0) {
return 1;
}
return n * fact (n – 1);
}
…
int main (void) {
int x = fact(3);
…
CPS 104 main x ??? C0 factorial n 3 return C0 C1 factorial n 2 return C1 factorial n 1 return C1 fact returned 122 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in C
int fact (int n) {
if (n <= 0) {
return 1;
}
return n * fact (n – 1);
}
…
int main (void) {
int x = fact(3);
…
CPS 104 main x ??? C0 factorial n 3 return C0 C1 factorial n 2 return C1 fact returned 123 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in C
int fact (int n) {
if (n <= 0) {
return 1;
}
return n * fact (n – 1);
}
…
int main (void) {
int x = fact(3);
…
CPS 104 main x ??? C0 factorial n 3 return C0 fact returned 224 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in C
int fact (int n) {
if (n <= 0) {
return 1;
}
return n * fact (n – 1);
}
…
int main (void) {
int x = fact(3);
…
CPS 104
main
25 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
int fact (
int n
) {
if (n <= 0) {
return 1;
}
return
n
* fact (
n – 1
);
}
…
int main (void) {
int x = fact(3);
…
CPS 104
Observe:
Parameter n in $a0
Need to put n-1 in $a0 to call
26 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
int fact (
int n
) {
if (n <= 0) {
return 1;
}
return
n
* fact (
n – 1
);
}
…
int main (void) {
int x = fact(3);
…
CPS 104
Observe:
Parameter n in $a0
Need to put n-1 in $a0 to call
Need n after call
Conclusion:
Need to move n to other reg Which one: $t0 or $s0?
27 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
int fact (
int n
) {
if (n <= 0) {
return 1;
}
return
n
* fact (
n – 1
);
}
…
int main (void) {
int x = fact(3);
…
CPS 104
Observe:
Parameter n in $a0
Need to put n-1 in $a0 to call
Need n after call
Conclusion:
Need to move n to other reg Which one: $t0 or $s0?
Would need save/restore => May as well use $s0
28 © Andrew D. Hilton / Alvin R. Lebeck
Convert C to Assembly
int fact (
int n
) {
if (n <= 0) {
return 1;
}
return
n
* fact (
n – 1
);
}
…
int main (void) {
int x = fact(3);
…
CPS 104
(We’ll switch to emacs
29 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0003 $s0 1234 $v0 ABCD $sp FF80 $fp FFCC $ra 4000 Addr Value FF7C FF78 FF74 FF70 FF6C FF68 FF64 FF60 FF5C FF58 FF54 FF50 FF4C FF48 FF44 FF40
30 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
<<Frame Setup>> addiu $sp, $sp, -16 sw $fp, 0($sp) sw $ra, 4($sp) sw $s0, 8($sp) addiu $fp, $sp, 12 CPS 104 Reg Value $a0 0003 $s0 1234 $v0 ABCD $sp FF80 $fp FFCC $ra 4000 Addr Value FF7C FF78 FF74 FF70 FF6C FF68 FF64 FF60 FF5C FF58 FF54 FF50 FF4C FF48 FF44 FF4031 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
<<Frame Setup>> addiu $sp, $sp, -16 sw $fp, 0($sp) sw $ra, 4($sp) sw $s0, 8($sp) addiu $fp, $sp, 12 CPS 104 Reg Value $a0 0003 $s0 1234 $v0 ABCD $sp FF70 $fp FFCC $ra 4000 Addr Value FF7C FF78 FF74 FF70 FF6C FF68 FF64 FF60 FF5C FF58 FF54 FF50 FF4C FF48 FF44 FF4032 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
<<Frame Setup>> addiu $sp, $sp, -16 sw $fp, 0($sp) sw $ra, 4($sp) sw $s0, 8($sp) addiu $fp, $sp, 12 CPS 104 Reg Value $a0 0003 $s0 1234 $v0 ABCD $sp FF70 $fp FFCC $ra 4000 Addr Value FF7C FF78 FF74 FF70 FFCC FF6C FF68 FF64 FF60 FF5C FF58 FF54 FF50 FF4C FF48 FF44 FF4033 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
<<Frame Setup>> addiu $sp, $sp, -16 sw $fp, 0($sp) sw $ra, 4($sp) sw $s0, 8($sp) addiu $fp, $sp, 12 CPS 104 Reg Value $a0 0003 $s0 1234 $v0 ABCD $sp FF70 $fp FFCC $ra 4000 Addr Value FF7C FF78 FF74 4000 FF70 FFCC FF6C FF68 FF64 FF60 FF5C FF58 FF54 FF50 FF4C FF48 FF44 FF4034 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
<<Frame Setup>> addiu $sp, $sp, -16 sw $fp, 0($sp) sw $ra, 4($sp) sw $s0, 8($sp) addiu $fp, $sp, 12 CPS 104 Reg Value $a0 0003 $s0 1234 $v0 ABCD $sp FF70 $fp FFCC $ra 4000 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 FF64 FF60 FF5C FF58 FF54 FF50 FF4C FF48 FF44 FF4035 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
<<Frame Setup>> addiu $sp, $sp, -16 sw $fp, 0($sp) sw $ra, 4($sp) sw $s0, 8($sp) addiu $fp, $sp, 12 CPS 104 Reg Value $a0 0003 $s0 1234 $v0 ABCD $sp FF70 $fp FF7C $ra 4000 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 FF64 FF60 FF5C FF58 FF54 FF50 FF4C FF48 FF44 FF4036 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0003 $s0 1234 $v0 ABCD $sp FF70 $fp FF7C $ra 4000 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 FF64 FF60 FF5C FF58 FF54 FF50 FF4C FF48 FF44 FF40
37 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0003 $s0 0003 $v0 ABCD $sp FF70 $fp FF7C $ra 4000 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 FF64 FF60 FF5C FF58 FF54 FF50 FF4C FF48 FF44 FF40
38 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0003 $s0 0003 $v0 ABCD $sp FF70 $fp FF7C $ra 4000 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 FF64 FF60 FF5C FF58 FF54 FF50 FF4C FF48 FF44 FF40
39 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0002 $s0 0003 $v0 ABCD $sp FF70 $fp FF7C $ra 4000 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 FF64 FF60 FF5C FF58 FF54 FF50 FF4C FF48 FF44 FF40
40 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0002 $s0 0003 $v0 ABCD $sp FF70 $fp FF7C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 FF64 FF60 FF5C FF58 FF54 FF50 FF4C FF48 FF44 FF40
41 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0002 $s0 0003 $v0 ABCD $sp FF60 $fp FF6C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 FF54 FF50 FF4C FF48 FF44 FF40
42 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0002 $s0 0002 $v0 ABCD $sp FF60 $fp FF6C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 FF54 FF50 FF4C FF48 FF44 FF40
43 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0002 $s0 0002 $v0 ABCD $sp FF60 $fp FF6C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 FF54 FF50 FF4C FF48 FF44 FF40
44 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0001 $s0 0002 $v0 ABCD $sp FF60 $fp FF6C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 FF54 FF50 FF4C FF48 FF44 FF40
45 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0001 $s0 0002 $v0 ABCD $sp FF60 $fp FF6C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 FF54 FF50 FF4C FF48 FF44 FF40
46 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0001 $s0 0002 $v0 ABCD $sp FF50 $fp FF5C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 FF44 FF40
47 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0001 $s0 0001 $v0 ABCD $sp FF50 $fp FF5C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 FF44 FF40
48 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0001 $s0 0001 $v0 ABCD $sp FF50 $fp FF5C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 FF44 FF40
49 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0000 $s0 0001 $v0 ABCD $sp FF50 $fp FF5C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 FF44 FF40
50 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0000 $s0 0001 $v0 ABCD $sp FF50 $fp FF5C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 FF44 FF40
51 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0000 $s0 0001 $v0 ABCD $sp FF40 $fp FF4C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C
52 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0000 $s0 0000 $v0 ABCD $sp FF40 $fp FF4C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C
53 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0000 $s0 0000 $v0 ABCD $sp FF40 $fp FF4C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C
54 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0000 $s0 0000 $v0 0001 $sp FF40 $fp FF4C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C
55 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0000 $s0 0000 $v0 0001 $sp FF40 $fp FF4C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C
56 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
<<Frame Cleanup>> lw $s0, 8($sp) lw $ra, 4($sp) lw $fp, 0($sp) addiu $sp, $sp, 16 CPS 104 Reg Value $a0 0000 $s0 0000 $v0 0001 $sp FF40 $fp FF4C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C57 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
<<Frame Cleanup>> lw $s0, 8($sp) lw $ra, 4($sp) lw $fp, 0($sp) addiu $sp, $sp, 16 CPS 104 Reg Value $a0 0000 $s0 0001 $v0 0001 $sp FF40 $fp FF4C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C58 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
<<Frame Cleanup>> lw $s0, 8($sp) lw $ra, 4($sp) lw $fp, 0($sp) addiu $sp, $sp, 16 CPS 104 Reg Value $a0 0000 $s0 0001 $v0 0001 $sp FF40 $fp FF4C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C59 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
<<Frame Cleanup>> lw $s0, 8($sp) lw $ra, 4($sp) lw $fp, 0($sp) addiu $sp, $sp, 16 CPS 104 Reg Value $a0 0000 $s0 0001 $v0 0001 $sp FF40 $fp FF5C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C60 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
<<Frame Cleanup>> lw $s0, 8($sp) lw $ra, 4($sp) lw $fp, 0($sp) addiu $sp, $sp, 16 CPS 104 Reg Value $a0 0000 $s0 0001 $v0 0001 $sp FF50 $fp FF5C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5CNotice how $sp and $fp describe the callers frame now
61 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0000 $s0 0001 $v0 0001 $sp FF50 $fp FF5C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C
62 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0000 $s0 0001 $v0 0001 $sp FF50 $fp FF5C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C
63 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0000 $s0 0001 $v0 0001 $sp FF50 $fp FF5C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C
64 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0000 $s0 0002 $v0 0001 $sp FF60 $fp FF6C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C
65 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0000 $s0 0002 $v0 0001 $sp FF60 $fp FF6C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C
66 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0000 $s0 0002 $v0 0002 $sp FF60 $fp FF6C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C
67 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0000 $s0 0003 $v0 0002 $sp FF70 $fp FF7C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C
68 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0000 $s0 0003 $v0 0002 $sp FF70 $fp FF7C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C
69 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0000 $s0 0003 $v0 0006 $sp FF70 $fp FF7C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C
70 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
<<Frame Cleanup>> lw $s0, 8($sp) lw $ra, 4($sp) lw $fp, 0($sp) addiu $sp, $sp, 16 CPS 104 Reg Value $a0 0000 $s0 0003 $v0 0006 $sp FF70 $fp FF7C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C71 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
<<Frame Cleanup>> lw $s0, 8($sp) lw $ra, 4($sp) lw $fp, 0($sp) addiu $sp, $sp, 16 CPS 104 Reg Value $a0 0000 $s0 1234 $v0 0006 $sp FF70 $fp FF7C $ra 1044 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C72 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
<<Frame Cleanup>> lw $s0, 8($sp) lw $ra, 4($sp) lw $fp, 0($sp) addiu $sp, $sp, 16 CPS 104 Reg Value $a0 0000 $s0 1234 $v0 0006 $sp FF70 $fp FF7C $ra 4000 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C73 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
<<Frame Cleanup>> lw $s0, 8($sp) lw $ra, 4($sp) lw $fp, 0($sp) addiu $sp, $sp, 16 CPS 104 Reg Value $a0 0000 $s0 1234 $v0 0006 $sp FF70 $fp FFCC $ra 4000 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C74 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
<<Frame Cleanup>> lw $s0, 8($sp) lw $ra, 4($sp) lw $fp, 0($sp) addiu $sp, $sp, 16 CPS 104 Reg Value $a0 0000 $s0 1234 $v0 0006 $sp FF80 $fp FFCC $ra 4000 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C75 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
fact:<<frame setup>> move $s0, $a0
blez $s0, factEndZero addi $a0, $a0, -1
jal fact # Addr 1040
mul $v0, $v0, $s0 factRet: <<frame cleanup>> jr $ra factEndZero: li $v0, 1 b factRet CPS 104 Reg Value $a0 0000 $s0 1234 $v0 0006 $sp FF80 $fp FFCC $ra 4000 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C
76 © Andrew D. Hilton / Alvin R. Lebeck
Factorial in Assembly
main: … … … li $a0, 3 jal fact move $a0, $v0 … … CPS 104 Reg Value $a0 0000 $s0 1234 $v0 0006 $sp FF80 $fp FFCC $ra 4000 Addr Value FF7C FF78 1234 FF74 4000 FF70 FFCC FF6C FF68 0003 FF64 1044 FF60 FF7C FF5C FF58 0002 FF54 1044 FF50 FF6C FF4C FF48 0001 FF44 1044 FF40 FF5C Value returned in $v077 © Andrew D. Hilton / Alvin R. Lebeck
Recursion De-mystified?
Recursion:
•
Assembly: not required on midterm1
•
Generally good to know
•
Hopefully de-mystified?
•
P.S. Some languages
only
have recursion…
78 © Andrew D. Hilton / Alvin R. Lebeck
Other ISAs
We’ve been studying MIPS
•
x86: Intel, AMD—very common, kind of ugly
− Variable length insns (1-22 bytes)
− Very complex insns
− Not a load-store ISA (can do mem + reg -> mem)
•
PowerPC—more like MIPS (“RISC”)
− Has some not-so RISC things: load-with-update
•
ARM
•
…
Good to know others exist, but our focus is
MIPS
79 © Andrew D. Hilton / Alvin R. Lebeck