More MIPS: Recursion: Computer Science 104

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 79

More MIPS:

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

Andrew D. Hilton / Alvin R. Lebeck

CPS 104

Last time
What did we do last time?

Andrew D. Hilton / Alvin R. Lebeck

CPS 104

Last time
What did we do last time?
More MIPS!
Functions:
jal
jr
Calling conventions
Stack Frames, saving registers

Worked bubble sort example

Andrew D. Hilton / Alvin R. Lebeck

CPS 104

Review: MIPS Registers


0

zero constant 0

16 s0 callee saves

at

...

v0 expression evaluation &

23 s7

v1 function results

24 t8

a0 arguments

25 t9

a1

26 k0 reserved for OS kernel

a2

27 k1

a3

28 gp Pointer to global area

t0

reserved for assembler

temporary: caller saves

temporary (contd)

29 sp Stack pointer

...

30 fp

frame pointer

15 t7

31 ra

Return Address (HW)

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.

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

Andrew D. Hilton / Alvin R. Lebeck

CPS 104

Today
More MIPS!
Recursion

Wont be required on the exam


But you could use recursion if you want
And good MIPSing practice anyways

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!

Canonical recursion example?


Factorial

Andrew D. Hilton / Alvin R. Lebeck

CPS 104

10

Factorial in C
int fact (int n) {
if (n <= 0) {
return 1;
}
return n * fact (n 1);
}

int x = fact(3);

Andrew D. Hilton / Alvin R. Lebeck

CPS 104

11

Factorial in C
main

int fact (int n) {


if (n <= 0) {

???

return 1;
}
return n * fact (n 1);
}

