20/06/2015cse1303 part b lecture notes 1 functions, part 2 lecture b15 lecture notes, section b15

59
03/25/22 CSE1303 Part B lecture notes 1 Functions, part 2 Functions, part 2 Lecture B15 Lecture B15 Lecture notes, section B15 Lecture notes, section B15

Post on 20-Dec-2015

219 views

Category:

Documents


3 download

TRANSCRIPT

04/18/23 CSE1303 Part B lecture notes 1

Functions, part 2Functions, part 2

Lecture B15Lecture B15

Lecture notes, section B15Lecture notes, section B15

04/18/23 CSE1303 Part B lecture notes 2

Last timeLast time

Function callingFunction calling jaljal and and jrjr instructions instructions

Calling conventionCalling convention for making a function callfor making a function call

Structure of stackStructure of stack stack framesstack frames

04/18/23 CSE1303 Part B lecture notes 3

In this lectureIn this lecture

Accessing function parametersAccessing function parameters Returning from functionsReturning from functions RecursionRecursion

04/18/23 CSE1303 Part B lecture notes 4

Stack framesStack frames

33

44

??????resultresult

expexp

basebase

0x7FFF039C0x7FFF039C

0x7FFF03980x7FFF0398

0x7FFF03940x7FFF0394

0x7FFF03A00x7FFF03A0

0x7FFF03900x7FFF0390

0x7FFF038C0x7FFF038C

arg 2 (e)arg 2 (e)

arg 1 (b)arg 1 (b) 33

44

0x7FFF03880x7FFF0388

0x7FFF03840x7FFF0384

0x7FFF03800x7FFF0380

0x0040005C0x0040005C

0x7FFF03A00x7FFF03A0

saved $rasaved $ra

saved $fpsaved $fp$fp$fp = =

0x7FFF0384 0x7FFF0384

$sp$sp = = 0x7FFF0380 0x7FFF0380 resultresult 11

powerpower’s ’s stack framestack frame

mainmain’s ’s stack framestack frame

04/18/23 CSE1303 Part B lecture notes 5

Local variablesLocal variables

33

44

??????resultresult

expexp

basebase

0x7FFF039C0x7FFF039C

0x7FFF03980x7FFF0398

0x7FFF03940x7FFF0394

0x7FFF03A00x7FFF03A0

0x7FFF03900x7FFF0390

0x7FFF038C0x7FFF038C

arg 2 (e)arg 2 (e)

arg 1 (b)arg 1 (b) 33

44

0x7FFF03880x7FFF0388

0x7FFF03840x7FFF0384

0x7FFF03800x7FFF0380

0x0040005C0x0040005C

0x7FFF03A00x7FFF03A0

saved $rasaved $ra

saved $fpsaved $fp$fp$fp = =

0x7FFF0384 0x7FFF0384

$sp$sp = = 0x7FFF0380 0x7FFF0380 resultresult 11

powerpower’s ’s local local

variables variables are are

accessed as accessed as mainmain’s were, ’s were,

with with negative negative

offsets from offsets from $fp$fp

resultresult is at is at -4($fp)-4($fp)

04/18/23 CSE1303 Part B lecture notes 6

Function parametersFunction parameters

33

44

??????resultresult

expexp

basebase

0x7FFF039C0x7FFF039C

0x7FFF03980x7FFF0398

0x7FFF03940x7FFF0394

0x7FFF03A00x7FFF03A0

0x7FFF03900x7FFF0390

0x7FFF038C0x7FFF038C

arg 2 (e)arg 2 (e)

arg 1 (b)arg 1 (b) 33

44

0x7FFF03880x7FFF0388

0x7FFF03840x7FFF0384

0x7FFF03800x7FFF0380

0x0040005C0x0040005C

0x7FFF03A00x7FFF03A0

saved $rasaved $ra

saved $fpsaved $fp$fp$fp = =

0x7FFF0384 0x7FFF0384

$sp$sp = = 0x7FFF0380 0x7FFF0380 resultresult 11

bb and and ee are are respectively respectively accessible at accessible at +8($fp)+8($fp) and and +12($fp)+12($fp)

powerpower’s ’s parameters parameters (arguments) (arguments)

are are accessible accessible

with with positivepositive offset from offset from

$fp$fp

04/18/23 CSE1303 Part B lecture notes 7

Example: calleeExample: callee/* A function that gets called. *//* A function that gets called. */

int power(int b, int e)int power(int b, int e){{ int result = 1;int result = 1;

/* Keep going while exponent/* Keep going while exponent is positive. */is positive. */ while (e > 0)while (e > 0) {{ /* Multiply by base. *//* Multiply by base. */ result = result * b;result = result * b;

/* less to multiply. *//* less to multiply. */ e--;e--; }}

/* Return the result/* Return the result to the caller. */to the caller. */ return result;return result;}}

# ... Continued from# ... Continued from# last lecture.# last lecture.loop: loop: # Stop if e <= 0.# Stop if e <= 0. lw $t0, 12($fp) lw $t0, 12($fp) # e# e ble $t0, 0, endble $t0, 0, end

# result = result * b# result = result * b lw $t0, -4($fp) lw $t0, -4($fp) # result# result lw $t1, 8($fp) lw $t1, 8($fp) # b# b mul $t0, $t0, $t1mul $t0, $t0, $t1 sw $t0, -4($fp) sw $t0, -4($fp) # result# result

# e--# e-- lw $t0, 12($fp) lw $t0, 12($fp) # e# e addi $t0, $t0, -1addi $t0, $t0, -1 sw $t0, 12($fp) sw $t0, 12($fp) # e# e

# Repeat loop.# Repeat loop. j loopj loop

end:end: # Now ready to return. # Now ready to return.# Continued ...# Continued ...

04/18/23 CSE1303 Part B lecture notes 8

Example: calleeExample: callee/* A function that gets called. *//* A function that gets called. */

int power(int b, int e)int power(int b, int e){{ int result = 1;int result = 1;

/* Keep going while exponent/* Keep going while exponent is positive. */is positive. */ while (e > 0)while (e > 0) {{ /* Multiply by base. *//* Multiply by base. */ result = result * b;result = result * b;

/* less to multiply. *//* less to multiply. */ e--;e--; }}

/* Return the result/* Return the result to the caller. */to the caller. */ return result;return result;}}

# ... Continued from# ... Continued from# last lecture.# last lecture.loop: loop: # Stop if e <= 0.# Stop if e <= 0. lw $t0, 12($fp) lw $t0, 12($fp) # e# e ble $t0, 0, endble $t0, 0, end

# result = result * b# result = result * b lw $t0, -4($fp) lw $t0, -4($fp) # result# result lw $t1, 8($fp) lw $t1, 8($fp) # b# b mul $t0, $t0, $t1mul $t0, $t0, $t1 sw $t0, -4($fp) sw $t0, -4($fp) # result# result

# e--# e-- lw $t0, 12($fp) lw $t0, 12($fp) # e# e addi $t0, $t0, -1addi $t0, $t0, -1 sw $t0, 12($fp) sw $t0, 12($fp) # e# e

# Repeat loop.# Repeat loop. j loopj loop

end:end: # Now ready to return. # Now ready to return.# Continued ...# Continued ...

04/18/23 CSE1303 Part B lecture notes 9

Function returnFunction return

When When returningreturning from a function, from a function, stack must be restoredstack must be restored to its initial to its initial statestate

Achieved by Achieved by undoing stepsundoing steps made made during calling of function, during calling of function, in in reverse orderreverse order

04/18/23 CSE1303 Part B lecture notes 10

