April 2006 Saeid Nooshabadi

Slides:



Advertisements
Similar presentations
The University of Adelaide, School of Computer Science
Advertisements

Slides revised 3/25/2014 by Patrick Kelley. 2 Procedures Unlike other branching structures (loops, etc.) a Procedure has to return to where it was called.
COMP3221 lec16-function-II.1 Saeid Nooshabadi COMP 3221 Microprocessors and Embedded Systems Lectures 16 : Functions in C/ Assembly - II
1 Lecture 4: Procedure Calls Today’s topics:  Procedure calls  Large constants  The compilation process Reminder: Assignment 1 is due on Thursday.
Procedures in more detail. CMPE12cGabriel Hugh Elkaim 2 Why use procedures? –Code reuse –More readable code –Less code Microprocessors (and assembly languages)
Procedure Calls Prof. Sirer CS 316 Cornell University.
Lecture 6: MIPS Instruction Set Today’s topic –Control instructions –Procedure call/return 1.
Computer Architecture CSCE 350
CPS3340 COMPUTER ARCHITECTURE Fall Semester, /17/2013 Lecture 12: Procedures Instructor: Ashraf Yaseen DEPARTMENT OF MATH & COMPUTER SCIENCE CENTRAL.
Ch. 8 Functions.
Procedures II (1) Fall 2005 Lecture 07: Procedure Calls (Part 2)
The University of Adelaide, School of Computer Science
COMP3221 lec-12-mem-II.1 Saeid Nooshabadi COMP 3221 Microprocessors and Embedded Systems Lecture 12: Memory Access - II
 Procedures (subroutines) allow the programmer to structure programs making them : › easier to understand and debug and › allowing code to be reused.
CSCI-365 Computer Organization Lecture Note: Some slides and/or pictures in the following are adapted from: Computer Organization and Design, Patterson.
Subroutines reasons for subroutines −repeat same code, or similar code with slightly different parameters −hide design decisions or design complexity −partition.
1 CS61C L6 Machine Rep Clap if you like pizza! Pointless Poll.
1 Storage Registers vs. memory Access to registers is much faster than access to memory Goal: store as much data as possible in registers Limitations/considerations:
Register Conventions (1/4) °CalleR: the calling function °CalleE: the function being called °When callee returns from executing, the caller needs to know.
1 CS 430 Computer Architecture Clap if you like pizza! Pointless Poll.
Elec2041 lec-11-mem-I.1 Saeid Nooshabadi COMP 3221 Microprocessors and Embedded Systems Lecture 11: Memory Access - I
Lecture 6: Procedures (cont.). Procedures Review Called with a jal instruction, returns with a jr $ra Accepts up to 4 arguments in $a0, $a1, $a2 and $a3.
COMP3221 lec18-function-III.1 Saeid Nooshabadi COMP 3221 Microprocessors and Embedded Systems Lectures 17 : Functions in C/ Assembly - III
COMP3221 lec15-function-I.1 Saeid Nooshabadi COMP 3221 Microprocessors and Embedded Systems Lectures 6 : Functions in C/ Assembly - I
ELEC2041 lec18-pointers.1 Saeid Nooshabadi COMP3221/9221 Microprocessors and Interfacing Lectures 7 : Pointers & Arrays in C/ Assembly
COMP3221 lec15-function-I.1 Saeid Nooshabadi COMP 3221 Microprocessors and Embedded Systems Lectures 15 : Functions in C/ Assembly - I
Procedure Conventions & The Stack Jen-Chang Liu, Spring 2006 Adapted from
Inst.eecs.berkeley.edu/~cs61c UCB CS61C : Machine Structures Lecture 11 – Introduction to MIPS Procedures I Internet2, a non-profit advanced.
13/02/2009CA&O Lecture 04 by Engr. Umbreen Sabir Computer Architecture & Organization Instructions: Language of Computer Engr. Umbreen Sabir Computer Engineering.
Adapted from Computer Organization and Design, Patterson & Hennessy, UCB ECE232: Hardware Organization and Design Part 7: MIPS Instructions III
Topic 9: Procedures CSE 30: Computer Organization and Systems Programming Winter 2011 Prof. Ryan Kastner Dept. of Computer Science and Engineering University.
1 CS61C L6 Machine Rep CENG 311 Procedure Conventions & The Stack.
IT 251 Computer Organization and Architecture Introduction to MIPS Procedures Chia-Chi Teng.
Inst.eecs.berkeley.edu/~cs61c UCB CS61C : Machine Structures Lecture 10 – Introduction to MIPS Procedures I Apple took a bold step recently.
DR. SIMING LIU SPRING 2016 COMPUTER SCIENCE AND ENGINEERING UNIVERSITY OF NEVADA, RENO Session 12 Procedure Calling.
LECTURE 19 Subroutines and Parameter Passing. ABSTRACTION Recall: Abstraction is the process by which we can hide larger or more complex code fragments.
Subroutines reasons for subroutines −repeat same code, or similar code with slightly different parameters −hide design decisions or design complexity −partition.
Chapter 14 Functions.
Computer Architecture & Operations I
Writing Functions in Assembly
Rocky K. C. Chang Version 0.1, 25 September 2017
Storage Classes There are three places in memory where data may be placed: In Data section declared with .data in assembly language in C - Static) On the.
Computer structure: Procedure Calls
Lecture 5: Procedure Calls
© Craig Zilles (adapted from slides by Howard Huang)
Procedures 101: There and Back Again
April 2006 Saeid Nooshabadi
Introduction to Compilers Tim Teitelbaum
Procedures (Functions)
Procedures (Functions)
Writing Functions in Assembly
Chapter 9 :: Subroutines and Control Abstraction
Prof. Hakim Weatherspoon
Calling Conventions Hakim Weatherspoon CS 3410, Spring 2012
Prof. Hakim Weatherspoon
Chap. 8 :: Subroutines and Control Abstraction
Chap. 8 :: Subroutines and Control Abstraction
MIPS Instructions.
The University of Adelaide, School of Computer Science
Lecture 5: Procedure Calls
CS61C : Machine Structures Lecture 2. 2
Procedures and Calling Conventions
Procedures and addressing
April 2006 Saeid Nooshabadi
Computer Architecture
Where is all the knowledge we lost with information? T. S. Eliot
© Craig Zilles (adapted from slides by Howard Huang)
Topic 2b ISA Support for High-Level Languages
Implementing Functions: Overview
Presentation transcript:

