Function Calling Conventions 2 CS 64: Computer Organization and Design Logic Lecture #10

Similar documents
Functions and the MIPS Calling Convention 2 CS 64: Computer Organization and Design Logic Lecture #11

Using the MIPS Calling Convention. Recursive Functions in Assembly. CS 64: Computer Organization and Design Logic Lecture #10 Fall 2018

Function Calling Conventions 1 CS 64: Computer Organization and Design Logic Lecture #9

CS64 Week 5 Lecture 1. Kyle Dewey

MIPS Assembly: More about MIPS Instructions Using Functions in MIPS CS 64: Computer Organization and Design Logic Lecture #8

CSE Lecture In Class Example Handout

Implementing Procedure Calls

Lecture 5. Announcements: Today: Finish up functions in MIPS

CS61C Machine Structures. Lecture 12 - MIPS Procedures II & Logical Ops. 2/13/2006 John Wawrzynek. www-inst.eecs.berkeley.

Functions in MIPS. Functions in MIPS 1

MIPS Procedure Calls. Lecture 6 CS301

Subroutines. int main() { int i, j; i = 5; j = celtokel(i); i = j; return 0;}

COMP2611: Computer Organization MIPS function and recursion

COMP 303 Computer Architecture Lecture 3. Comp 303 Computer Architecture

Lectures 5. Announcements: Today: Oops in Strings/pointers (example from last time) Functions in MIPS

Function Calls. 1 Administrivia. Tom Kelliher, CS 240. Feb. 13, Announcements. Collect homework. Assignment. Read

comp 180 Lecture 10 Outline of Lecture Procedure calls Saving and restoring registers Summary of MIPS instructions

Today. Putting it all together

EN164: Design of Computing Systems Lecture 11: Processor / ISA 4

Procedures and Stacks

Function Calls. Tom Kelliher, CS 220. Oct. 24, SPIM programs due Wednesday. Refer to homework handout for what to turn in, and how.

Procedure Calls Main Procedure. MIPS Calling Convention. MIPS-specific info. Procedure Calls. MIPS-specific info who cares? Chapter 2.7 Appendix A.

CS 316: Procedure Calls/Pipelining

Memory Usage 0x7fffffff. stack. dynamic data. static data 0x Code Reserved 0x x A software convention

See P&H 2.8 and 2.12, and A.5-6. Prof. Hakim Weatherspoon CS 3410, Spring 2015 Computer Science Cornell University

MIPS Assembly (Functions)

Code Generation. Lecture 12

The Activation Record (AR)

Instruction Set Architectures (4)

We can emit stack-machine-style code for expressions via recursion

Code Generation. The Main Idea of Today s Lecture. We can emit stack-machine-style code for expressions via recursion. Lecture Outline.

2/16/2018. Procedures, the basic idea. MIPS Procedure convention. Example: compute multiplication. Re-write it as a MIPS procedure

MIPS Functions and Instruction Formats

Calling Conventions. Hakim Weatherspoon CS 3410, Spring 2012 Computer Science Cornell University. See P&H 2.8 and 2.12

Functions and Procedures

(More) Fun with Pointers and Linked Lists! CS 16: Solving Problems with Computers I Lecture #17

MIPS Functions and the Runtime Stack

CS61C : Machine Structures

CS 61c: Great Ideas in Computer Architecture

Programming with Arrays Intro to Pointers CS 16: Solving Problems with Computers I Lecture #11

CSE Lecture In Class Example Handout

SPIM Procedure Calls

ECE331: Hardware Organization and Design

Compilers and computer architecture: A realistic compiler to MIPS

Code Generation. Lecture 19

Control Instructions. Computer Organization Architectures for Embedded Computing. Thursday, 26 September Summary

Control Instructions

CSCI 402: Computer Architectures. Instructions: Language of the Computer (3) Fengguang Song Department of Computer & Information Science IUPUI.

Lecture Outline. Topic 1: Basic Code Generation. Code Generation. Lecture 12. Topic 2: Code Generation for Objects. Simulating a Stack Machine

ECE232: Hardware Organization and Design

Code Generation. Lecture 30

