Stack Frame Components - Bowdoin Collegesbarker/teaching/courses/... · %rsp+8 Register Use(s) %rax...

13
Sean Barker Stack Frame Components 1 Return Addr Saved Registers + Local Variables Argument Build (Op<onal) Old %rbp Arguments 7+ Caller Frame Frame pointer %rbp Stack pointer %rsp (Op<onal) Sean Barker Stack Example: incr 2 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 Register Use(s) %rdi Argument p %rsi Argument val, y %rax x, Return value

Transcript of Stack Frame Components - Bowdoin Collegesbarker/teaching/courses/... · %rsp+8 Register Use(s) %rax...

Page 1: Stack Frame Components - Bowdoin Collegesbarker/teaching/courses/... · %rsp+8 Register Use(s) %rax Return value %rspRtn Updated Stack Structure . . . address Sean Barker Using the

Sean Barker

Stack Frame Components

1

ReturnAddr

SavedRegisters

+Local

Variables

ArgumentBuild

(Op<onal)

Old%rbp

Arguments7+

Caller Frame

Framepointer%rbp

Stackpointer %rsp

(Op<onal)

Sean Barker

Stack Example: incr

2

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

Register Use(s)

%rdi Argumentp

%rsi Argumentval,y

%rax x,Returnvalue

Page 2: Stack Frame Components - Bowdoin Collegesbarker/teaching/courses/... · %rsp+8 Register Use(s) %rax Return value %rspRtn Updated Stack Structure . . . address Sean Barker Using the

Sean Barker

Using the Stack (1)

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

long call_incr() { long v1 = 15213; long v2 = incr(&v1, 3000); return v1+v2; }

%rsp

Ini$alStackStructure

...

Rtnaddress

15213 Unused %rsp

Resul$ngStackStructure

...

Rtnaddress

%rsp+8

Sean Barker

Using the Stack (2)

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

long call_incr() { long v1 = 15213; long v2 = incr(&v1, 3000); return v1+v2; }

15213 Unused %rsp

StackStructure

...

Rtnaddress

%rsp+8

Register Use(s)

%rdi &v1

%rsi 3000

Page 3: Stack Frame Components - Bowdoin Collegesbarker/teaching/courses/... · %rsp+8 Register Use(s) %rax Return value %rspRtn Updated Stack Structure . . . address Sean Barker Using the

Sean Barker

Using the Stack (3)

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

long call_incr() { long v1 = 15213; long v2 = incr(&v1, 3000); return v1+v2; }

18213

Unused %rsp

StackStructure

...

Rtnaddress

%rsp+8

Register Use(s)

%rdi &v1

%rsi 3000

incr: movq (%rdi), %rax addq %rax, %rsi movq %rsi, (%rdi) ret

Sean Barker

Using the Stack (4)

6

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; } 18213

Unused %rsp

StackStructure

...

Rtnaddress

%rsp+8

Register Use(s)

%rax Returnvalue

%rsp

UpdatedStackStructure

...

Rtnaddress

Page 4: Stack Frame Components - Bowdoin Collegesbarker/teaching/courses/... · %rsp+8 Register Use(s) %rax Return value %rspRtn Updated Stack Structure . . . address Sean Barker Using the

Sean Barker

Using the Stack (5)

7

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; }

Register Use(s)

%rax Returnvalue

%rsp

UpdatedStackStructure

...

Rtnaddress

%rsp

FinalStackStructure

...

Sean Barker

Register Conventions

8

%rax

%rdx %rcx

Returnvalue(caller-saved)

%r8 %r9 %r10 %r11

%rdi %rsi

Arguments(caller-saved)

Caller-savedtemporaries

%rbx

%rsp

Callee-saved Temporaries

Special%rbp

%r12 %r13 %r14 %r15

Page 5: Stack Frame Components - Bowdoin Collegesbarker/teaching/courses/... · %rsp+8 Register Use(s) %rax Return value %rspRtn Updated Stack Structure . . . address Sean Barker Using the

Sean Barker

Callee-Saved Example (1)

9

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; } %rsp

Ini$alStackStructure

...

Rtnaddress

15213 Unused %rsp

Resul$ngStackStructure

...

Rtnaddress

%rsp+8 Saved%rbx

Sean Barker

Callee-Saved Example (2)

10

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; }

%rsp

Pre-returnStackStructure

...

Rtnaddress

15213 Unused %rsp

Resul3ngStackStructure

...

Rtnaddress

%rsp+8 Saved%rbx

Page 6: Stack Frame Components - Bowdoin Collegesbarker/teaching/courses/... · %rsp+8 Register Use(s) %rax Return value %rspRtn Updated Stack Structure . . . address Sean Barker Using the

Sean Barker

Stack Frame Components

11

ReturnAddr

SavedRegisters

+Local

Variables

ArgumentBuild

(Op<onal)

Old%rbp

Arguments7+