April 2006 Saeid Nooshabadi saeid@unsw.edu.au ELEC2041 Microprocessors and Interfacing Lectures 16: Functions in C/ Assembly - II http://webct.edtec.unsw.edu.au/ April 2006 Saeid Nooshabadi saeid@unsw.edu.au

Overview Resolving Registers Conflicts Caller /Callee Responsibilities Frame/Stack pointer Conclusion

Review: Basics of Function Call Caller Callee ...(use regs) set up args jump to function access result access args ... compute result ... ...(use regs) set up return value jump back to caller

Review: Function Call Bookkeeping Procedure address Return address Arguments Return value Local variables Registers (conflicts) =>ARM Procedure Call Standards (APCS) conventions for use of registers simplify bookkeeping Registers for functions  lr = r14  a1, a2, a3, a4  a1  v1, v2,v3,v4,v5,v6,v8

Review: Instruction Support for Functions? Single instruction to branch and save return address: branch and link (bl): address 1004 mov a1,v1 ; x = a 1008 mov a2, v2 ; y = b 1012 bl sum ; lr = 1016,goto sum 1016 ... 2000 sum: add a1,a1,a2 2004 mov pc, lr

Review: APCS Register Convention: Summary register name software name use and linkage r0 – r3 a1 – a4 first 4 integer args scratch registers integer function results r4 – r11 v1- v7 local variables r9 sb static variable base r10 sl stack limit r11 fp/v8 frame pointer/local variables r12 ip intra procedure-call scratch pointer r13 sp stack pointer r14 lr return address r15 pc program counter Red are SW conventions for compilation, blue are HW ARM Procedure Call Standard (APCS)

Review: Nested Procedures A caller function is itself called from another function. We need to store lr for the caller before it can call another function. In general, may need to save some other info in addition to lr. But; Where do we save these info?

Review: C memory allocation map ¥ Address Stack Space for saved procedure information sp stack pointer Heap Explicitly created space, e.g., malloc(); C pointers Static base sb Static Variables declared once per program Code Program

Review: Typical Structure of a Stack Frame compiler calculates total frame size (F) at start of call, subtract F from SP at end, add F to SP where are args from caller? where are args for callee sp on entry  Register Save Area Caller Frame (Callee to another function) Local Variables Arguments for Callees sp during  Callee Frame

Basic Structure of a Function entry_label: sub sp,sp, #fsize ; create space on stack str lr,[sp, #fsize-4]; save lr ; save other regs ... ;restore other regs ldr lr, [sp,#fsize-4];restore lr add sp, sp, #fsize ;reclaim space on stack mov pc, lr Prologue lr Body Epilogue