int main (void) {


int x = fact(3);

Andrew D. Hilton / Alvin R. Lebeck

CPS 104

12

Factorial in C
main

int fact (int n) {


if (n <= 0) {

return 1;

???

factorial

}
return n * fact (n 1);

n
return

3
C0

C0

int main (void) {


int x = fact(3);

Andrew D. Hilton / Alvin R. Lebeck

CPS 104

13

Factorial in C
main

int fact (int n) {


if (n <= 0) {

return 1;

???

factorial

}
return n * fact (n 1);

n
return

3
C0

C0

int main (void) {


int x = fact(3);

Andrew D. Hilton / Alvin R. Lebeck

CPS 104

14

Factorial in C
main

int fact (int n) {


if (n <= 0) {

return 1;

factorial

}
C1
return n * fact (n 1);
}

C0

???

n
return

3
C0

factorial
n
return

int main (void) {

2
C1

int x = fact(3);

Andrew D. Hilton / Alvin R. Lebeck

CPS 104

15

Factorial in C
main

int fact (int n) {


if (n <= 0) {

return 1;

factorial

}
C1
return n * fact (n 1);
}

C0

???

n
return

3
C0

factorial
n
return

int main (void) {

2
C1

int x = fact(3);

Andrew D. Hilton / Alvin R. Lebeck

CPS 104

16

Factorial in C
main

int fact (int n) {


if (n <= 0) {

return 1;

factorial

}
C1
return n * fact (n 1);
}

C0

???

n
return

3
C0

factorial
n
return

int main (void) {

factorial
n
return

int x = fact(3);

Andrew D. Hilton / Alvin R. Lebeck

2
C1

CPS 104

1
C1

17

Factorial in C
main

int fact (int n) {


if (n <= 0) {

return 1;

factorial

}
C1
return n * fact (n 1);
}

C0

???

n
return

3
C0

factorial
n
return

int main (void) {

factorial
n
return

int x = fact(3);

Andrew D. Hilton / Alvin R. Lebeck

2
C1

CPS 104

1
C1

18

Factorial in C
main

int fact (int n) {


if (n <= 0) {

return 1;

factorial

}
C1
return n * fact (n 1);
}

C0

???

n
return

3
C0

factorial
n
return

int main (void) {

factorial
n
return

int x = fact(3);

Andrew D. Hilton / Alvin R. Lebeck

2
C1

1
C1

factorial
CPS 104

n
return

0
C1

19

Factorial in C
main

int fact (int n) {


if (n <= 0) {

return 1;

factorial

}
C1
return n * fact (n 1);
}

C0

???

n
return

3
C0

factorial
n
return

int main (void) {

factorial
n
return

int x = fact(3);

Andrew D. Hilton / Alvin R. Lebeck

2
C1

1
C1

factorial
CPS 104

n
return

0
C1

20

Factorial in C
main

int fact (int n) {


if (n <= 0) {

return 1;

factorial

}
C1
return n * fact (n 1);
fact returned 1

C0

n
return

3
C0

factorial
n
return

int main (void) {

2
C1

factorial
n
return

int x = fact(3);

Andrew D. Hilton / Alvin R. Lebeck

???

CPS 104

1
C1

21

Factorial in C
main

int fact (int n) {


if (n <= 0) {

return 1;

factorial

}
C1
return n * fact (n 1);
fact returned 1

C0

???

n
return
factorial
n
return

int main (void) {

3
C0

2
C1

int x = fact(3);

Andrew D. Hilton / Alvin R. Lebeck

CPS 104

22

Factorial in C
main

int fact (int n) {


if (n <= 0) {

return 1;

factorial

}
return n * fact (n 1);

n
return

3
C0

fact returned 2

C0

???

int main (void) {


int x = fact(3);

Andrew D. Hilton / Alvin R. Lebeck

CPS 104

23

Factorial in C
main

int fact (int n) {


if (n <= 0) {

return 1;
}
return n * fact (n 1);
}

int main (void) {


int x = fact(3);

Andrew D. Hilton / Alvin R. Lebeck

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

int main (void) {


int x = fact(3);

Andrew D. Hilton / Alvin R. Lebeck

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:

Need to move n to other reg


Which one: $t0 or $s0?

int main (void) {


int x = fact(3);

Andrew D. Hilton / Alvin R. Lebeck

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:

Need to move n to other reg


Which one: $t0 or $s0?
Would need save/restore
=> May as well use $s0

int main (void) {


int x = fact(3);

Andrew D. Hilton / Alvin R. Lebeck

CPS 104

27

Convert C to Assembly
int fact (int n) {
if (n <= 0) {

(Well switch to emacs


For this part)

return 1;
}
return n * fact (n 1);
}

int main (void) {


int x = fact(3);

Andrew D. Hilton / Alvin R. Lebeck

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

addiu $fp, $sp, 12

Andrew D. Hilton / Alvin R. Lebeck

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

addiu $fp, $sp, 12

Andrew D. Hilton / Alvin R. Lebeck

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

addiu $fp, $sp, 12

Andrew D. Hilton / Alvin R. Lebeck

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

addiu $fp, $sp, 12

Andrew D. Hilton / Alvin R. Lebeck

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

addiu $fp, $sp, 12

Andrew D. Hilton / Alvin R. Lebeck

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

addiu $fp, $sp, 12

Andrew D. Hilton / Alvin R. Lebeck

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

Andrew D. Hilton / Alvin R. Lebeck

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

Andrew D. Hilton / Alvin R. Lebeck

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

Andrew D. Hilton / Alvin R. Lebeck

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

Andrew D. Hilton / Alvin R. Lebeck

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

Andrew D. Hilton / Alvin R. Lebeck

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

Andrew D. Hilton / Alvin R. Lebeck

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

Andrew D. Hilton / Alvin R. Lebeck

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

Notice how $sp and $fp describe


the callers frame now

Andrew D. Hilton / Alvin R. Lebeck

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

Andrew D. Hilton / Alvin R. Lebeck

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

Andrew D. Hilton / Alvin R. Lebeck

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

Andrew D. Hilton / Alvin R. Lebeck

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

Andrew D. Hilton / Alvin R. Lebeck

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

Andrew D. Hilton / Alvin R. Lebeck

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

jal fact # Addr 1040


mul $v0, $v0, $s0
Reg
factRet:
<<frame cleanup>> $a0

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

Value returned in $v0


Stack /callee saves restored

Andrew D. Hilton / Alvin R. Lebeck

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

Andrew D. Hilton / Alvin R. Lebeck

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)

PowerPCmore like MIPS (RISC)


Has some not-so RISC things: load-with-update

ARM

Good to know others exist, but our focus is


MIPS
Andrew D. Hilton / Alvin R. Lebeck

CPS 104

78

Remaining Time: Work Examples, Answer ?s


With any remaining time Ill
Work examples (write C, asm, do binary math..)
Answer questions
Whatever.

Andrew D. Hilton / Alvin R. Lebeck

CPS 104

79

You might also like