MIPS Programming. A basic rule is: try to be mechanical (that is, don't be "tricky") when you translate high-level code into assembler code.

Course Administration

Language of the Machine Recursive functions

ECE260: Fundamentals of Computer Engineering

MIPS Assembly: Practice Questions for Midterm 1 Saving to and Loading from Memory CS 64: Computer Organization and Design Logic Lecture #6

Midterm II CS164, Spring 2006

Lecture Outline. Code Generation. Lecture 30. Example of a Stack Machine Program. Stack Machines

Anne Bracy CS 3410 Computer Science Cornell University

MIPS function continued

CS61C : Machine Structures

Review Session 1 Fri. Jan 19, 2:15 pm 3:05 pm Thornton 102

CS 164, Midterm #2, Spring O, M, C - e1 : Bool O, M, C - e2 : t2 O, M, C - e2 : T3 O, M, C - if e1 then e2 else e3 fi : T2 _ T3

Homework 9: Stack Frame

MIPS Assembly (FuncDons)

Binary Arithmetic Intro to Assembly Language CS 64: Computer Organization and Design Logic Lecture #3

More Examples Using Functions and Command-Line Arguments in C++ CS 16: Solving Problems with Computers I Lecture #6

Mark Redekopp, All rights reserved. EE 352 Unit 6. Stack Frames Recursive Routines

Arguments and Return Values. EE 109 Unit 16 Stack Frames. Assembly & HLL s. Arguments and Return Values

Lecture 5: Procedure Calls

The plot thickens. Some MIPS instructions you can write cannot be translated to a 32-bit number

Lecture 7: Procedures

ECE 30 Introduction to Computer Engineering

2B 52 AB CA 3E A1 +29 A B C. CS120 Fall 2018 Final Prep and super secret quiz 9

MIPS Assembly (FuncDons)

6.004 Tutorial Problems L3 Procedures and Stacks

CS 61C: Great Ideas in Computer Architecture Strings and Func.ons. Anything can be represented as a number, i.e., data or instruc\ons

CENG3420 Computer Organization and Design Lab 1-2: System calls and recursions

Announcements. Class 7: Intro to SRC Simulator Procedure Calls HLL -> Assembly. Agenda. SRC Procedure Calls. SRC Memory Layout. High Level Program

Computer Science 2500 Computer Organization Rensselaer Polytechnic Institute Spring Topic Notes: MIPS Programming

The plot thickens. Some MIPS instructions you can write cannot be translated to a 32-bit number

CS 110 Computer Architecture MIPS Instruction Formats

Branch Addressing. Jump Addressing. Target Addressing Example. The University of Adelaide, School of Computer Science 28 September 2015

MIPS Datapath. MIPS Registers (and the conventions associated with them) MIPS Instruction Types

CS61C : Machine Structures

Anne Bracy CS 3410 Computer Science Cornell University

CS153: Compilers Lecture 8: Compiling Calls

MIPS Assembly: More about Memory and Instructions CS 64: Computer Organization and Design Logic Lecture #7

Procedure Call and Return Procedure call

Lectures 3-4: MIPS instructions

ECE550 PRACTICE Midterm

CS 61c: Great Ideas in Computer Architecture

Lecture 7: Procedures and Program Execution Preview

CS 61C: Great Ideas in Computer Architecture More MIPS, MIPS Functions

Review of Activation Frames. FP of caller Y X Return value A B C

Computer Systems and Networks

Bonus slides. Garcia, Spring 2014 UCB. CS61C L11 Introduction to MIPS : Procedures II & Logical Ops (18)

Chapter 2. Computer Abstractions and Technology. Lesson 4: MIPS (cont )

CS 341L Fall 2009 Lab 3

CS 110 Computer Architecture Lecture 6: More MIPS, MIPS Functions

Transcription:

Function Calling Conventions 2 CS 64: Computer Organization and Design Logic Lecture #10 Ziad Matni Dept. of Computer Science, UCSB

Lecture Outline More on MIPS Calling Convention Functions calling functions Recursive functions 5/8/18 Matni, CS64, Sp18 2

Administrative Re: Midterm Exam #1 5/8/18 Matni, CS64, Sp18 3

Administrative Mid-quarter evaluations for T.As and for Prof. Links on the last slide and will put up on Piazza too Optional to do, but very appreciated by us all! 5/8/18 Matni, CS64, Sp18 4

Any Questions From Last Lecture? 5/8/18 Matni, CS64, Sp18 5

Is-Not-A-Quiz-But-You-Should- Consider this C/C++ code: void third() {} void second() {third();} void first() {second();} int main() {first();} And consider this supposedly equivalent MIPS code è è a) Are there any errors in it? (i.e. will it run?) Think-About-It b) Does it follow the MIPS C.C.? EXPLAIN YOUR ANSWER third: jr $ra second: move $t0, $ra jal third jr $t0 first: move $t1, $ra jal second jr $t1 main: jal first li $v0, 10 syscall 5/8/18 Matni, CS64, Sp18 6

Lecture Outline Recapping MIPS Calling Convention Function calling function example Recursive function example 5/8/18 Matni, CS64, Sp18 7