Function return Function return conventionconvention

On On function exitfunction exit, , calleecallee::5.5. chooses chooses return valuereturn value

by setting register by setting register $v0$v0, if necessary, if necessary

6.6. deallocates local deallocates local variablesvariables by popping by popping allocated spaceallocated space

7.7. restores restores $fp$fp by by popping its saved popping its saved value off stackvalue off stack

8.8. restores restores $ra$ra by by popping its saved popping its saved value off stackvalue off stack

9.9. returnsreturns with with jr $rajr $ra

On On returnreturn from from function, function, callercaller::4.4. clears function clears function

argumentsarguments by popping by popping allocated spaceallocated space

5.5. restores saved restores saved temporary registerstemporary registers by by popping their values popping their values off stackoff stack

6.6. usesuses the the return valuereturn value found in $v0, if found in $v0, if necessarynecessary

04/18/23 CSE1303 Part B lecture notes 11

Example: calleeExample: callee

33

44

??????resultresult

expexp

basebase

0x7FFF039C0x7FFF039C

0x7FFF03980x7FFF0398

0x7FFF03940x7FFF0394

0x7FFF03A00x7FFF03A0

0x7FFF03900x7FFF0390

0x7FFF038C0x7FFF038C

arg 2 (e)arg 2 (e)

arg 1 (b)arg 1 (b) 33

00

0x7FFF03880x7FFF0388

0x7FFF03840x7FFF0384

0x7FFF03800x7FFF0380

0x0040005C0x0040005C

0x7FFF03A00x7FFF03A0

saved $rasaved $ra

saved $fpsaved $fp$fp$fp = =

0x7FFF0384 0x7FFF0384

$sp$sp = = 0x7FFF0380 0x7FFF0380 resultresult 8181

callee step 5: put callee step 5: put return value in return value in

register register $v0$v0

no effect visible no effect visible on stackon stack

$v0 = 81$v0 = 81

04/18/23 CSE1303 Part B lecture notes 12

Example: calleeExample: callee

33

44

??????resultresult

expexp

basebase

0x7FFF039C0x7FFF039C

0x7FFF03980x7FFF0398

0x7FFF03940x7FFF0394

0x7FFF03A00x7FFF03A0

0x7FFF03900x7FFF0390

0x7FFF038C0x7FFF038C

arg 2 (e)arg 2 (e)

arg 1 (b)arg 1 (b) 33

00

0x7FFF03880x7FFF0388

0x7FFF03840x7FFF0384

0x7FFF03800x7FFF0380

0x0040005C0x0040005C

0x7FFF03A00x7FFF03A0

saved $rasaved $ra

saved $fpsaved $fp$fp$fp = =

0x7FFF0384 0x7FFF0384

$sp$sp = = 0x7FFF0380 0x7FFF0380 resultresult 8181

callee step 6: callee step 6: deallocate local deallocate local

variables by variables by popping allocated popping allocated

space off stackspace off stack

one local variable one local variable to deleteto delete

04/18/23 CSE1303 Part B lecture notes 13

Example: calleeExample: callee

33

44

??????resultresult

expexp

basebase

0x7FFF039C0x7FFF039C

0x7FFF03980x7FFF0398

0x7FFF03940x7FFF0394

0x7FFF03A00x7FFF03A0

0x7FFF03900x7FFF0390

0x7FFF038C0x7FFF038C

arg 2 (e)arg 2 (e)

arg 1 (b)arg 1 (b) 33

00

0x7FFF03880x7FFF0388

0x7FFF03840x7FFF0384

0x7FFF03800x7FFF0380

0x0040005C0x0040005C

0x7FFF03A00x7FFF03A0

saved $rasaved $ra

saved $fpsaved $fp$fp$fp == $sp$sp ==

0x7FFF03840x7FFF0384

callee step 6: callee step 6: deallocate local deallocate local

variables by variables by popping allocated popping allocated

space off stackspace off stack

one local variable one local variable to deleteto delete

result is now “gone”result is now “gone”

04/18/23 CSE1303 Part B lecture notes 14

Example: calleeExample: callee

33

44

??????resultresult

expexp

basebase

0x7FFF039C0x7FFF039C

0x7FFF03980x7FFF0398

0x7FFF03940x7FFF0394

0x7FFF03A00x7FFF03A0

0x7FFF03900x7FFF0390

0x7FFF038C0x7FFF038C

arg 2 (e)arg 2 (e)

arg 1 (b)arg 1 (b) 33

00

0x7FFF03880x7FFF0388

0x7FFF03840x7FFF0384

0x7FFF03800x7FFF0380

0x0040005C0x0040005C

0x7FFF03A00x7FFF03A0

saved $rasaved $ra

saved $fpsaved $fp$sp$sp = =

0x7FFF0384 0x7FFF0384

callee steps 7 and callee steps 7 and 8: restore saved 8: restore saved values of $fp and values of $fp and $ra by popping off $ra by popping off

stackstack

can do both these can do both these steps at oncesteps at once

$fp$fp = 0x7FFF03A0 = 0x7FFF03A0

$ra$ra = 0x0040005C = 0x0040005C

04/18/23 CSE1303 Part B lecture notes 15

Example: calleeExample: callee

33

44

??????resultresult

expexp

basebase

0x7FFF039C0x7FFF039C

0x7FFF03980x7FFF0398

0x7FFF03940x7FFF0394

0x7FFF03A00x7FFF03A0

0x7FFF03900x7FFF0390

0x7FFF038C0x7FFF038C

arg 2 (e)arg 2 (e)

arg 1 (b)arg 1 (b) 33

00

0x7FFF03880x7FFF0388

0x7FFF03840x7FFF0384

0x7FFF03800x7FFF0380

callee steps 7 and callee steps 7 and 8: restore saved 8: restore saved values of $fp and values of $fp and $ra by popping off $ra by popping off

stackstack

$fp$fp = 0x7FFF03A0 = 0x7FFF03A0

$ra$ra = 0x0040005C = 0x0040005C

$sp$sp = = 0x7FFF038C 0x7FFF038C

$fp$fp = = 0x7FFF03A0 0x7FFF03A0

popping popping $fp$fp makes it point makes it point back to back to mainmain’s stack frame’s stack frame

04/18/23 CSE1303 Part B lecture notes 16

Example: calleeExample: callee

33

44

??????resultresult

expexp

basebase

0x7FFF039C0x7FFF039C

0x7FFF03980x7FFF0398

0x7FFF03940x7FFF0394

0x7FFF03A00x7FFF03A0

0x7FFF03900x7FFF0390

0x7FFF038C0x7FFF038C

arg 2 (e)arg 2 (e)

arg 1 (b)arg 1 (b) 33

00

0x7FFF03880x7FFF0388

0x7FFF03840x7FFF0384

0x7FFF03800x7FFF0380

$sp$sp = = 0x7FFF038C 0x7FFF038C

callee step 9: callee step 9: return by return by

executing executing jr $rajr $ra

nothing visible on nothing visible on stackstack

$fp$fp = = 0x7FFF03A0 0x7FFF03A0

04/18/23 CSE1303 Part B lecture notes 17

Example: calleeExample: callee/* A function that gets called. *//* A function that gets called. */

int power(int b, int e)int power(int b, int e){{ int result = 1;int result = 1;

/* Keep going while exponent/* Keep going while exponent is positive. */is positive. */ while (e > 0)while (e > 0) {{ /* Multiply by base. *//* Multiply by base. */ result = result * b;result = result * b;

/* less to multiply. *//* less to multiply. */ e--;e--; }}

/* Return the result/* Return the result to the caller. */to the caller. */ return result;return result;}}

