Call Stack Stack “Bottom” Memory region managed with stack discipline
%rsp holds lowest stack address higher Procedures and the Call Stack addresses (address of "top" element)
Topics stack grows • Procedures toward lower addresses • Call stack Stack Pointer: %rsp • Procedure/stack instructions • Calling conventions • Register-saving conventions Stack “Top”
9
Stack frames support procedure calls. Procedure Control Flow Instructions
Contents Caller Local variables Procedure call: callq label Frame Function arguments (after first 6) 1. Push return address on stack Return information 2. Jump to label Temporary space Frame for Return address: Address of instruction after . Example: current call procedure Management 400544: callq 400550
26 28 Call Example (step 1) Return Example (step 1) • • 0x130 0x130 0000000000400540
%rip 0x400544 %rip 0x400557 0000000000400550
29 31
Procedure Data Flow Stack Frame
First 6 arguments passed Remaining arguments passed in registers on stack (in memory) High … Addresses Arg 1 %rdi Diane’s • • • Caller %rsi Silk Frame Dress Arg n Extra Arguments %rdx Costs to callee %rcx $8 9 • • • Return Address %r8 Arg 8 Arg 6 %r9 Arg 7 Saved Registers Return value + Low Local Variables Callee %rax Addresses Frame
Only allocate stack space when needed Stack pointer %rsp Extra Arguments for next call
35 Example: increment Procedure Call Example (initial state)
Initial Stack Structure long increment(long* p, long val) { long call_incr() { long x = *p; long v1 = 240; long y = x + val; long v2 = increment(&v1, 61); • • • *p = y; return v1+v2; return x; } %rsp Return addr
call_incr: subq $16, %rsp increment: %rdi Register Use(s) movq $240, 8(%rsp) movq (%rdi), %rax movl $61, %esi Argument addq %rax, %rsi %rdi p leaq 8(%rsp), %rdi movq %rsi, (%rdi) %rsi Argument val, y call increment %rsi ret %rax x, Return value addq 8(%rsp), %rax addq $16, %rsp ret %rax
37 38
Procedure Call Example (step 4) Procedure Call Example (step 6) long call_incr() { Stack Structure Stack Structure longlongincrement( v1 = 240;long* p, long val) { long call_incr() { longlong v2 x= =increment( *p; &v1, 61); long v1 = 240; returnlong v1+v2;y = x + val; • • • long v2 = increment(&v1, 61); • • • *p = y; } return v1+v2; return x; %rsp } %rsp call_incr} : Return addr
movsbl = move sign-extending a byte to a long (4-byte) Callee Save
movswl = move sign-extending a word (2-byte) to a long (4-byte) 49 x86-64 64-bit Register Conventions Callee-Saved Example
Begin/End Stack Structure long call_incr2(long x) { %rax Return value – Caller saved %r8 Argument #5 – Caller saved long v1 = 240; long v2 = increment(&v1, 61); . . . %rbx Callee saved %r9 Argument #6 – Caller saved return x+v2; } Rtn address %rsp %rcx Argument #4 – Caller saved %r10 Caller saved call_incr2: %rdx Argument #3 – Caller saved %r11 Caller Saved pushq %rbx Stack Structure in call_incr2 subq $16, %rsp %rsi Argument #2 – Caller saved %r12 Callee saved movq %rdi, %rbx movq $240, 8(%rsp) . . . %rdi Argument #1 – Caller saved %r13 Callee saved movl $61, %esi leaq 8(%rsp), %rdi Rtn address %rsp Stack pointer %r14 Callee saved call increment addq %rbx, %rax Saved %rbx addq $16, %rsp %rbp Callee saved %r15 Callee saved 240 %rsp+8 popq %rbx ret Unused %rsp 51 52 x86-64 stack storage example Recursive Function pcount_r: (1) movl $0, %eax /* Recursive popcount */ testq %rdi, %rdi long int call_proc() call_proc: long pcount_r(unsigned long x) { je .L6 { subq $32,%rsp if (x == 0) { pushq %rbx long x1 = 1; movq $1,16(%rsp) # x1 return 0; movq %rdi, %rbx int x2 = 2; movl $2,24(%rsp) # x2 } else { andl $1, %ebx short x3 = 3; movw $3,28(%rsp) # x3 return (x & 1) shrq %rdi char x4 = 4; movb $4,31(%rsp) # x4 + pcount_r(x >> 1); call pcount_r proc(x1, &x1, x2, &x2, • • • } addq %rbx, %rax x3, &x3, x4, &x4); } popq %rbx return (x1+x2)*(x3-x4); .L6: } rep; ret Return address to caller of call_proc ←%rsp
54 61
Procedure Summary
call, ret, push, pop
Stack discipline fits procedure call / return.* … If P calls Q: Q (and calls by Q) returns before P Caller Conventions support arbitrary function calls. Frame Extra Arguments Register-save conventions. to callee Stack frame saves extra args or local variables. Return Address Result returned in %rax
%rax Return value – Caller saved %r8 Argument #5 – Caller saved
%rbx Callee saved %r9 Argument #6 – Caller saved Saved Registers + %rcx Argument #4 – Caller saved %r10 Caller saved Callee Local Variables %rdx Argument #3 – Caller saved %r11 Caller Saved Frame
%rsi Argument #2 – Caller saved %r12 Callee saved
%rdi Argument #1 – Caller saved %r13 Callee saved Extra Arguments %rsp Stack pointer %r14 Callee saved Stack pointer %rsp for next call %rbp Callee saved %r15 Callee saved 128-byte red zone *Take 251 to learn about languages where it doesn't. 66