Compiling nested C func into ARM (#1/2) int sumSquare(int x, int y) { return mult(x,x)+ y; } sumSquare: sub sp,sp,#8 ; space on stack str lr,[sp,#4] ; save ret addr str a2,[sp,#0] ; save y mov a2,a1 ; mult(x,x) bl mult ; call mult ldr a2,[sp,#0] ; restore y add a1,a1,a2 ; mult()+y ldr lr,[sp,#4] ; get ret addr add sp,sp,#8 ; => stack space mov pc, lr C Prologue A R M Body Epilogue

Compiling nested C func into ARM (#2/2) sumSquare: sub sp,sp,#8 str lr,[sp,#4] str a2,[sp,#0] mov a2,a1 bl mult ldr a2,[sp,#0] add a1,a1,a2 ldr lr,[sp,#4] add sp,sp,#8 mov pc, lr sp before entry to sumSquare  sumSquare Frame lr sp during sumSquare  a2 mult Frame

Compiling nested C func into ARM (Better way) int sumSquare(int x, int y) { return mult(x,x)+ y; } sumSquare: str lr,[sp,#-4]!; save ret addr str a2,[sp,#-4]!; save y mov a2,a1 ; mult(x,x) bl mult ; call mult ldr a2,[sp], #4 ; restore y add a1,a1,a2 ; mult()+y ldr lr,[sp], #4 ; get ret addr ; => stack space mov pc, lr C Prologue A R M Body Epilogue

Function Call Bookkeeping: thus far Procedure address x Return address x lr Arguments x a1 – a4 Return values x a1 – a4 Local variables x v1 – v8 Registers what if they are reused? what if there aren’t enough?

ELEC2041 Readings for Week #6 Steve Furber: ARM System On-Chip; 2nd Ed, Addison- Wesley, 2000, ISBN: 0-201-67519-6. Chapters 6 Experiment 3 Documentation /lectures/stack.html & /lectures/stack example.html on Webct. They are notes on stacks

Exceeding limits of registers Recall: assembly language has fixed number of operands, HLL doesn’t Local variables: v1, ..., v8 What if more than 8 words of local variables? Arguments; a1, ..., a4 What if more than 4 words of arguments? Place extra variables and extra arguments onto stack (sp) Use scratch registers and data transfers to access these variables

Register Conflicts Procedure A calls Procedure B A referred to as is “calling procedure” or “caller” B referred to as is “called procedure” or “callee” Both A and B want to use the 15 registers => must cooperate

Register Conflicts: 2 options (A calls B) 1) Called procedure/callee (B) leaves registers the way it found them (except lr); its B’s job to save it before using it and then restore it: “callee saves” Since B only saves what it changes, more accurate is “callee saves (what it uses)” 2) B can use any register it wants; Calling procedure/caller A must save any register it wants to use after call of B: “caller saves” Since A knows what it needs after call, more accurate is “caller saves (if it wants to)” Is either optimal?

ARM Solution to Register Conflicts Divide registers into groups Local variables / Callee Saves registers (v1 – v8) Scratch registers / Argument / Caller Save registers (a1 – a4) Some caller saves (if wants) and some callee saves (if used) Caller (A) save/restore scratch / argument (a1 – a4) if needs them after the call; also lr  callee can use (a1 – a4) and lr Callee (B) must save/restore local variables / callee saves registers (v1 – v8) if it uses them  caller can leave them unsaved Procedure that doesn’t call another tries to use only scratch / argument registers (a1 – a4)

Register Conventions (#1/5) Caller: the calling function Callee: the function being called When callee returns from executing, the caller needs to know which registers may have changed and which are guaranteed to be unchanged. Register Conventions: A set of generally accepted rules as to which registers will be unchanged after a procedure call (bl) and which may be changed.

Register Conventions (#2/5) Three views of registers a1 – a4 a1 – a4 : Change. These are expected to contain new return values. Or a1 – a4 : Change. These are volatile argument registers. a1 – a4 : Change. They’re called scratch: any procedure may change them at any time.

Register Conventions (#3/5) v1 – v8 : No Change. Very important, that’s why they’re called callee saves registers / local variable. If the callee changes these in any way, it must restore the original values before returning. sp: No Change. The stack pointer must point to the same place before and after the bl call, or else the caller won’t be able to restore values from the stack. Grows downward, sp points to last full location lr: Change. The bl call itself will change this register. ip: Change. In most variants of APCS ip is an scratch register.

Register Conventions (#4/5) What do these conventions mean? If function A calls function B, then function A must save any scratch registers a1 – a4 that it may be using onto the stack before making a bl call. Remember: Caller needs to save only registers it is using, not all scratch registers. It also needs to store lr if A is in turn is called by another function.

Register Conventions (#5/5) Note that, even though the callee may not return with different values in the callee saves registers v1 – v8, it can use them by : save v1 – v8 on the stack use these eight registers restore v1 – v8 from the stack The difference is that, with the scratch registers a1 – a4, the callee doesn’t need to save them onto the stack.

Recall: Typical Structure of a Stack Frame compiler calculates total frame size (F) for the caller at start of procedure, subtract F from SP at end, add F to SP where are args from caller? where are the args for callee? sp on entry  Register Save Area Caller Frame Local Variables Arguments for Callees sp during  Callee Frame

Callees’ & Callers’ Rights (Summary) Callees’ Right Right to use a1 – a4 registers freely Right to assume args are passed correctly in a1 – a4 Callers’ Rights Right to use v1 – v8 registers without fear of being overwritten by Callee Right to assume return values will be returned correctly in a1 – a4 Keep this slide in mind for quiz and exam

Callee’s Responsibilities (Summary) If using v1 – v8 or big local structs, slide sp down to reserve memory: e.g. sub sp, sp, #32 If using v1 – v8, save before using: e.g. str v1, [sp, #28] Receive args in a1 – a4, additional args on stack Run the procedure body If not void, put return values in a1 – a4 If applicable, undo steps 2-1 e.g. ldr v1, [sp,#28] add sp, sp, #32 mov pc, lr Keep this slide in mind for quiz and exam

Caller’s Responsibilities (Summary) Slide sp down to reserve memory: e.g. sub sp, sp, #28 Save lr on stack before bl to callee clobbers it: e.g. str lr, [sp, #24] If you’ll still need their values after the function call, save a1 – a4 on stack or copy to v1 – v8 registers. Callee can overwrite “a” registers, but not “v” registers. e.g. str a1, [sp, #20] Put first 4 words of args in a1 – a4, at most 1 arg per word, additional args go on stack: “arg 5” is [sp, #0], “arg 6” is [sp, #4] bl to the desired function Receive return values in a1 – a4 Undo steps 3-1: e.g. ldr a1, [sp, #20], ldr lr, [sp, #24], add sp, sp, #28 Keep this slide in mind for quiz and exam

Compile using pencil and paper Example 1 (#1/2) int Doh(int i, int j, int k, int l){ return i+j+l; } Doh: _______________ add a1, _________________ _________________ To the instructor: Be sure to add in picture of the stack next time!

Compile using pencil and paper Example 1 (#2/2) int Doh(int i, int j, int k, int l){ return i+j+l; } add a1, a2, a1 a4, a1 mov pc , lr Doh: _______________ add a1, _______ _______________ “a” Regs Safe For Callee Vocal vote: So, who thinks it would be nice if a problem similar to that showed up on the exam?

Compile using pencil and paper Example 2 (#1/2) int Doh(int i, int j, int k, int m, char c, int n){ return i+j+n; } Doh: _______________ add a1, _______ _______________ _______________ To the instructor: Be sure to add in picture of the stack next time!

Compile using pencil and paper Example 2 (#2/2) int Doh(int i, int j, int k, int m, char c, int n){ return i+j+n; } 6th argument ldr ip,[sp,#4] add a1, a1, ip a1,a2 mov pc , lr Doh: _______________ add a1, ______ “a” & ip Regs Safe For Callee

Hard Compilation Problem (#1/2) int Doh(int i, int j, int k, int m, char c, int n){return mult(i,j)+n;} int mult(int m, int n);/* returns m  n */ Doh: ______________ ______________ bl ___________ add ___________ _______________

Hard Compilation Problem (#2/2) int Doh(int i, int j, int k, int m, char c, int n){ return mult(i,j)+n;} int mult(int m, int n);/* returns m  n */ a1, a1, v1 Doh: ______________ ______________ bl ___________ add ___________ _______________ sub sp, sp,#4 We need to save and restore v1 as well str lr, [sp] ldr lr, [sp] add sp, sp, #4 ldr ,[sp,#8] v1 mult mov pc, lr 1.Calling mult => save lr, a Regs 2.Saving lr => must move sp 3.Need n after funccall => v1

Stack Memory Allocation Revisited Caller frame Save caller-saves regs Pass arguments (4 regs) bl Callee frame set fp@first word of frame fp = Caller’s sp - 4 (fixed point) Save registers on stack and update sp as needed Accessing the local variables is always with reference to fp Return saves register from stack using fp low high Address stack grows ... Argument 5 Argument 6 place for a1-a4 fp Callee Saves Registers GCC uses frame pointer, ARM compilers by default don’t (allocate extra temporary register (ip), less bookkeeping on procedure call) Local Variables sp

“And in Conclusion …’’ ARM SW convention divides registers into those calling procedure save/restore and those called procedure save/restore Assigns registers to arguments, return address, return value, stack pointer Optional Frame pointer fp reduces bookkeeping on procedure call