# ... Continue# ... Continuedd

# Return result in $v0.# Return result in $v0. lw $v0, -4($fp) lw $v0, -4($fp) # result# result

# Remove local var.# Remove local var. addu $sp, $sp, 4addu $sp, $sp, 4

# Restore $fp & $ra# Restore $fp & $ra lw $fp, 0($sp)lw $fp, 0($sp) lw $ra, 4($sp)lw $ra, 4($sp) addu $sp, $sp, 8addu $sp, $sp, 8

# Return to caller.# Return to caller. jr $rajr $ra

04/18/23 CSE1303 Part B lecture notes 18

Example: calleeExample: callee/* A function that gets called. *//* A function that gets called. */

int power(int b, int e)int power(int b, int e){{ int result = 1;int result = 1;

/* Keep going while exponent/* Keep going while exponent is positive. */is positive. */ while (e > 0)while (e > 0) {{ /* Multiply by base. *//* Multiply by base. */ result = result * b;result = result * b;

/* less to multiply. *//* less to multiply. */ e--;e--; }}

/* Return the result/* Return the result to the caller. */to the caller. */ return result;return result;}}

# ... Continue# ... Continuedd

# Return result in $v0.# Return result in $v0. lw $v0, -4($fp) lw $v0, -4($fp) # result# result

# Remove local var.# Remove local var. addu $sp, $sp, 4addu $sp, $sp, 4

# Restore $fp & $ra# Restore $fp & $ra lw $fp, 0($sp)lw $fp, 0($sp) lw $ra, 4($sp)lw $ra, 4($sp) addu $sp, $sp, 8addu $sp, $sp, 8

# Return to caller.# Return to caller. jr $rajr $ra

04/18/23 CSE1303 Part B lecture notes 19

Example: callerExample: caller/* C program which calls a/* C program which calls a function. */function. */

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>

int power(int b, int e);int power(int b, int e);

int main()int main(){{ int base;int base; int exp;int exp; int result;int result;

scanf("%d", &base);scanf("%d", &base); scanf("%d", &exp);scanf("%d", &exp);

result = result = power(base, exp)power(base, exp);;

printf("%d", result);printf("%d", result);

exit(0);exit(0);}}

now back in caller, about to now back in caller, about to assign return value of assign return value of

function to function to mainmain’s local ’s local variable variable resultresult

04/18/23 CSE1303 Part B lecture notes 20

Example: callerExample: caller

caller step 4: clear caller step 4: clear function function

arguments by arguments by popping them off popping them off

stackstack

bb and and ee are no are no longer needed, longer needed, destroy themdestroy them

33

44

??????resultresult

expexp

basebase

$sp$sp = = 0x7FFF038C 0x7FFF038C

$fp$fp = = 0x7FFF03A0 0x7FFF03A0

0x7FFF039C0x7FFF039C

0x7FFF03980x7FFF0398

0x7FFF03940x7FFF0394

0x7FFF03A00x7FFF03A0

0x7FFF03900x7FFF0390

0x7FFF038C0x7FFF038C

arg 2 (e)arg 2 (e)

arg 1 (b)arg 1 (b) 33

00

04/18/23 CSE1303 Part B lecture notes 21

Example: callerExample: caller

bb and and ee are no are no longer needed, longer needed, destroy themdestroy them

33

44

??????resultresult

expexp

basebase

$fp$fp = = 0x7FFF03A0 0x7FFF03A0

0x7FFF039C0x7FFF039C

0x7FFF03980x7FFF0398

0x7FFF03940x7FFF0394

0x7FFF03A00x7FFF03A0

0x7FFF03900x7FFF0390

0x7FFF038C0x7FFF038C

$sp$sp = = 0x7FFF0394 0x7FFF0394

caller step 4: clear caller step 4: clear function function

arguments by arguments by popping them off popping them off

stackstack

04/18/23 CSE1303 Part B lecture notes 22

Example: callerExample: caller

caller step 5: caller step 5: restore saved restore saved

temporary temporary registers by registers by

popping their popping their values off stackvalues off stack

we didn’t save we didn’t save any, so nothing to any, so nothing to

do heredo here

33

44

??????resultresult

expexp

basebase

$fp$fp = = 0x7FFF03A0 0x7FFF03A0

0x7FFF039C0x7FFF039C

0x7FFF03980x7FFF0398

0x7FFF03940x7FFF0394

0x7FFF03A00x7FFF03A0

0x7FFF03900x7FFF0390

0x7FFF038C0x7FFF038C

$sp$sp = = 0x7FFF0394 0x7FFF0394

04/18/23 CSE1303 Part B lecture notes 23

Example: callerExample: caller

caller step 6: use caller step 6: use return value, return value,

found in register found in register $v0$v0

store returned store returned value into a value into a

variablevariable

33

44

??????resultresult

expexp

basebase

$fp$fp = = 0x7FFF03A0 0x7FFF03A0

0x7FFF039C0x7FFF039C

0x7FFF03980x7FFF0398

0x7FFF03940x7FFF0394

0x7FFF03A00x7FFF03A0

0x7FFF03900x7FFF0390

0x7FFF038C0x7FFF038C

$sp$sp = = 0x7FFF0394 0x7FFF0394

$v0 = 81$v0 = 81

main stores main stores return value return value

into local into local variable variable resultresult

04/18/23 CSE1303 Part B lecture notes 24

Example: callerExample: caller

caller step 6: use caller step 6: use return value, return value,

found in register found in register $v0$v0

store returned store returned value into a value into a

variablevariable

33

44

8181resultresult

expexp

basebase

$fp$fp = = 0x7FFF03A0 0x7FFF03A0

0x7FFF039C0x7FFF039C

0x7FFF03980x7FFF0398

0x7FFF03940x7FFF0394

0x7FFF03A00x7FFF03A0

0x7FFF03900x7FFF0390

0x7FFF038C0x7FFF038C

$sp$sp = = 0x7FFF0394 0x7FFF0394

$v0 = 81$v0 = 81

main stores main stores return value return value

into local into local variable variable resultresult

04/18/23 CSE1303 Part B lecture notes 25

Example: callerExample: caller

Done!Done!

after the end of after the end of the function call the function call

the stack has the stack has been returned to been returned to its original stateits original state

33

44

8181resultresult

expexp

basebase

$fp$fp = = 0x7FFF03A0 0x7FFF03A0

0x7FFF039C0x7FFF039C

0x7FFF03980x7FFF0398

0x7FFF03940x7FFF0394

0x7FFF03A00x7FFF03A0

$sp$sp = = 0x7FFF0394 0x7FFF0394

04/18/23 CSE1303 Part B lecture notes 26

Example: callerExample: caller/* C program which calls a/* C program which calls a function. */function. */

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>

int power(int b, int e);int power(int b, int e);

int main()int main(){{ int base;int base; int exp;int exp; int result;int result;

scanf("%d", &base);scanf("%d", &base); scanf("%d", &exp);scanf("%d", &exp);

result = power(base, exp);result = power(base, exp);

printf("%d", result);printf("%d", result);

exit(0);exit(0);}}

# ... main function, continued# ... main function, continued # Last lecture, we # Last lecture, we # finished with this ...# finished with this ... ## jal power jal power

# Remove arguments, they# Remove arguments, they # are no longer needed.# are no longer needed. # 2 * 4 = 8 bytes.# 2 * 4 = 8 bytes. addu $sp, $sp, 8addu $sp, $sp, 8

# Store return value# Store return value # in result.# in result. sw $v0, -4($fp) sw $v0, -4($fp) # result# result

