Machine-Level Programming III: Procedures Topics IA32 stack discipline Register-saving conventions Creating pointers to local variables CS 105 “Tour of.

Slides:



Advertisements
Similar presentations
Machine-Level Programming III: Procedures Feb. 8, 2000 Topics IA32 stack Stack-based languages Stack frames Register saving conventions Creating pointers.
Advertisements

University of Washington Procedures and Stacks II The Hardware/Software Interface CSE351 Winter 2013.
Copyright 2014 – Noah Mendelsohn UM Macro Assembler Functions Noah Mendelsohn Tufts University Web:
Machine/Assembler Language Putting It All Together Noah Mendelsohn Tufts University Web:
Machine Programming – Procedures and IA32 Stack CENG334: Introduction to Operating Systems Instructor: Erol Sahin Acknowledgement: Most of the slides are.
University of Washington Last Time For loops  for loop → while loop → do-while loop → goto version  for loop → while loop → goto “jump to middle” version.
Machine-Level Programming III: Procedures Apr. 17, 2006 Topics IA32 stack discipline Register saving conventions Creating pointers to local variables CS213.
1 Function Calls Professor Jennifer Rexford COS 217 Reading: Chapter 4 of “Programming From the Ground Up” (available online from the course Web site)
Machine-Level Programming III: Procedures Sept. 17, 2007 IA32 stack discipline Register saving conventions Creating pointers to local variablesx86-64 Argument.
– 1 – , F’02 ICS05 Instructor: Peter A. Dinda TA: Bin Lin Recitation 4.
Run time vs. Compile time
Machine-Level Programming III: Procedures Jan 30, 2003
Assembly תרגול 8 פונקציות והתקפת buffer.. Procedures (Functions) A procedure call involves passing both data and control from one part of the code to.
Machine-Level Programming III: Procedures Sept. 15, 2006 IA32 stack discipline Register saving conventions Creating pointers to local variablesx86-64 Argument.
Stack Activation Records Topics IA32 stack discipline Register saving conventions Creating pointers to local variables February 6, 2003 CSCE 212H Computer.
Carnegie Mellon Introduction to Computer Systems /18-243, spring 2009 Recitation, Jan. 14 th.
Lee CSCE 312 TAMU 1 Based on slides provided by Randy Bryant and Dave O’Hallaron Machine-Level Programming III: Switch Statements and IA32 Procedures Instructor:
Ithaca College Machine-Level Programming IV: IA32 Procedures Comp 21000: Introduction to Computer Systems & Assembly Lang Spring 2013 * Modified slides.
Machine-Level Programming III: Switch Statements and IA32 Procedures Seoul National University.
University of Washington Today More on procedures, stack etc. Lab 2 due today!  We hope it was fun! What is a stack?  And how about a stack frame? 1.
Fabián E. Bustamante, Spring 2007 Machine-Level Programming III - Procedures Today IA32 stack discipline Register saving conventions Creating pointers.
Machine-Level Programming: X86-64 Topics Registers Stack Function Calls Local Storage X86-64.ppt CS 105 Tour of Black Holes of Computing.
Machine-level Programming III: Procedures Topics –IA32 stack discipline –Register saving conventions –Creating pointers to local variables.
F’08 Stack Discipline Aug. 27, 2008 Nathaniel Wesley Filardo Slides stolen from CMU , whence they were stolen from CMU CS 438.
Reminder Bomb lab is due tomorrow! Attack lab is released tomorrow!!
1 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Carnegie Mellon Machine-Level Programming II: Control Carnegie Mellon.
University of Amsterdam Computer Systems – the instruction set architecture Arnoud Visser 1 Computer Systems The instruction set architecture.
Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Carnegie Mellon Instructor: San Skulrattanakulchai Machine-Level Programming.
1 Assembly Language: Function Calls Jennifer Rexford.
Spring 2016Assembly Review Roadmap 1 car *c = malloc(sizeof(car)); c->miles = 100; c->gals = 17; float mpg = get_mpg(c); free(c); Car c = new Car(); c.setMiles(100);
Reading Condition Codes (Cont.)
Credits and Disclaimers
CSCE 212 Computer Architecture
Recitation: Attack Lab
Procedures & Executables CSE 351 Spring 2017
The Stack & Procedures CSE 351 Spring 2017
Machine-Level Programming III: Procedures
Carnegie Mellon Machine-Level Programming III: Switch Statements and IA32 Procedures / : Introduction to Computer Systems 7th Lecture, Sep.
Recitation: Attack Lab
Procedures & The Stack Announcements Lab 1 graded HW 2 out
Switch & Procedures & The Stack I CSE 351 Winter 2017
Machine-Level Programming III: Switch Statements and IA32 Procedures
Machine-Level Programming 4 Procedures
Assembly Programming IV CSE 351 Spring 2017
Machine-Level Programming III: Procedures /18-213/14-513/15-513: Introduction to Computer Systems 7th Lecture, September 18, 2018.
Procedures & The Stack II CSE 351 Autumn 2016
Procedures & The Stack I CSE 351 Autumn 2016
Arrays CSE 351 Winter
Carnegie Mellon Machine-Level Programming III: Procedures : Introduction to Computer Systems October 22, 2015 Instructor: Rabi Mahapatra Authors:
Procedures & The Stack II CSE 351 Winter 2017
Assembly Programming IV CSE 410 Winter 2017
Procedures & Executables CSE 351 Autumn 2017
Recitation: Attack Lab
Roadmap C: Java: Assembly language: OS: Machine code: Computer system:
Machine-Level Programming III: Procedures Sept 18, 2001
The Stack & Procedures CSE 351 Winter 2018
Machine Level Representation of Programs (IV)
The Stack & Procedures CSE 410 Winter 2017
Roadmap C: Java: Assembly language: OS: Machine code: Computer system:
Ithaca College Machine-Level Programming VII: Procedures Comp 21000: Introduction to Computer Systems & Assembly Lang Spring 2017.
Machine-Level Representation of Programs (x86-64)
Ithaca College Machine-Level Programming VII: Procedures Comp 21000: Introduction to Computer Systems & Assembly Lang Spring 2017.
“Way easier than when we were students”
CS201- Lecture 8 IA32 Flow Control
Loops, Switches, Intro to Stack & Procedures CSE 351 Winter 2019
Ithaca College Machine-Level Programming VII: Procedures Comp 21000: Introduction to Computer Systems & Assembly Lang Spring 2017.
Credits and Disclaimers
Presentation transcript:

Machine-Level Programming III: Procedures Topics IA32 stack discipline Register-saving conventions Creating pointers to local variables CS 105 “Tour of the Black Holes of Computing”

– 2 – CS 105 Mechanisms in Procedures Passing control To beginning of procedure code Back to return point Passing data Procedure arguments Return value Memory management Allocate during procedure execution Deallocate upon return Mechanisms all implemented with machine instructions x86-64 procedures use only what’s needed P(…) { y = Q(x); print(y) } P(…) { y = Q(x); print(y) } int Q(int i) { int t = 3*i; int v[10]; return v[t]; } int Q(int i) { int t = 3*i; int v[10]; return v[t]; }

– 3 – CS 105 x86-64 Stack Region of memory managed with stack discipline Grows toward lower addresses Register %rsp indicates numerically lowest stack address Address of “top”element Stack Pointer %rsp Stack Grows Down Increasing Addresses Stack “Top” Stack “Bottom”

– 4 – CS 105 x86-64 Stack Pushing Pushing push1 Src Fetch operand at Src Decrement %rsp by 8 Then write operand at address given by %rsp Stack Grows Down Increasing Addresses New Stack “Top” Stack “Bottom” Stack Pointer %rsp -8

– 5 – CS 105 x86-64 Stack Popping Popping popq Dest Read operand at address given by resp Increment %rsp by 8 Write to Dest Stack Pointer %rsp Stack Grows Down Increasing Addresses New Stack “Top” Stack “Bottom” +8

