lecture 09 recursion

79
More MIPS: Recursion Computer Science 104 Lecture 9

Upload: ratko-banjevic

Post on 03-Feb-2016

221 views

Category:

Documents


0 download

DESCRIPTION

mips

TRANSCRIPT

Page 1: Lecture 09 Recursion

More MIPS: Recursion

Computer Science 104 Lecture 9

Page 2: Lecture 09 Recursion

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

Admin

Page 3: Lecture 09 Recursion

3 © Andrew D. Hilton / Alvin R. Lebeck

Last time…

What did we do last time?

CPS 104

Page 4: Lecture 09 Recursion

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

CPS 104

Page 5: Lecture 09 Recursion

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

Page 6: Lecture 09 Recursion

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.

Page 7: Lecture 09 Recursion

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

addiu $fp, $sp, <frame-size> - 4

Page 8: Lecture 09 Recursion

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.

jr $ra

Page 9: Lecture 09 Recursion

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…

CPS 104

Page 10: Lecture 09 Recursion

10 © Andrew D. Hilton / Alvin R. Lebeck

Recursion

Why do we want recursion? • Because recursion is a wonderful thing!

Canonical recursion example? • Factorial

CPS 104

Page 11: Lecture 09 Recursion

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 104

Page 12: Lecture 09 Recursion

12 © 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 ???

Page 13: Lecture 09 Recursion

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 C0

Page 14: Lecture 09 Recursion

14 © 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

Page 15: Lecture 09 Recursion

15 © 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

Page 16: Lecture 09 Recursion

16 © 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

Page 17: Lecture 09 Recursion

17 © 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

Page 18: Lecture 09 Recursion

18 © 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

Page 19: Lecture 09 Recursion

19 © 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 C1

Page 20: Lecture 09 Recursion

20 © 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 C1

Page 21: Lecture 09 Recursion

21 © 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 1

Page 22: Lecture 09 Recursion

22 © 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 1

Page 23: Lecture 09 Recursion

23 © 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 2

Page 24: Lecture 09 Recursion

24 © 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 6

Page 25: Lecture 09 Recursion

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 Need n after call

Page 26: Lecture 09 Recursion

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?

Page 27: Lecture 09 Recursion

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

Page 28: Lecture 09 Recursion

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 For this part)

Page 29: Lecture 09 Recursion

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

Page 30: Lecture 09 Recursion

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 FF40

Page 31: Lecture 09 Recursion

31 © 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 FF40

Page 32: Lecture 09 Recursion

32 © 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 FF40

Page 33: Lecture 09 Recursion

33 © 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 FF40

Page 34: Lecture 09 Recursion

34 © 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 FF40

Page 35: Lecture 09 Recursion

35 © 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 FF40

Page 36: Lecture 09 Recursion

36 © 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

Page 37: Lecture 09 Recursion

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

Page 38: Lecture 09 Recursion

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

Page 39: Lecture 09 Recursion

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

Page 40: Lecture 09 Recursion

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

Page 41: Lecture 09 Recursion

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

Page 42: Lecture 09 Recursion

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

Page 43: Lecture 09 Recursion

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

Page 44: Lecture 09 Recursion

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

Page 45: Lecture 09 Recursion

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

Page 46: Lecture 09 Recursion

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

Page 47: Lecture 09 Recursion

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

Page 48: Lecture 09 Recursion

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

Page 49: Lecture 09 Recursion

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

Page 50: Lecture 09 Recursion

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

Page 51: Lecture 09 Recursion

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

Page 52: Lecture 09 Recursion

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

Page 53: Lecture 09 Recursion

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

Page 54: Lecture 09 Recursion

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

Page 55: Lecture 09 Recursion

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

Page 56: Lecture 09 Recursion

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 FF5C

Page 57: Lecture 09 Recursion

57 © 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 FF5C

Page 58: Lecture 09 Recursion

58 © 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 FF5C

Page 59: Lecture 09 Recursion

59 © 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 FF5C

Page 60: Lecture 09 Recursion

60 © 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 FF5C

Notice how $sp and $fp describe the callers frame now

Page 61: Lecture 09 Recursion

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

Page 62: Lecture 09 Recursion

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

Page 63: Lecture 09 Recursion

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

Page 64: Lecture 09 Recursion

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

Page 65: Lecture 09 Recursion

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

Page 66: Lecture 09 Recursion

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

Page 67: Lecture 09 Recursion

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

Page 68: Lecture 09 Recursion

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

Page 69: Lecture 09 Recursion

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

Page 70: Lecture 09 Recursion

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 FF5C

Page 71: Lecture 09 Recursion

71 © 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 FF5C

Page 72: Lecture 09 Recursion

72 © 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 FF5C

Page 73: Lecture 09 Recursion

73 © 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 FF5C

Page 74: Lecture 09 Recursion

74 © 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 FF5C

Page 75: Lecture 09 Recursion

75 © 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

Page 76: Lecture 09 Recursion

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 $v0 Stack /callee saves restored

Page 77: Lecture 09 Recursion

77 © 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…

CPS 104

Page 78: Lecture 09 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

CPS 104

Page 79: Lecture 09 Recursion

79 © Andrew D. Hilton / Alvin R. Lebeck

Remaining Time: Work Examples, Answer ?s

With any remaining time I’ll • Work examples (write C, asm, do binary math..) • Answer questions • Whatever….

CPS 104