# Print result.# Print result. li $v0, 1li $v0, 1 lw $a0, -4($fp) lw $a0, -4($fp) # result# result syscallsyscall

# deallocate main’s locals# deallocate main’s locals addu $sp, $sp, 12addu $sp, $sp, 12 li $v0, 10 li $v0, 10 # exit# exit syscallsyscall

04/18/23 CSE1303 Part B lecture notes 27

Example: callerExample: caller/* C program which calls a/* C program which calls a function. */function. */

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>

int power(int b, int e);int power(int b, int e);

int main()int main(){{ int base;int base; int exp;int exp; int result;int result;

scanf("%d", &base);scanf("%d", &base); scanf("%d", &exp);scanf("%d", &exp);

result = power(base, exp);result = power(base, exp);

printf("%d", result);printf("%d", result);

exit(0);exit(0);}}

# ... main function, continued# ... main function, continued # Last lecture, we # Last lecture, we # finished with this ...# finished with this ... ## jal power jal power

# Remove arguments, they# Remove arguments, they # are no longer needed.# are no longer needed. # 2 * 4 = 8 bytes.# 2 * 4 = 8 bytes. addu $sp, $sp, 8addu $sp, $sp, 8

# Store return value# Store return value # in result.# in result. sw $v0, -4($fp) sw $v0, -4($fp) # result# result

# Print result.# Print result. li $v0, 1li $v0, 1 lw $a0, -4($fp) lw $a0, -4($fp) # result# result syscallsyscall

# deallocate main’s locals# deallocate main’s locals addu $sp, $sp, 12addu $sp, $sp, 12 li $v0, 10 li $v0, 10 # exit# exit syscallsyscall

04/18/23 CSE1303 Part B lecture notes 28

Function calling Function calling conventionconvention

In summary, In summary, callercaller::1.1. saves temporary registerssaves temporary registers by pushing their by pushing their

values on stackvalues on stack2.2. pushes pushes argumentsarguments on stack on stack3.3. callscalls the function with the function with jaljal instruction instruction ((function runs until it returnsfunction runs until it returns, then:), then:)4.4. clears function argumentsclears function arguments by popping by popping

allocated spaceallocated space5.5. restores saved temporary registersrestores saved temporary registers by by

popping their values off the stackpopping their values off the stack6.6. usesuses the the return valuereturn value found in $v0 found in $v0

04/18/23 CSE1303 Part B lecture notes 29

Function calling Function calling conventionconvention

In summary, In summary, calleecallee::1.1. saves saves $ra$ra by pushing its value on stack by pushing its value on stack2.2. saves saves $fp$fp by pushing its value on stack by pushing its value on stack3.3. copies copies $sp$sp to to $fp$fp4.4. allocates allocates local variableslocal variables ((body of function goes herebody of function goes here, then:), then:)5.5. chooses chooses return valuereturn value by setting register by setting register $v0$v06.6. deallocates local variablesdeallocates local variables by popping by popping

allocated spaceallocated space7.7. restores restores $fp$fp by popping its saved value by popping its saved value8.8. restores restores $ra$ra by popping its saved value by popping its saved value9.9. returnsreturns with with jr $rajr $ra

04/18/23 CSE1303 Part B lecture notes 30

RecursionRecursion

Function calling convention works Function calling convention works exactly the exactly the samesame for for recursive recursive functionsfunctions don’t need to do anything specialdon’t need to do anything special

Each invocationEach invocation of the function has of the function has its its own stack frameown stack frame local variables and parameterslocal variables and parameters

• with their current valueswith their current values return addressreturn address

• where to return towhere to return to

04/18/23 CSE1303 Part B lecture notes 31

Recursion exampleRecursion example/* Main program to call/* Main program to call factorial function. */factorial function. */

#include <stdlib.h>#include <stdlib.h>#include <stdio.h>#include <stdio.h>

int factorial(int p);int factorial(int p);

int main()int main(){{ int n;int n;

scanf("%d", &n);scanf("%d", &n);

printf("%d", factorial(n));printf("%d", factorial(n));

exit(0);exit(0);}}

330x7FFF001C0x7FFF001C

0x7FFF00180x7FFF0018

0x7FFF00140x7FFF0014

0x7FFF00100x7FFF0010

0x7FFF000C0x7FFF000C

0x7FFF00080x7FFF0008

0x7FFF00040x7FFF0004

0x7FFF00000x7FFF0000

0x7FFEFFFC0x7FFEFFFC

0x7FFEFFF80x7FFEFFF8

0x7FFEFFF40x7FFEFFF4

0x7FFEFFF00x7FFEFFF0

0x7FFEFFEC0x7FFEFFEC

0x7FFEFFE80x7FFEFFE8

nn$fp$fp = 0x7FFF001C = 0x7FFF001C

$sp$sp = 0x7FFF0018 = 0x7FFF0018

04/18/23 CSE1303 Part B lecture notes 32

Recursion exampleRecursion example/* Main program to call/* Main program to call factorial function. */factorial function. */

#include <stdlib.h>#include <stdlib.h>#include <stdio.h>#include <stdio.h>

int factorial(int p);int factorial(int p);

int main()int main(){{ int n;int n;

scanf("%d", &n);scanf("%d", &n);

printf("%d", printf("%d", factorial(n)factorial(n)););

exit(0);exit(0);}}

330x7FFF001C0x7FFF001C

0x7FFF00180x7FFF0018

0x7FFF00140x7FFF0014

0x7FFF00100x7FFF0010

0x7FFF000C0x7FFF000C

0x7FFF00080x7FFF0008

0x7FFF00040x7FFF0004

0x7FFF00000x7FFF0000

0x7FFEFFFC0x7FFEFFFC

0x7FFEFFF80x7FFEFFF8

0x7FFEFFF40x7FFEFFF4

0x7FFEFFF00x7FFEFFF0

0x7FFEFFEC0x7FFEFFEC

0x7FFEFFE80x7FFEFFE8

nn$fp$fp = 0x7FFF001C = 0x7FFF001C

$sp$sp = 0x7FFF0018 = 0x7FFF0018 33arg 1 (p)arg 1 (p)argument is at argument is at

0($sp)0($sp)

04/18/23 CSE1303 Part B lecture notes 33

Recursion example: callerRecursion example: caller/* Main program to call/* Main program to call factorial function. */factorial function. */

#include <stdlib.h>#include <stdlib.h>#include <stdio.h>#include <stdio.h>

int factorial(int p);int factorial(int p);

int main()int main(){{ int n;int n;

scanf("%d", &n);scanf("%d", &n);

printf("%d", factorial(n));printf("%d", factorial(n));

exit(0);exit(0);}}

.text.textmain:main: # 1 * 4 = 4 bytes local. # 1 * 4 = 4 bytes local. move $fp, $spmove $fp, $sp subu $sp, $sp, 4subu $sp, $sp, 4

li $v0, 5li $v0, 5 syscallsyscall sw $v0, -4($fp) sw $v0, -4($fp) # n# n

# Call factorial.# Call factorial. # 1 * 4 = 4 bytes arg.# 1 * 4 = 4 bytes arg. subu $sp, $sp, 4subu $sp, $sp, 4 lw $t0, -4($fp) lw $t0, -4($fp) # n# n sw $t0, 0($sp) sw $t0, 0($sp) # arg 1# arg 1 jal factorialjal factorial # Clear argument.# Clear argument. addu $sp, $sp, 4addu $sp, $sp, 4 move $a0, $v0move $a0, $v0 # returned # returned li $v0, 1 li $v0, 1 # print int# print int syscallsyscall