– 6 – CS 105 %rsp %rax %rdx %rsp %rax %rdx %rsp %rax %rdx 0x x108 0x110 0x118 0x Stack Operation Examples 0x108 0x110 0x x1080x100 pushq %rax 0x108 0x110 0x x popq %rdx 0x

– 7 – CS 105 Procedure Control Flow Use stack to support procedure call and return Procedure call: call or callq call label Push return address on stack; jump to label Return address value Address of instruction just beyond call Procedure return: ret or retq Pop address from stack Jump to address

– 8 – CS 105 Control-Flow Example # : : mov %rdi,%rax : retq : : mov %rdi,%rax : retq : : callq : mov %rax,(%rbx) : : callq : mov %rax,(%rbx) 0x x120 %rsp 0x120 0x128 0x130 %rip

– 9 – CS 105 Control-Flow Example # : : mov %rdi,%rax : retq : : mov %rdi,%rax : retq : : callq : mov %rax,(%rbx) : : callq : mov %rax,(%rbx) 0x x118 0x %rsp 0x120 0x128 0x1300x118 %rip

– 10 – CS 105 Control-Flow Example # : : mov %rdi,%rax : retq : : mov %rdi,%rax : retq : : callq : mov %rax,(%rbx) : : callq : mov %rax,(%rbx) 0x x118 0x %rsp 0x120 0x128 0x1300x118 %rip

– 11 – CS 105 Control-Flow Example # : : mov %rdi,%rax : retq : : mov %rdi,%rax : retq : : callq : mov %rax,(%rbx) : : callq : mov %rax,(%rbx) 0x x120 %rsp 0x120 0x128 0x130 %rip

– 12 – CS 105 Carnegie Mellon Procedure Data Flow Registers First 6 arguments Return value Stack Only allocate stack space when needed %rdi %rsi %rdx %rcx %r8 %r9 %rax Arg 7 Arg 8 Arg n

– 13 – CS 105 Carnegie Mellon Diane’s Silk Dress Cost $89 Registers %rdi %rsi %rdx %rcx %r8 %r9

– 14 – CS 105 Data-Flow Example long mult2 (long a, long b) { long s = a * b; return s; } long mult2 (long a, long b) { long s = a * b; return s; } void multstore (long x, long y, long *dest) { long t = mult2(x, y); *dest = t; } void multstore (long x, long y, long *dest) { long t = mult2(x, y); *dest = t; } : # a in %rdi, b in %rsi : mov %rdi,%rax# a : imul %rsi,%rax# a * b # s in %rax : retq# Return : # a in %rdi, b in %rsi : mov %rdi,%rax# a : imul %rsi,%rax# a * b # s in %rax : retq# Return : # x in %rdi, y in %rsi, dest in %rdx : mov %rdx,%rbx# Save dest : callq # mult2(x,y) # t in %rax : mov %rax,(%rbx)# Save at dest : # x in %rdi, y in %rsi, dest in %rdx : mov %rdx,%rbx# Save dest : callq # mult2(x,y) # t in %rax : mov %rax,(%rbx)# Save at dest

– 15 – CS 105 Stack-Based Languages Languages That Support Recursion E.g., C, Pascal, Java Code must be “reentrant” Multiple simultaneous instantiations of single procedure ⇒ Need some place to store state of each instantiation Arguments Local variables Return pointer Stack Discipline State for given procedure needed for limited time From when called to when return Callee returns before caller does Stack Allocated in Frames State for single procedure instantiation

– 16 – CS 105 Call Chain Example Code Structure yoo(…) { who(); } who(…) { amI(); amI(); } amI(…) { amI(); } yoo who amI Call Chain Procedure amI recursive amI