The MIPS Convention In Its Essence Remember: Preserved vs Unpreserved Regs Preserved: $s0 - $s7, and $sp Unpreserved: $t0 - $t9, $a0 - $a3, and $v0 - $v1 Values held in Preserved Regs immediately before a function call MUST be the same immediately after the function returns. Values held in Unpreserved Regs must always be assumed to change after a function call is performed. $a0 - $a3 are for passing arguments into a function $v0 - $v1 are for passing values from a function 5/8/18 Matni, CS64, Sp18 8

An Illustrative Example int subtwo(int a, int b) { int sub = a - b; return sub; } int dosomething(int x, int y) { int a = subtwo(x, y); int b = subtwo(y, x); return a + b; } subtwo doesn t call anything What should I map a and b to? $a0 and $a1 Can I map sub to $t0? Yes, b/c I don t care about $t* Eventually, I have to have sub be $v0 dosomething DOES call a function What should I map x and y to? Since we want to preserve them across the call to subtwo, we should map them to $s0 and $s1 What should I map a and b to? a+b has to eventually be $v0. I should make at least a be a preserved reg ($s2). Since I get b back from a call and there s no other call after it, I can likely get away with not using a preserved reg for b. 5/8/18 Matni, CS64, Sp18 9

subtwo: sub $t0, $a0, $a1 move $v0, $t0 jr $ra move $s2, $v0 move $a0, $s1 move $a1, $s0 int subtwo(int a, int b) { int sub = a - b; return sub; } int dosomething(int x, int y) { int a = subtwo(x, y); int b = subtwo(y, x); return a + b; } dosomething: addiu $sp, $sp, -16 sw $s0, 0($sp) sw $s1, 4($sp) sw $s2, 8($sp) sw $ra, 12($sp) move $s0, $a0 move $s1, $a1 jal subtwo 5/8/18 jal subtwo add $v0, $v0, $s2 lw $ra, 12($sp) lw $s2, 8($sp) lw $s1, 4($sp) lw $s0, 0($sp) addiu $sp, $sp, 16 jr $ra Matni, CS64, Sp18 10

subtwo: sub $t0, $a0, $a1 move $v0, $t0 jr $ra dosomething: addiu $sp, $sp, -16 sw $s0, 0($sp) sw $s1, 4($sp) sw $s2, 8($sp) sw $ra, 12($sp) move $s0, $a0 move $s1, $a1 jal subtwo stack Orig. $s0 Orig. $s1 Orig. $s2 Orig. $ra $ra move $s2, $v0 move $a0, $s1 move $a1, $s0 jal subtwo add $v0, $v0, $s2 lw $ra, 12($sp) lw $s2, 8($sp) lw $s1, 4($sp) lw $s0, 0($sp) addiu $sp, $sp, 16 jr $ra int subtwo(int a, int b) { int sub = a - b; return sub; } int dosomething(int x, int y) { int a = subtwo(x, y); int b = subtwo(y, x); return a + b; } Arguments Preserved Unpreserved Result Value $a0 $a1 int a int b $s0 $s1 int a int b $t0 a - b $v0 a b $s2 a b

subtwo: sub $t0, $a0, $a1 move $v0, $t0 jr $ra dosomething: addiu $sp, $sp, -16 sw $s0, 0($sp) sw $s1, 4($sp) sw $s2, 8($sp) sw $ra, 12($sp) move $s0, $a0 move $s1, $a1 jal subtwo stack Orig. $s0 Orig. $s1 Orig. $s2 Orig. $ra $ra move $s2, $v0 move $a0, $s1 move $a1, $s0 jal subtwo add $v0, $v0, $s2 lw $ra, 12($sp) lw $s2, 8($sp) lw $s1, 4($sp) lw $s0, 0($sp) addiu $sp, $sp, 16 jr $ra int subtwo(int a, int b) { int sub = a - b; return sub; } int dosomething(int x, int y) { int a = subtwo(x, y); int b = subtwo(y, x); return a + b; } Arguments Preserved Unpreserved Result Value $a0 $a1 int b int a $s0 $s1 int a int b $t0 b a $v0 b a 0 $s2 a b

subtwo: sub $t0, $a0, $a1 move $v0, $t0 jr $ra dosomething: addiu $sp, $sp, -16 sw $s0, 0($sp) sw $s1, 4($sp) sw $s2, 8($sp) sw $ra, 12($sp) move $s0, $a0 move $s1, $a1 jal subtwo stack Orig. $s0 Orig. $s1 Orig. $s2 Orig. $ra $ra move $s2, $v0 move $a0, $s1 move $a1, $s0 jal subtwo add $v0, $v0, $s2 lw $ra, 12($sp) lw $s2, 8($sp) lw $s1, 4($sp) lw $s0, 0($sp) addiu $sp, $sp, 16 jr $ra Original caller $ra int subtwo(int a, int b) { int sub = a - b; return sub; } int dosomething(int x, int y) { int a = subtwo(x, y); int b = subtwo(y, x); return a + b; } Arguments Preserved Unpreserved Result Value $a0 $a1 int b int a $s0 $s1 orig. orig. $t0 b a $v0 0 $s2 orig.