# deallocate main’s locals# deallocate main’s locals addu $sp, $sp, 4addu $sp, $sp, 4 li $v0, 10 li $v0, 10 # exit# exit syscallsyscall

04/18/23 CSE1303 Part B lecture notes 34

Recursion example: callerRecursion example: caller/* Main program to call/* Main program to call factorial function. */factorial function. */

#include <stdlib.h>#include <stdlib.h>#include <stdio.h>#include <stdio.h>

int factorial(int p);int factorial(int p);

int main()int main(){{ int n;int n;

scanf("%d", &n);scanf("%d", &n);

printf("%d", factorial(n));printf("%d", factorial(n));

exit(0);exit(0);}}

.text.textmain:main: # 1 * 4 = 4 bytes local. # 1 * 4 = 4 bytes local. move $fp, $spmove $fp, $sp subu $sp, $sp, 4subu $sp, $sp, 4

li $v0, 5li $v0, 5 syscallsyscall sw $v0, -4($fp) sw $v0, -4($fp) # n# n

# Call factorial.# Call factorial. # 1 * 4 = 4 bytes arg.# 1 * 4 = 4 bytes arg. subu $sp, $sp, 4subu $sp, $sp, 4 lw $t0, -4($fp) lw $t0, -4($fp) # n# n sw $t0, 0($sp) sw $t0, 0($sp) # arg 1# arg 1 jal factorialjal factorial # Clear argument.# Clear argument. addu $sp, $sp, 4addu $sp, $sp, 4 move $a0, $v0move $a0, $v0 # returned # returned li $v0, 1 li $v0, 1 # print int# print int syscallsyscall

# deallocate main’s locals# deallocate main’s locals add $sp, $sp, 4add $sp, $sp, 4 li $v0, 10 li $v0, 10 # exit# exit syscallsyscall

04/18/23 CSE1303 Part B lecture notes 35

Recursion example: calleeRecursion example: callee/* The factorial function. *//* The factorial function. */

int factorial(int p)int factorial(int p){{ int result;int result;

if (p <= 1)if (p <= 1) {{ /* Base case. *//* Base case. */ result = 1;result = 1; }} elseelse {{ /* Recursive case. *//* Recursive case. */ result =result = factorial(p-1) * p;factorial(p-1) * p; }}

return result;return result;}}

04/18/23 CSE1303 Part B lecture notes 36

Recursion example: calleeRecursion example: callee/* The factorial function. *//* The factorial function. */