– 17 – CS 105 Carnegie Mellon Frame Pointer: %rbp Stack Frames Contents Return information Local storage (if needed) Temporary space (if needed)Management Space allocated when enter procedure “Set-up” code Includes push by call instruction Deallocated when return “Finish” code Includes pop by ret instruction Stack Pointer: %rsp Stack “Top” Previous Frame Frame for proc (Optional)x

– 18 – CS 105 Carnegie Mellon Example yoo who amI yoo %rbp %rsp Stack yoo yoo(…) { who(); } yoo(…) { who(); }

– 19 – CS 105 yoo(…) { who(); } yoo(…) { who(); } Carnegie Mellon Example yoo who amI yoo %rbp %rsp Stack yoo who who(…) { amI(); amI(); } who(…) { amI(); amI(); }

– 20 – CS 105 yoo(…) { who(); } yoo(…) { who(); } who(…) { amI(); amI(); } who(…) { amI(); amI(); } Carnegie Mellon Example yoo who amI yoo %rbp %rsp Stack yoo who amI amI(…) { amI(); } amI(…) { amI(); }

– 21 – CS 105 Carnegie Mellon Example yoo who amI yoo %rbp %rsp Stack yoo who amI yoo(…) { who(); } yoo(…) { who(); } who(…) { amI(); amI(); } who(…) { amI(); amI(); } amI(…) { amI(); } amI(…) { amI(); } amI(…) { amI(); } amI(…) { amI(); }

– 22 – CS 105 Carnegie Mellon Example yoo who amI yoo %rbp %rsp Stack yoo who amI yoo(…) { who(); } yoo(…) { who(); } who(…) { amI(); amI(); } who(…) { amI(); amI(); } amI(…) { amI(); } amI(…) { amI(); } amI(…) { amI(); } amI(…) { amI(); } amI(…) { amI(); } amI(…) { amI(); }

– 23 – CS 105 Carnegie Mellon Example yoo who amI yoo %rbp %rsp Stack yoo who amI yoo(…) { who(); } yoo(…) { who(); } who(…) { amI(); amI(); } who(…) { amI(); amI(); } amI(…) { amI(); } amI(…) { amI(); } amI(…) { amI(); } amI(…) { amI(); }

– 24 – CS 105 Carnegie Mellon Example yoo who amI yoo %rbp %rsp Stack yoo who amI yoo(…) { who(); } yoo(…) { who(); } who(…) { amI(); amI(); } who(…) { amI(); amI(); } amI(…) { amI(); } amI(…) { amI(); }

– 25 – CS 105 Carnegie Mellon Example yoo who amI yoo %rbp %rsp Stack yoo who yoo(…) { who(); } yoo(…) { who(); } who(…) { amI(); amI(); } who(…) { amI(); amI(); }

– 26 – CS 105 Carnegie Mellon Example yoo who amI yoo %rbp %rsp Stack yoo who amI yoo(…) { who(); } yoo(…) { who(); } who(…) { amI(); amI(); } who(…) { amI(); amI(); } amI(…) { amI(); } amI(…) { amI(); }

– 27 – CS 105 Carnegie Mellon Example yoo who amI yoo %rbp %rsp Stack yoo who yoo(…) { who(); } yoo(…) { who(); } who(…) { amI(); amI(); } who(…) { amI(); amI(); }

– 28 – CS 105 Carnegie Mellon Example yoo who amI yoo %rbp %rsp Stack yoo yoo(…) { who(); } yoo(…) { who(); }

– 29 – CS 105 Carnegie Mellon x86-64/Linux Stack Frame Current Stack Frame (“Top” to Bottom) “Argument build:” Parameters for function about to call Local variables If can’t keep in registers Saved register context Old frame pointer (optional) Caller Stack Frame Return address Pushed by call instruction Arguments for this call Return Addr Saved Registers + Local Variables Argument Build (Optional) Old %rbp Arguments 7+ Caller Frame Frame pointer %rbp Stack pointer %rsp (Optional)

