Lecture 09 Recursion

Post on 03-Feb-2016

221 views 0 download

Tags:

description

mips

Transcript of Lecture 09 Recursion

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

Admin

3 © Andrew D. Hilton / Alvin R. Lebeck

Last time…

What did we do last time?

CPS 104

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 FF40

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

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

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

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

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

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

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 FF5C

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

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

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

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

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 FF5C

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

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

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

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

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

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

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

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

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