int factorial(int p)int factorial(int p){{ int result;int result;

......

330x7FFF001C0x7FFF001C

0x7FFF00180x7FFF0018

0x7FFF00140x7FFF0014

0x7FFF00100x7FFF0010

0x7FFF000C0x7FFF000C

0x7FFF00080x7FFF0008

0x7FFF00040x7FFF0004

0x7FFF00000x7FFF0000

0x7FFEFFFC0x7FFEFFFC

0x7FFEFFF80x7FFEFFF8

0x7FFEFFF40x7FFEFFF4

0x7FFEFFF00x7FFEFFF0

0x7FFEFFEC0x7FFEFFEC

0x7FFEFFE80x7FFEFFE8

nn

$fp$fp = 0x7FFF000C = 0x7FFF000C

$sp$sp = 0x7FFF0008 = 0x7FFF0008

33pp

0x004000480x00400048saved $rasaved $ra

0x7FFF001C0x7FFF001Csaved $fpsaved $fp??????resultresult

resultresult is at is at -4($fp)-4($fp)

pp is at is at 8($fp)8($fp)

04/18/23 CSE1303 Part B lecture notes 37

Recursion example: calleeRecursion example: callee/* The factorial function. *//* The factorial function. */

int factorial(int p)int factorial(int p){{ int result;int result;

if (p <= 1)if (p <= 1) {{ /* Base case. *//* Base case. */ result = 1;result = 1; }} elseelse {{ /* Recursive case. *//* Recursive case. */ result =result = factorial(p-1) * p;factorial(p-1) * p; }}

return result;return result;}}

factorial: factorial: # Function entry.# Function entry. subu $sp, $sp, 8subu $sp, $sp, 8 sw $ra, 4($sp)sw $ra, 4($sp) sw $fp, 0($sp)sw $fp, 0($sp) move $fp, $spmove $fp, $sp # 1 * 4 = 4 bytes local.# 1 * 4 = 4 bytes local. subu $sp, $sp, 4subu $sp, $sp, 4

# if (p <= 1) ...# if (p <= 1) ... lw $t0, 8($fp) # plw $t0, 8($fp) # p bgt $t0, 1, recbgt $t0, 1, rec

# result = 1# result = 1 li $t0, 1li $t0, 1 sw $t0, -4($fp) sw $t0, -4($fp) # result# result j endj end

# Continued ...# Continued ...

04/18/23 CSE1303 Part B lecture notes 38

Recursion example: calleeRecursion example: callee/* The factorial function. *//* The factorial function. */

int factorial(int p)int factorial(int p){{ int result;int result;

if (p <= 1)if (p <= 1) {{ /* Base case. *//* Base case. */ result = 1;result = 1; }} elseelse {{ /* Recursive case. *//* Recursive case. */ result =result = factorial(p-1) * p;factorial(p-1) * p; }}

return result;return result;}}

factorial: factorial: # Function entry.# Function entry. subu $sp, $sp, 8subu $sp, $sp, 8 sw $ra, 4($sp)sw $ra, 4($sp) sw $fp, 0($sp)sw $fp, 0($sp) move $fp, $spmove $fp, $sp # 1 * 4 = 4 bytes local.# 1 * 4 = 4 bytes local. subu $sp, $sp, 4subu $sp, $sp, 4

# if (p <= 1) ...# if (p <= 1) ... lw $t0, 8($fp) # plw $t0, 8($fp) # p bgt $t0, 1, recbgt $t0, 1, rec

# result = 1# result = 1 li $t0, 1li $t0, 1 sw $t0, -4($fp) sw $t0, -4($fp) # result# result j endj end

# Continued ...# Continued ...

04/18/23 CSE1303 Part B lecture notes 39

Recursion example: calleeRecursion example: callee/* The factorial function. *//* The factorial function. */

int factorial(int p)int factorial(int p){{ int result;int result;

if (p <= 1)if (p <= 1) {{ /* Base case. *//* Base case. */ result = 1;result = 1; }} elseelse {{ /* Recursive case. *//* Recursive case. */ result =result = factorial(p-1) * p;factorial(p-1) * p; }}

return result;return result;}}

# # ... Continued... Continuedrec: rec: # Recursive call.# Recursive call. # 1 * 4 = 4 bytes arg.# 1 * 4 = 4 bytes arg. subu $sp, $sp, 4subu $sp, $sp, 4

# argument 1 = p-1# argument 1 = p-1 lw $t0, 8($fp) lw $t0, 8($fp) # p# p sub $t0, $t0, 1 sub $t0, $t0, 1 # p-1# p-1 sw $t0, 0($sp) sw $t0, 0($sp) # arg 1# arg 1

jal factorialjal factorial

# Clean up argument.# Clean up argument. addu $sp, $sp, 4addu $sp, $sp, 4

# Multiply by p.# Multiply by p. lw $t0, 8($fp) lw $t0, 8($fp) # p# p mul $t0, $v0, $t0mul $t0, $v0, $t0 # Store result.# Store result. sw $t0, -4($fp) sw $t0, -4($fp) # result# result

# Continued ...# Continued ...

04/18/23 CSE1303 Part B lecture notes 40

Recursion example: calleeRecursion example: callee/* The factorial function. *//* The factorial function. */

int factorial(int p)int factorial(int p){{ int result;int result;

if (p <= 1)if (p <= 1) {{ /* Base case. *//* Base case. */ result = 1;result = 1; }} elseelse {{ /* Recursive case. *//* Recursive case. */ result =result = factorial(p-1) * p;factorial(p-1) * p; }}

return result;return result;}}

# # ... Continued... Continuedrec: rec: # Recursive call.# Recursive call. # 1 * 4 = 4 bytes arg.# 1 * 4 = 4 bytes arg. subu $sp, $sp, 4subu $sp, $sp, 4

# argument 1 = p-1# argument 1 = p-1 lw $t0, 8($fp) lw $t0, 8($fp) # p# p sub $t0, $t0, 1 sub $t0, $t0, 1 # p-1# p-1 sw $t0, 0($sp) sw $t0, 0($sp) # arg 1# arg 1

jal factorialjal factorial

# Clean up argument.# Clean up argument. addu $sp, $sp, 4addu $sp, $sp, 4

# Multiply by p.# Multiply by p. lw $t0, 8($fp) lw $t0, 8($fp) # p# p mul $t0, $v0, $t0mul $t0, $v0, $t0 # Store result.# Store result. sw $t0, -4($fp) sw $t0, -4($fp) # result# result

# Continued ...# Continued ...

04/18/23 CSE1303 Part B lecture notes 41

Recursion example: calleeRecursion example: callee/* The factorial function. *//* The factorial function. */

int factorial(int p)int factorial(int p){{ int result;int result;

if (p <= 1)if (p <= 1) {{ /* Base case. *//* Base case. */ result = 1;result = 1; }} elseelse {{ /* Recursive case. *//* Recursive case. */ result =result = factorial(p-1) * p;factorial(p-1) * p; }}

return result;return result;}}

# # ... Continued again... Continued again

end: # return resultend: # return result lw $v0, -4($fp) # resultlw $v0, -4($fp) # result

# Destroy local variable# Destroy local variable addu $sp, $sp, 4addu $sp, $sp, 4

# Function exit.# Function exit. lw $fp, 0($sp)lw $fp, 0($sp) lw $ra, 4($lw $ra, 4($ssp)p) addu $sp, $sp, 8addu $sp, $sp, 8 jr $rajr $ra

04/18/23 CSE1303 Part B lecture notes 42

Recursion example: calleeRecursion example: callee/* The factorial function. *//* The factorial function. */

int factorial(int p)int factorial(int p){{ int result;int result;

if (p <= 1)if (p <= 1) {{ /* Base case. *//* Base case. */ result = 1;result = 1; }} elseelse {{ /* Recursive case. *//* Recursive case. */ result =result = factorial(p-1) * p;factorial(p-1) * p; }}

return result;return result;}}

# # ... Continued again... Continued again

end: # return resultend: # return result lw $v0, -4($fp) # resultlw $v0, -4($fp) # result

# Destroy local variable# Destroy local variable addu $sp, $sp, 4addu $sp, $sp, 4

# Function exit.# Function exit. lw $fp, 0($sp)lw $fp, 0($sp) lw $ra, 4($lw $ra, 4($ssp)p) addu $sp, $sp, 8addu $sp, $sp, 8 jr $rajr $ra

04/18/23 CSE1303 Part B lecture notes 43

RecursionRecursion

0x7FFF001C0x7FFF001C

0x7FFF00180x7FFF0018

0x7FFF00140x7FFF0014

0x7FFF00100x7FFF0010

0x7FFF000C0x7FFF000C

0x7FFF00080x7FFF0008

0x7FFF00040x7FFF0004

0x7FFF00000x7FFF0000

0x7FFEFFFC0x7FFEFFFC

0x7FFEFFF80x7FFEFFF8

0x7FFEFFF40x7FFEFFF4

0x7FFEFFF00x7FFEFFF0

0x7FFEFFEC0x7FFEFFEC

0x7FFEFFE80x7FFEFFE8

$fp$fp = 0x7FFF001C = 0x7FFF001C

$sp$sp = 0x7FFF0018 = 0x7FFF0018 stack frame stack frame of of mainmain

during during mainmain, about , about to call to call

factorial(3)factorial(3)

33nn

04/18/23 CSE1303 Part B lecture notes 44

RecursionRecursion

33

0x7FFF001C0x7FFF001C

0x7FFF00180x7FFF0018

0x7FFF00140x7FFF0014

0x7FFF00100x7FFF0010

0x7FFF000C0x7FFF000C

0x7FFF00080x7FFF0008

0x7FFF00040x7FFF0004

0x7FFF00000x7FFF0000

0x7FFEFFFC0x7FFEFFFC

0x7FFEFFF80x7FFEFFF8

0x7FFEFFF40x7FFEFFF4

0x7FFEFFF00x7FFEFFF0

0x7FFEFFEC0x7FFEFFEC

0x7FFEFFE80x7FFEFFE8

arg 1 (p)arg 1 (p)

$fp$fp = 0x7FFF001C = 0x7FFF001C

$sp$sp = 0x7FFF0014 = 0x7FFF0014

stack frame stack frame of of mainmain

passing argument passing argument to to factorial(3)factorial(3), ,

just before just before jaljal

33nn

04/18/23 CSE1303 Part B lecture notes 45

RecursionRecursion

33

0x7FFF001C0x7FFF001C

0x7FFF00180x7FFF0018

0x7FFF00140x7FFF0014

0x7FFF00100x7FFF0010

0x7FFF000C0x7FFF000C

0x7FFF00080x7FFF0008

0x7FFF00040x7FFF0004

0x7FFF00000x7FFF0000

0x7FFEFFFC0x7FFEFFFC

0x7FFEFFF80x7FFEFFF8

0x7FFEFFF40x7FFEFFF4

0x7FFEFFF00x7FFEFFF0

0x7FFEFFEC0x7FFEFFEC

0x7FFEFFE80x7FFEFFE8

arg 1 (p)arg 1 (p)

$fp$fp = 0x7FFF000C = 0x7FFF000C

stack stack frame of frame of mainmain

after entry to after entry to factorial(3)factorial(3)

33nn

0x004000480x00400048saved $rasaved $ra

0x7FFF001C0x7FFF001Csaved $fpsaved $fp??????resultresult$sp$sp = 0x7FFF0008 = 0x7FFF0008

stack frame of stack frame of factorial(3)factorial(3)

pp > 1, so must > 1, so must recurserecurse

04/18/23 CSE1303 Part B lecture notes 46

RecursionRecursion

33

0x7FFF001C0x7FFF001C

0x7FFF00180x7FFF0018

0x7FFF00140x7FFF0014

0x7FFF00100x7FFF0010

0x7FFF000C0x7FFF000C

0x7FFF00080x7FFF0008

0x7FFF00040x7FFF0004

0x7FFF00000x7FFF0000

0x7FFEFFFC0x7FFEFFFC

0x7FFEFFF80x7FFEFFF8

0x7FFEFFF40x7FFEFFF4

0x7FFEFFF00x7FFEFFF0

0x7FFEFFEC0x7FFEFFEC

0x7FFEFFE80x7FFEFFE8

arg 1 (p)arg 1 (p)

$fp$fp = 0x7FFF000C = 0x7FFF000C

stack stack frame of frame of mainmain

about to call about to call factorial(2)factorial(2)

33nn

0x004000480x00400048saved $rasaved $ra

0x7FFF001C0x7FFF001Csaved $fpsaved $fp??????resultresult

$sp$sp = 0x7FFF0004 = 0x7FFF0004

stack frame of stack frame of factorial(3)factorial(3)

22arg 1 (p)arg 1 (p)

04/18/23 CSE1303 Part B lecture notes 47

RecursionRecursion

33

0x7FFF001C0x7FFF001C

0x7FFF00180x7FFF0018

0x7FFF00140x7FFF0014

0x7FFF00100x7FFF0010

0x7FFF000C0x7FFF000C

0x7FFF00080x7FFF0008

0x7FFF00040x7FFF0004

0x7FFF00000x7FFF0000

0x7FFEFFFC0x7FFEFFFC

0x7FFEFFF80x7FFEFFF8

0x7FFEFFF40x7FFEFFF4

0x7FFEFFF00x7FFEFFF0

0x7FFEFFEC0x7FFEFFEC

0x7FFEFFE80x7FFEFFE8

arg 1 (p)arg 1 (p)

$fp$fp = 0x7FFEFFFC = 0x7FFEFFFC

stack stack frame of frame of mainmain

after entry to after entry to factorial(2)factorial(2)

33nn

0x004000480x00400048saved $rasaved $ra

0x7FFF001C0x7FFF001Csaved $fpsaved $fp??????resultresult

$sp$sp = 0x7FFEFFF8 = 0x7FFEFFF8

stack frame of stack frame of factorial(2)factorial(2)

22arg 1 (p)arg 1 (p)

0x004000B40x004000B4saved $rasaved $ra

0x7FFF000C0x7FFF000Csaved $fpsaved $fp

??????resultresult

stack frame of stack frame of factorial(3)factorial(3)

pp > 1, so > 1, so must must

recurserecurse

04/18/23 CSE1303 Part B lecture notes 48

RecursionRecursion

33

0x7FFF001C0x7FFF001C

0x7FFF00180x7FFF0018

0x7FFF00140x7FFF0014

0x7FFF00100x7FFF0010

0x7FFF000C0x7FFF000C

0x7FFF00080x7FFF0008

0x7FFF00040x7FFF0004

0x7FFF00000x7FFF0000

0x7FFEFFFC0x7FFEFFFC

0x7FFEFFF80x7FFEFFF8

0x7FFEFFF40x7FFEFFF4

0x7FFEFFF00x7FFEFFF0

0x7FFEFFEC0x7FFEFFEC

0x7FFEFFE80x7FFEFFE8

arg 1 (p)arg 1 (p)

$fp$fp = 0x7FFEFFFC = 0x7FFEFFFC

stack stack frame of frame of mainmain

about to call about to call factorial(1)factorial(1)

33nn

0x004000480x00400048saved $rasaved $ra

0x7FFF001C0x7FFF001Csaved $fpsaved $fp??????resultresult

$sp$sp = 0x7FFEFFF4 = 0x7FFEFFF4

stack frame of stack frame of factorial(2)factorial(2)

22arg 1 (p)arg 1 (p)

0x004000B40x004000B4saved $rasaved $ra

0x7FFF000C0x7FFF000Csaved $fpsaved $fp

??????resultresult

stack frame of stack frame of factorial(3)factorial(3)

11arg 1 (p)arg 1 (p)

04/18/23 CSE1303 Part B lecture notes 49

RecursionRecursion

33

0x7FFF001C0x7FFF001C

0x7FFF00180x7FFF0018

0x7FFF00140x7FFF0014

0x7FFF00100x7FFF0010

0x7FFF000C0x7FFF000C

0x7FFF00080x7FFF0008

0x7FFF00040x7FFF0004

0x7FFF00000x7FFF0000

0x7FFEFFFC0x7FFEFFFC

0x7FFEFFF80x7FFEFFF8

0x7FFEFFF40x7FFEFFF4

0x7FFEFFF00x7FFEFFF0

0x7FFEFFEC0x7FFEFFEC

0x7FFEFFE80x7FFEFFE8

arg 1 (p)arg 1 (p)

$fp$fp = 0x7FFEFFEC = 0x7FFEFFEC

stack stack frame of frame of mainmain

after entry to after entry to factorial(1)factorial(1)

33nn

0x004000480x00400048saved $rasaved $ra

0x7FFF001C0x7FFF001Csaved $fpsaved $fp??????resultresult

$sp$sp = 0x7FFEFFE8 = 0x7FFEFFE8

stack frame of stack frame of factorial(2)factorial(2)

22arg 1 (p)arg 1 (p)

0x004000B40x004000B4saved $rasaved $ra

0x7FFF000C0x7FFF000Csaved $fpsaved $fp

??????resultresult

stack frame of stack frame of factorial(3)factorial(3)

11arg 1 (p)arg 1 (p)

0x004000B40x004000B4saved $rasaved $ra

0x7FFEFFFC0x7FFEFFFCsaved $fpsaved $fp??????resultresult

stack frame of stack frame of factorial(1)factorial(1)

pp <= 1, so <= 1, so resultresult = 1 = 1

04/18/23 CSE1303 Part B lecture notes 50

RecursionRecursion

33

0x7FFF001C0x7FFF001C

0x7FFF00180x7FFF0018

0x7FFF00140x7FFF0014

0x7FFF00100x7FFF0010

0x7FFF000C0x7FFF000C

0x7FFF00080x7FFF0008

0x7FFF00040x7FFF0004

0x7FFF00000x7FFF0000

0x7FFEFFFC0x7FFEFFFC

0x7FFEFFF80x7FFEFFF8

0x7FFEFFF40x7FFEFFF4

0x7FFEFFF00x7FFEFFF0

0x7FFEFFEC0x7FFEFFEC

0x7FFEFFE80x7FFEFFE8

arg 1 (p)arg 1 (p)

$fp$fp = 0x7FFEFFEC = 0x7FFEFFEC

stack stack frame of frame of mainmain

about to about to return from return from

factorial(1)factorial(1)

33nn

0x004000480x00400048saved $rasaved $ra

0x7FFF001C0x7FFF001Csaved $fpsaved $fp??????resultresult

$sp$sp = 0x7FFEFFE8 = 0x7FFEFFE8

stack frame of stack frame of factorial(2)factorial(2)

22arg 1 (p)arg 1 (p)

0x004000B40x004000B4saved $rasaved $ra

0x7FFF000C0x7FFF000Csaved $fpsaved $fp

??????resultresult

stack frame of stack frame of factorial(3)factorial(3)

11arg 1 (p)arg 1 (p)

0x004000B40x004000B4saved $rasaved $ra

0x7FFEFFFC0x7FFEFFFCsaved $fpsaved $fp11resultresult

stack frame of stack frame of factorial(1)factorial(1)

return return result result (1) (1)

in in $v0$v0

$v0$v0 = 1 = 1

04/18/23 CSE1303 Part B lecture notes 51

RecursionRecursion

33

0x7FFF001C0x7FFF001C

0x7FFF00180x7FFF0018

0x7FFF00140x7FFF0014

0x7FFF00100x7FFF0010

0x7FFF000C0x7FFF000C

0x7FFF00080x7FFF0008

0x7FFF00040x7FFF0004

0x7FFF00000x7FFF0000

0x7FFEFFFC0x7FFEFFFC

0x7FFEFFF80x7FFEFFF8

0x7FFEFFF40x7FFEFFF4

0x7FFEFFF00x7FFEFFF0

0x7FFEFFEC0x7FFEFFEC

0x7FFEFFE80x7FFEFFE8

arg 1 (p)arg 1 (p)

$fp$fp = 0x7FFEFFFC = 0x7FFEFFFC

stack stack frame of frame of mainmain

returned back returned back to to

factorial(2)factorial(2)

33nn

0x004000480x00400048saved $rasaved $ra

0x7FFF001C0x7FFF001Csaved $fpsaved $fp??????resultresult

stack frame of stack frame of factorial(2)factorial(2)

22arg 1 (p)arg 1 (p)

0x004000B40x004000B4saved $rasaved $ra

0x7FFF000C0x7FFF000Csaved $fpsaved $fp

22resultresult

stack frame of stack frame of factorial(3)factorial(3)

resultresult = = return value return value (1) × (1) × pp (2) (2)

$v0$v0 = 1 = 1

$sp$sp = 0x7FFEFFF8 = 0x7FFEFFF8

04/18/23 CSE1303 Part B lecture notes 52

RecursionRecursion

33

0x7FFF001C0x7FFF001C

0x7FFF00180x7FFF0018

0x7FFF00140x7FFF0014

0x7FFF00100x7FFF0010

0x7FFF000C0x7FFF000C

0x7FFF00080x7FFF0008

0x7FFF00040x7FFF0004

0x7FFF00000x7FFF0000

0x7FFEFFFC0x7FFEFFFC

0x7FFEFFF80x7FFEFFF8

0x7FFEFFF40x7FFEFFF4

0x7FFEFFF00x7FFEFFF0

0x7FFEFFEC0x7FFEFFEC

0x7FFEFFE80x7FFEFFE8

arg 1 (p)arg 1 (p)

$fp$fp = 0x7FFEFFFC = 0x7FFEFFFC

stack stack frame of frame of mainmain

about to return about to return from from

factorial(2)factorial(2)

33nn

0x004000480x00400048saved $rasaved $ra

0x7FFF001C0x7FFF001Csaved $fpsaved $fp??????resultresult

$sp$sp = 0x7FFEFFF8 = 0x7FFEFFF8

stack frame of stack frame of factorial(2)factorial(2)

22arg 1 (p)arg 1 (p)

0x004000B40x004000B4saved $rasaved $ra

0x7FFF000C0x7FFF000Csaved $fpsaved $fp

22resultresult

stack frame of stack frame of factorial(3)factorial(3)

$v0$v0 = 2 = 2

return return result result (2) (2)

in in $v0$v0

04/18/23 CSE1303 Part B lecture notes 53

RecursionRecursion

33

0x7FFF001C0x7FFF001C

0x7FFF00180x7FFF0018

0x7FFF00140x7FFF0014

0x7FFF00100x7FFF0010

0x7FFF000C0x7FFF000C

0x7FFF00080x7FFF0008

0x7FFF00040x7FFF0004

0x7FFF00000x7FFF0000

0x7FFEFFFC0x7FFEFFFC

0x7FFEFFF80x7FFEFFF8

0x7FFEFFF40x7FFEFFF4

0x7FFEFFF00x7FFEFFF0

0x7FFEFFEC0x7FFEFFEC

0x7FFEFFE80x7FFEFFE8

arg 1 (p)arg 1 (p)

$fp$fp = 0x7FF = 0x7FFF000CF000C

stack stack frame of frame of mainmain

returned back returned back to to

factorial(3)factorial(3)

33nn

0x004000480x00400048saved $rasaved $ra

0x7FFF001C0x7FFF001Csaved $fpsaved $fp66resultresult

stack frame of stack frame of factorial(3)factorial(3)

$v0$v0 = 2 = 2

resultresult = = return value return value (2) × (2) × pp (3) (3)

$sp$sp = 0x7FF = 0x7FFF0008F0008

04/18/23 CSE1303 Part B lecture notes 54

RecursionRecursion

33

0x7FFF001C0x7FFF001C

0x7FFF00180x7FFF0018

0x7FFF00140x7FFF0014

0x7FFF00100x7FFF0010

0x7FFF000C0x7FFF000C

0x7FFF00080x7FFF0008

0x7FFF00040x7FFF0004

0x7FFF00000x7FFF0000

0x7FFEFFFC0x7FFEFFFC

0x7FFEFFF80x7FFEFFF8

0x7FFEFFF40x7FFEFFF4

0x7FFEFFF00x7FFEFFF0

0x7FFEFFEC0x7FFEFFEC

0x7FFEFFE80x7FFEFFE8

arg 1 (p)arg 1 (p)

$fp$fp = 0x7FF = 0x7FFF000CF000C

stack stack frame of frame of mainmain

about to return about to return fromfrom

factorial(factorial(33))

33nn

0x004000480x00400048saved $rasaved $ra

0x7FFF001C0x7FFF001Csaved $fpsaved $fp66resultresult$sp$sp = 0x7FF = 0x7FFF0008F0008

stack frame of stack frame of factorial(3)factorial(3)

$v0$v0 = = 66

return return resultresult in in

$v0$v0

04/18/23 CSE1303 Part B lecture notes 55

RecursionRecursion

0x7FFF001C0x7FFF001C

0x7FFF00180x7FFF0018

0x7FFF00140x7FFF0014

0x7FFF00100x7FFF0010

0x7FFF000C0x7FFF000C

0x7FFF00080x7FFF0008

0x7FFF00040x7FFF0004

0x7FFF00000x7FFF0000

0x7FFEFFFC0x7FFEFFFC

0x7FFEFFF80x7FFEFFF8

0x7FFEFFF40x7FFEFFF4

0x7FFEFFF00x7FFEFFF0

0x7FFEFFEC0x7FFEFFEC

0x7FFEFFE80x7FFEFFE8

$fp$fp = 0x7FF = 0x7FFF001CF001C

33nn

$v0$v0 = = 66

returned back to returned back to mainmain

stack stack frame of frame of mainmain

$sp$sp = 0x7FF = 0x7FFF0018F0018

print out return print out return value in value in $v0$v0 (6) (6)

04/18/23 CSE1303 Part B lecture notes 56

RecursionRecursion

0x7FFF001C0x7FFF001C

0x7FFF00180x7FFF0018

0x7FFF00140x7FFF0014

0x7FFF00100x7FFF0010

0x7FFF000C0x7FFF000C

0x7FFF00080x7FFF0008

0x7FFF00040x7FFF0004

0x7FFF00000x7FFF0000

0x7FFEFFFC0x7FFEFFFC

0x7FFEFFF80x7FFEFFF8

0x7FFEFFF40x7FFEFFF4

0x7FFEFFF00x7FFEFFF0

0x7FFEFFEC0x7FFEFFEC

0x7FFEFFE80x7FFEFFE8

$fp$fp = 0x7FF = 0x7FFF001CF001C

33nn$sp$sp = 0x7FF = 0x7FFF0018F0018

$v0$v0 = = 66

print out return print out return value in value in $v0$v0 (6) (6)

stack stack frame of frame of mainmain

04/18/23 CSE1303 Part B lecture notes 57

Covered in this lectureCovered in this lecture

Accessing function parametersAccessing function parameters Returning from functionsReturning from functions RecursionRecursion

04/18/23 CSE1303 Part B lecture notes 58

Going furtherGoing further

Official MIPS stack frame Official MIPS stack frame conventionconvention doesn’t use doesn’t use $fp$fp at all! at all! slightly more efficient than CSE1303 slightly more efficient than CSE1303

conventionconvention can be generated by compilerscan be generated by compilers hard for humans to write/understandhard for humans to write/understand

04/18/23 CSE1303 Part B lecture notes 59

Next timeNext time

Analysis of translationAnalysis of translation efficiencyefficiency

How to write better C codeHow to write better C code

Reading:Reading:

Lecture notes section B16Lecture notes section B16