– 30 – CS 105 Carnegie Mellon Example: incr long incr(long *p, long val) { long x = *p; long y = x + val; *p = y; return x; } long incr(long *p, long val) { long x = *p; long y = x + val; *p = y; return x; } incr: movq (%rdi), %rax addq %rax, %rsi movq %rsi, (%rdi) ret incr: movq (%rdi), %rax addq %rax, %rsi movq %rsi, (%rdi) ret RegisterUse(s) %rdi Argument p %rsi Argument val, y %rax x, Return value

– 31 – CS 105 Carnegie Mellon Example: Calling incr #1 call_incr: subq $16, %rsp movq $15213, 8(%rsp) movl $3000, %esi leaq 8(%rsp), %rdi call incr addq 8(%rsp), %rax addq $16, %rsp ret call_incr: subq $16, %rsp movq $15213, 8(%rsp) movl $3000, %esi leaq 8(%rsp), %rdi call incr addq 8(%rsp), %rax addq $16, %rsp ret long call_incr() { long v1 = 15213; long v2 = incr(&v1, 3000); return v1+v2; } long call_incr() { long v1 = 15213; long v2 = incr(&v1, 3000); return v1+v2; } %rsp Initial Stack Structure... Rtn address Unused %rsp Resulting Stack Structure... Rtn address %rsp+8

– 32 – CS 105 Carnegie Mellon Example: Calling incr #2 call_incr: subq $16, %rsp movq $15213, 8(%rsp) movl $3000, %esi leaq 8(%rsp), %rdi call incr addq 8(%rsp), %rax addq $16, %rsp ret call_incr: subq $16, %rsp movq $15213, 8(%rsp) movl $3000, %esi leaq 8(%rsp), %rdi call incr addq 8(%rsp), %rax addq $16, %rsp ret long call_incr() { long v1 = 15213; long v2 = incr(&v1, 3000); return v1+v2; } long call_incr() { long v1 = 15213; long v2 = incr(&v1, 3000); return v1+v2; } Unused %rsp Stack Structure... Rtn address %rsp+8 RegisterUse(s) %rdi&v1 %rsi3000

– 33 – CS 105 Carnegie Mellon Example: Calling incr #3 call_incr: subq $16, %rsp movq $15213, 8(%rsp) movl $3000, %esi leaq 8(%rsp), %rdi call incr addq 8(%rsp), %rax addq $16, %rsp ret call_incr: subq $16, %rsp movq $15213, 8(%rsp) movl $3000, %esi leaq 8(%rsp), %rdi call incr addq 8(%rsp), %rax addq $16, %rsp ret long call_incr() { long v1 = 15213; long v2 = incr(&v1, 3000); return v1+v2; } long call_incr() { long v1 = 15213; long v2 = incr(&v1, 3000); return v1+v2; } Unused %rsp Stack Structure... Rtn address %rsp+8 RegisterUse(s) %rdi&v1 %rsi3000

– 34 – CS 105 Carnegie Mellon Example: Calling incr #4 call_incr: subq $16, %rsp movq $15213, 8(%rsp) movl $3000, %esi leaq 8(%rsp), %rdi call incr addq 8(%rsp), %rax addq $16, %rsp ret call_incr: subq $16, %rsp movq $15213, 8(%rsp) movl $3000, %esi leaq 8(%rsp), %rdi call incr addq 8(%rsp), %rax addq $16, %rsp ret long call_incr() { long v1 = 15213; long v2 = incr(&v1, 3000); return v1+v2; } long call_incr() { long v1 = 15213; long v2 = incr(&v1, 3000); return v1+v2; } Unused %rsp Stack Structure... Rtn address %rsp+8 RegisterUse(s) %rax Return value %rsp Updated Stack Structure... Rtn address

