• No results found

More MIPS: Recursion. Computer Science 104 Lecture 9

N/A
N/A
Protected

Academic year: 2021

Share "More MIPS: Recursion. Computer Science 104 Lecture 9"

Copied!
79
0
0

Loading.... (view fulltext now)

Full text

(1)

More MIPS:

Recursion

Computer Science 104

Lecture 9

(2)

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)

3 © Andrew D. Hilton / Alvin R. Lebeck

Last time…

What did we do last time?

(4)

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)

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)

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)

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)

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)

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)

10 © Andrew D. Hilton / Alvin R. Lebeck

Recursion

Why do we want recursion?

Because recursion is a wonderful thing!

Canonical recursion example?

Factorial

(11)

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)

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

(13)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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

(25)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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)

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

(77)

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…

(78)

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)

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

References

Related documents

Pennsylvania get course work on presidential terms for cheap, Illinois buy personal statement on management online west valley city custom term papers get personal statement on same

Idea: Split data into two parts and solve problem.. data 1

At fixed addresses must be in if statement composites matricies matrix and e with a statement into mips jump target address using a variable ptr initially contains index.. Thanks

Sept 9 – Tuesday Lecture: Step #5: Audience Insights &amp; Theories Read Chapter 8 Sept 11 – Thursday Lecture: Step #6: Positioning Read Chapter 9 Sept 16 – Tuesday

Treat it as a diagnostic tool: is there a topic that you need to review.. Strengthen your

The Smallpeice Trust Science Technology Engineering and Maths (STEM) days provide short introductory sessions for Years 8 and 9 students to enhance their understanding of,

The main aim of this thesis is to reduce the bit rate and improve the video quality by implementing a trilateral filter and adaptive loop filter together, evaluate the effect

Reading Recovery and Descubriendo la Lectura teacher leaders maintain registered status through affiliation with a university training center and continued employment in the role