Caller Frame

Framepointer%rbp

Stackpointer %rsp

(Op<onal)

Sean Barker

Recursion Example

12

/* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); }

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

Page 7: Stack Frame Components - Bowdoin Collegesbarker/teaching/courses/... · %rsp+8 Register Use(s) %rax Return value %rspRtn Updated Stack Structure . . . address Sean Barker Using the

Sean Barker

Recursion Base Case

13

/* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); }

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

Register Use(s) Type

%rdi x Argument

%rax Returnvalue Returnvalue

Sean Barker

Recursion Register Save

14

/* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); }

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

Register Use(s) Type

%rdi x Argument

%rsp

...

Rtnaddress

Saved%rbx

Page 8: Stack Frame Components - Bowdoin Collegesbarker/teaching/courses/... · %rsp+8 Register Use(s) %rax Return value %rspRtn Updated Stack Structure . . . address Sean Barker Using the

Sean Barker

Recursion Call Setup

15

/* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); }

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

Register Use(s) Type

%rdi x >> 1 Rec.argument

%rbx x & 1 Callee-saved

Sean Barker

Recursive Call

16

/* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); }

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

Register Use(s) Type

%rbx x & 1 Callee-saved

%rax Recursivecallreturnvalue

Page 9: Stack Frame Components - Bowdoin Collegesbarker/teaching/courses/... · %rsp+8 Register Use(s) %rax Return value %rspRtn Updated Stack Structure . . . address Sean Barker Using the

Sean Barker

Recursion Result

17

/* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); }

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

Register Use(s) Type

%rbx x & 1 Callee-saved

%rax Returnvalue

Sean Barker

Recursion Result

18

/* Recursive popcount */ long pcount_r(unsigned long x) { if (x == 0) return 0; else return (x & 1) + pcount_r(x >> 1); }

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

Register Use(s) Type

%rax Returnvalue Returnvalue

%rsp ...

Page 10: Stack Frame Components - Bowdoin Collegesbarker/teaching/courses/... · %rsp+8 Register Use(s) %rax Return value %rspRtn Updated Stack Structure . . . address Sean Barker Using the

Sean Barker

Array Allocation

19

char string[12];

x x+12

int val[5];

x x+4 x+8 x+12 x+16 x+20

double a[3];

x+24x x+8 x+16

char* p[3];

x x+8 x+16 x+24

Sean Barker

Arrays as Pointers

20

int val[5]; 1 5 2 1 3

x x+4 x+8 x+12 x+16 x+20

Page 11: Stack Frame Components - Bowdoin Collegesbarker/teaching/courses/... · %rsp+8 Register Use(s) %rax Return value %rspRtn Updated Stack Structure . . . address Sean Barker Using the

Sean Barker

Array Access

21

# %rdi = a # %rsi = i movl (%rdi,%rsi,4), %eax # a[i]

int get_val(int a[], int i) { return a[i]; }

Sean Barker

Array Looping

22

void inc5(int a[]) { size_t i; for (i = 0; i < 5; i++) a[i]++; }

# %rdi = a movl $0, %eax # i = 0 jmp .L3 # goto middle .L4: # loop: addl $1, (%rdi,%rax,4) # a[i]++ addq $1, %rax # i++ .L3: # middle cmpq $4, %rax # i:4 jbe .L4 # if <=, goto loop rep; ret

Page 12: Stack Frame Components - Bowdoin Collegesbarker/teaching/courses/... · %rsp+8 Register Use(s) %rax Return value %rspRtn Updated Stack Structure . . . address Sean Barker Using the

Sean Barker

Structures

23

a

r

i next

0 16 24 32

struct rec { int a[4]; size_t i; struct rec* next; };

Sean Barker

Linked List Example

24

.L11: # loop: movslq 16(%rdi), %rax # i = M[r+16] movl %esi, (%rdi,%rax,4) # M[r+4*i] = val movq 24(%rdi), %rdi # r = M[r+24] testq %rdi, %rdi # Test r jne .L11 # if !=0 goto loop

void set_val (struct rec* r, int val) { while (r) { int i = r->i; r->a[i] = val; r = r->next; } }

Register Value

%rdi r

%rsi val

struct rec { int a[4]; int i; struct rec* next; };

Elementi

r

i next

0 16 24 32 a

Page 13: Stack Frame Components - Bowdoin Collegesbarker/teaching/courses/... · %rsp+8 Register Use(s) %rax Return value %rspRtn Updated Stack Structure . . . address Sean Barker Using the

Sean Barker

Data Alignment

25

struct S1 { char c; int i[2]; double v; } *p;

UnalignedData

c i[0] i[1] v p p+1 p+5 p+9 p+17

AlignedData

c i[0] i[1] v 3bytes 4bytes

p+0 p+4 p+8 p+16 p+24

Mul3pleof4 Mul3pleof8

Mul3pleof8 Mul3pleof8