– 35 – CS 105 Carnegie Mellon Example: Calling incr #5 call_incr: subq $16, %rsp movq $15213, 8(%rsp) movl $3000, %esi leaq 8(%rsp), %rdi call incr addq 8(%rsp), %rax addq $16, %rsp ret call_incr: subq $16, %rsp movq $15213, 8(%rsp) movl $3000, %esi leaq 8(%rsp), %rdi call incr addq 8(%rsp), %rax addq $16, %rsp ret long call_incr() { long v1 = 15213; long v2 = incr(&v1, 3000); return v1+v2; } long call_incr() { long v1 = 15213; long v2 = incr(&v1, 3000); return v1+v2; } RegisterUse(s) %rax Return value %rsp Updated Stack Structure... Rtn address %rsp Final Stack Structure...

– 36 – CS 105 Carnegie Mellon Register Saving Conventions When procedure yoo calls who: yoo is the caller who is the callee Can register be used for temporary storage? Contents of register %rdx overwritten by who This could be trouble ➙ something should be done! Need some coordination yoo: movq $15213, %rdx call who addq %rdx, %rax ret yoo: movq $15213, %rdx call who addq %rdx, %rax ret who: subq $18213, %rdx ret who: subq $18213, %rdx ret

– 37 – CS 105 Carnegie Mellon Register Saving Conventions When procedure yoo calls who: yoo is the caller who is the callee Can register be used for temporary storage? Conventions “Caller Saved” Caller saves temporary values in its frame before the call “Callee Saved” Callee saves temporary values in its frame before using Callee restores them before returning to caller

– 38 – CS 105 Carnegie Mellon x86-64 Linux Register Usage #1 %rax Return value Also caller-saved Can be modified by procedure %rdi,..., %r9 Arguments (Diane’s silk dress) Also caller-saved Can be modified by procedure %r10, %r11 Caller-saved Can be modified by procedure %rax %rdx %rcx Return value %r8 %r9 %r10 %r11 %rdi %rsi Arguments Caller-saved temporaries

– 39 – CS 105 Carnegie Mellon x86-64 Linux Register Usage #2 %rbx, %r12, %r13, %r14 Callee-saved Callee must save & restore%rbp Callee-saved Callee must save & restore May be used as frame pointer Can mix & match%rsp Special form of callee save Restored to original value upon exit from procedure %rbx %rsp Callee-saved Temporaries Special %rbp %r12 %r13 %r14

– 40 – CS 105 Carnegie Mellon Callee-Saved Example #1 call_incr2: pushq %rbx subq $16, %rsp movq %rdi, %rbx movq $15213, 8(%rsp) movl $3000, %esi leaq 8(%rsp), %rdi call incr addq %rbx, %rax addq $16, %rsp popq %rbx ret call_incr2: pushq %rbx subq $16, %rsp movq %rdi, %rbx movq $15213, 8(%rsp) movl $3000, %esi leaq 8(%rsp), %rdi call incr addq %rbx, %rax addq $16, %rsp popq %rbx ret long call_incr2(long x) { long v1 = 15213; long v2 = incr(&v1, 3000); return x+v2; } long call_incr2(long x) { long v1 = 15213; long v2 = incr(&v1, 3000); return x+v2; } %rsp Initial Stack Structure... Rtn address Unused %rsp Resulting Stack Structure... Rtn address %rsp+8 Saved %rbx

– 41 – CS 105 Carnegie Mellon Callee-Saved Example #2 call_incr2: pushq %rbx subq $16, %rsp movq %rdi, %rbx movq $15213, 8(%rsp) movl $3000, %esi leaq 8(%rsp), %rdi call incr addq %rbx, %rax addq $16, %rsp popq %rbx ret call_incr2: pushq %rbx subq $16, %rsp movq %rdi, %rbx movq $15213, 8(%rsp) movl $3000, %esi leaq 8(%rsp), %rdi call incr addq %rbx, %rax addq $16, %rsp popq %rbx ret long call_incr2(long x) { long v1 = 15213; long v2 = incr(&v1, 3000); return x+v2; } long call_incr2(long x) { long v1 = 15213; long v2 = incr(&v1, 3000); return x+v2; } %rsp Pre-return Stack Structure... Rtn address Unused %rsp Resulting Stack Structure... Rtn address %rsp+8 Saved %rbx