Lessons Learned We passed arguments into the functions using $a* We used $s* to work out calculations in registers that we wanted to preserve, so we made sure to save them in the call stack These var values DO need to live beyond a call In the end, the original values were returned back We used $t* to work out calcs. in regs that we did not need to preserve These values DO NOT need to live beyond a function call We used $v* as regs. to return the value of the function 5/8/18 Matni, CS64, Sp18 Arguments Preserved Unpreserved Result Value $a0 $a1 int b int a $s0 $s1 orig. orig. $t0 b a $v0 0 $s2 orig.

Another Example Using Recursion 5/8/18 Matni, CS64, Sp18 15

Recursive Functions This same setup handles nested function calls and recursion i.e. By saving $ra methodically on the stack Example: recursive_fibonacci.asm 5/8/18 Matni, CS64, Sp18 16

recursive_fibonacci.asm Recall the Fibonacci Series: 0, 1, 1, 2, 3, 5, 8, 13, etc fib(n) = fib(n 1) + fib(n 2) In C/C++, we might write the recursive function as: int fib(int n) { if (n == 0) Base cases } return (0); else if (n == 1) return (1); else return (fib(n-1) + fib(n-2)); 5/8/18 Matni, CS64, Sp18 17

recursive_fibonacci.asm We ll need at least 3 registers to keep track of: The (single) input to the call, i.e. var n The output (or partial output) to the call The value of $ra (since this is a recursive function) If we make $s0 = n and $s1 = fib(n 1) Then we need to save $s0, $s1 and $ra on the stack So that we do not corrupt/lose what s already in these regs We ll use $s* registers b/c we need to preserve them beyond the function call 5/8/18 Matni, CS64, Sp18 18

recursive_fibonacci.asm First: Check for the base cases Is n ($a0) equal to 0 or 1? Next: 3 registers containing integers, means we need to plan for 3 words in the stack Push 3 words in (i.e. 12 bytes) $sp = 12 The order by which you put them in does not strictly matter, but it makes more organized sense to push $s0, $s1, then $ra $s0 $s1 Orig. s0 Orig. s1 $a0 n $sp $ra Orig. ra stack Orig. $ra Orig. $s1 Orig. $s0 Matni, CS64, Sp18 19

recursive_fibonacci.asm Next: calculate fib(n 1) Call recursively, copy output in $s1 Next: calculate fib(n 2) $s0 $s1 n fib(n-1) $a0 n $v0 fib(n-1) $ra Orig. New ra stack $sp Orig. $ra Orig. $s1 Orig. $s0 Matni, CS64, Sp18 20

recursive_fibonacci.asm Next: calculate fib(n 1) Call recursively, copy output in $s1 Next: calculate fib(n 2) Call recursively, add output to $s1 $s0 $s1 n Orig. fib(n-1) s1 $a0 n $v0 fib(n-1) fib(n-1) fib(n-2) + f (n-2) $ra New ra stack $sp Orig. $ra Orig. $s1 Orig. $s0 Matni, CS64, Sp18 21

recursive_fibonacci.asm Next: calculate fib(n 1) Call recursively, copy output in $s1 Next: calculate fib(n 2) Call recursively, add output to $s1 Next: restore registers Pop the 3 words back to $s0, $s1, and $ra Next: return to caller Issue a jr $ra instruction Note how when we leave the function and go back to the callee, we did not disturb what was in the registers previously And now we have our output where it should $s0 $s1 Orig. n s0 Orig. fib(n-1) s1 $a0 n $sp $v0 fib(n-1) + f (n-2) $ra Orig. New ra stack Orig. $ra Orig. $s1 Orig. $s0 be, in $v0 Matni, CS64, Sp18 22

Tail Recursion Check out the demo file tail_recursive_factorial.asm at home What s special about the tail recursive functions (see example)? Where the recursive call is the very last thing in the function. With the right optimization, it can use a constant stack space (no need to keep saving $ra over and over more efficient) int TRFac(int n, int accum) { if (n == 0) return accum; else return TRFac(n 1, n * accum); } For example, if you said: TRFac(4, 1) Then the program would return: TRFac(3, 4), then return TRFac(2, 12), then return TRFac(1, 24), then return TRFac(0, 24), then, since n = 0, It would return 24 5/8/18 Matni, CS64, Sp18 23

YOUR TO-DOs Finish Lab #5 by Friday! Take the online mid-term evaluations See upcoming announcement on Piazza Next lecture: Digital Logic! 5/8/18 Matni, CS64, Sp18 24

5/8/18 Matni, CS64, Sp18 25