– 42 – CS 105 Carnegie Mellon /* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); } /* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); } Recursive Function pcount_r: movl $0, %eax testq %rdi, %rdi je.L6 pushq %rbx movq %rdi, %rbx andl $1, %ebx shrq %rdi call pcount_r addq %rbx, %rax popq %rbx.L6: rep; ret

– 43 – CS 105 Carnegie Mellon /* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); } /* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); } Recursive Function Terminal Case pcount_r: movl $0, %eax testq %rdi, %rdi je.L6 pushq %rbx movq %rdi, %rbx andl $1, %ebx shrq %rdi call pcount_r addq %rbx, %rax popq %rbx.L6: rep; ret RegisterUse(s)Type %rdix Argument %rax Return value

– 44 – CS 105 Carnegie Mellon /* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); } /* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); } Recursive Function Register Save pcount_r: movl $0, %eax testq %rdi, %rdi je.L6 pushq %rbx movq %rdi, %rbx andl $1, %ebx shrq %rdi call pcount_r addq %rbx, %rax popq %rbx.L6: rep; ret RegisterUse(s)Type %rdix Argument %rsp... Rtn address Saved %rbx

– 45 – CS 105 Carnegie Mellon /* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); } /* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); } Recursive Function Call Setup pcount_r: movl $0, %eax testq %rdi, %rdi je.L6 pushq %rbx movq %rdi, %rbx andl $1, %ebx shrq %rdi call pcount_r addq %rbx, %rax popq %rbx.L6: rep; ret RegisterUse(s)Type %rdix >> 1 Rec. argument %rbxx & 1 Callee-saved

– 46 – CS 105 Carnegie Mellon /* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); } /* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); } Recursive Function Call pcount_r: movl $0, %eax testq %rdi, %rdi je.L6 pushq %rbx movq %rdi, %rbx andl $1, %ebx shrq %rdi call pcount_r addq %rbx, %rax popq %rbx.L6: rep; ret RegisterUse(s)Type %rbxx & 1 Callee-saved %rax Recursive call return value

– 47 – CS 105 Carnegie Mellon /* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); } /* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); } Recursive Function Result pcount_r: movl $0, %eax testq %rdi, %rdi je.L6 pushq %rbx movq %rdi, %rbx andl $1, %ebx shrq %rdi call pcount_r addq %rbx, %rax popq %rbx.L6: rep; ret RegisterUse(s)Type %rbxx & 1 Callee-saved %rax Return value

– 48 – CS 105 Carnegie Mellon /* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); } /* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); } Recursive Function Completion pcount_r: movl $0, %eax testq %rdi, %rdi je.L6 pushq %rbx movq %rdi, %rbx andl $1, %ebx shrq %rdi call pcount_r addq %rbx, %rax popq %rbx.L6: rep; ret RegisterUse(s)Type %rax Return value %rsp...

– 49 – CS 105 Carnegie Mellon Observations About Recursion Handled Without Special Consideration Stack frames mean that each function call has private storage Saved registers & local variables Saved return pointer Register saving conventions prevent one function call from corrupting another’s data Unless the C code explicitly does so (e.g., buffer overflow in Lecture 9) Stack discipline follows call / return pattern If P calls Q, then Q returns before P Last-In, First-Out Also works for mutual recursion P calls Q; Q calls P

– 50 – CS 105 Carnegie Mellon x86-64 Procedure Summary Important Points Stack is the right data structure for procedure call / return If P calls Q, then Q returns before P Recursion (& mutual recursion) handled by normal calling conventions Can safely store values in local stack frame and in callee-saved registers Put function arguments at top of stack Result return in %rax Pointers are addresses of values On stack or global Return Addr Saved Registers + Local Variables Argument Build Old %rbp Arguments 7+ Caller Frame %rbp (Optional) %rsp