Increasing Addresses Grows Stack Down Stack Pointer: %rsp Stack - - PDF document

increasing
SMART_READER_LITE
LIVE PREVIEW

Increasing Addresses Grows Stack Down Stack Pointer: %rsp Stack - - PDF document

Procedure Call Registers %rax %r8 %eax %r8d Return Arg 5 %rbx %r9 %ebx %r9d Arg 6 %rcx %r10 %ecx %r10d Arg 4 %rdx %r11 %edx %r11d Arg 3 %rsi %r12 %esi %r12d Arg 2 %rdi %r13 %edi %r13d Arg 1 %rsp %r14 %esp %r14d


slide-1
SLIDE 1

Sean Barker

Procedure Call Registers

1

%rax

%eax

%rbx

%ebx

%rdx

%edx

%rcx

%ecx

%rsi

%esi

%rdi

%edi

%rbp

%ebp

%rsp

%esp

%r8

%r8d

%r9

%r9d

%r11

%r11d

%r10

%r10d

%r12

%r12d

%r13

%r13d

%r15

%r15d

%r14

%r14d

Return Arg 4 Arg 3 Arg 2 Arg 1 Stack ptr Arg 5 Arg 6

Sean Barker

Call Stack

2

Stack Pointer: %rsp

Stack Grows Down Increasing Addresses

Stack “Top” Stack “Bo;om”

slide-2
SLIDE 2

Sean Barker

Stack Operations

3

  • 8

Stack Grows Down Increasing Addresses

Stack “Bo8om” Stack Pointer: %rsp Stack “Top” Stack Pointer: %rsp

Stack Grows Down Increasing Addresses

Stack “Top” Stack “Bo;om”

+8

popq Dest

pushq Src

Sean Barker

Procedure Call Example (1)

4

0000000000400550 <bar>: 400550: mov %rdi,%rax

  • 400557: retq

0000000000400540 <foo>:

  • 400544: callq 400550 <bar>

400549: mov %rax,(%rbx)

  • 0x400544

0x120

  • %rsp

0x120 0x128 0x130 %rip

Stack Grows Down

slide-3
SLIDE 3

Sean Barker

Procedure Call Example (2)

5

0000000000400550 <bar>: 400550: mov %rdi,%rax

  • 400557: retq

0000000000400540 <foo>:

  • 400544: callq 400550 <bar>

400549: mov %rax,(%rbx)

  • 0x400550

0x118 0x400549

  • %rsp

0x120 0x128 0x130 0x118 %rip

Stack Grows Down

Sean Barker

Procedure Call Example (3)

6

0000000000400550 <bar>: 400550: mov %rdi,%rax

  • 400557: retq

0000000000400540 <foo>:

  • 400544: callq 400550 <bar>

400549: mov %rax,(%rbx)

  • 0x400557

0x118 0x400549

  • %rsp

0x120 0x128 0x130 0x118 %rip

Stack Grows Down

slide-4
SLIDE 4

Sean Barker

Procedure Call Example (4)

7

0000000000400550 <bar>: 400550: mov %rdi,%rax

  • 400557: retq

0000000000400540 <foo>:

  • 400544: callq 400550 <bar>

400549: mov %rax,(%rbx)

  • 0x400549

0x120

  • %rsp

0x120 0x128 0x130 %rip

Stack Grows Down

Sean Barker

Passing Data

8

Registers

¢ First 6 arguments ¢ Return value

Stack

%rdi %rsi %rdx %rcx %r8 %r9 %rax Arg 7

  • • •

Arg 8 Arg n

  • • •

Stack Grows Down

Stack “Top”

slide-5
SLIDE 5

Sean Barker

Stack Frames

9

Frame Pointer: %rbp Stack Pointer: %rsp

Stack “Top”

Previous Frame Frame for proc

(Op:onal) x

Sean Barker

Call Chain Example

10

yoo(…) {

  • who();
  • }

who(…) {

  • • •

amI();

  • • •

amI();

  • • •

} amI(…) {

  • amI();
  • }

yoo who amI amI amI Example Call Chain amI Procedure amI() is recursive

slide-6
SLIDE 6

Sean Barker

Stack Frame Allocation (1)

11

yoo who amI amI amI amI yoo %rbp %rsp

Stack

yoo

yoo(…) {

  • who();
  • }

Sean Barker

Stack Frame Allocation (2)

12

yoo(…) {

  • who();
  • }

yoo who amI amI amI amI yoo %rbp %rsp

Stack

yoo who

who(…) {

  • • •

amI();

  • • •

amI();

  • • •

}

slide-7
SLIDE 7

Sean Barker

Stack Frame Allocation (3)

13

yoo(…) {

  • who();
  • }

who(…) {

  • • •

amI();

  • • •

amI();

  • • •

} yoo who amI amI amI amI yoo %rbp %rsp

Stack

yoo who amI

amI(…) {

  • amI();
  • }

Recurse!

Sean Barker

Stack Frame Allocation (4)

14

yoo who amI amI amI amI yoo %rbp %rsp

Stack

yoo who amI amI

yoo(…) {

  • who();
  • }

who(…) {

  • • •

amI();

  • • •

amI();

  • • •

} amI(…) {

  • amI();
  • }

amI(…) {

  • amI();
  • }

Recurse!

slide-8
SLIDE 8

Sean Barker

Stack Frame Allocation (5)

15

yoo who amI amI amI amI yoo %rbp %rsp

Stack

yoo who amI amI amI

yoo(…) {

  • who();
  • }

who(…) {

  • • •

amI();

  • • •

amI();

  • • •

} amI(…) {

  • amI();
  • }

amI(…) {

  • amI();
  • }

amI(…) {

  • amI();
  • }

Base Case

Sean Barker

Stack Frame Allocation (6)

16

yoo who amI amI amI amI yoo %rbp %rsp

Stack

yoo who amI amI

yoo(…) {

  • who();
  • }

who(…) {

  • • •

amI();

  • • •

amI();

  • • •

} amI(…) {

  • amI();
  • }

amI(…) {

  • amI();
  • }
slide-9
SLIDE 9

Sean Barker

Stack Frame Allocation (7)

17

yoo who amI amI amI amI yoo %rbp %rsp

Stack

yoo who amI

yoo(…) {

  • who();
  • }

who(…) {

  • • •

amI();

  • • •

amI();

  • • •

} amI(…) {

  • amI();
  • }

Sean Barker

Stack Frame Allocation (8)

18

yoo who amI amI amI amI yoo %rbp %rsp

Stack

yoo who

yoo(…) {

  • who();
  • }

who(…) {

  • • •

amI();

  • • •

amI();

  • • •

}

slide-10
SLIDE 10

Sean Barker

Stack Frame Allocation (9)

19

yoo who amI amI amI amI yoo %rbp %rsp

Stack

yoo who amI

yoo(…) {

  • who();
  • }

who(…) {

  • • •

amI();

  • • •

amI();

  • • •

} amI(…) {

  • amI();
  • }

Base Case

Sean Barker

Stack Frame Allocation (10)

20

yoo who amI amI amI amI yoo %rbp %rsp

Stack

yoo who

yoo(…) {

  • who();
  • }

who(…) {

  • • •

amI();

  • • •

amI();

  • • •

}

slide-11
SLIDE 11

Sean Barker

Stack Frame Allocation (11)

21

yoo who amI amI amI amI yoo %rbp %rsp

Stack

yoo

yoo(…) {

  • who();
  • }

Sean Barker

Stack Frame Components

22

Return Addr Saved Registers + Local Variables Argument Build (Op<onal) Old %rbp Arguments 7+ Caller Frame Frame pointer %rbp Stack pointer %rsp (Op<onal)

slide-12
SLIDE 12

Sean Barker

Stack Example: incr

23

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

Sean Barker

Using the Stack (1)

24

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$al Stack Structure

. . . Rtn address 15213 Unused %rsp

Resul$ng Stack Structure

. . . Rtn address %rsp+8

slide-13
SLIDE 13

Sean Barker

Using the Stack (2)

25

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

Stack Structure

. . . Rtn address %rsp+8 Register Use(s) %rdi &v1 %rsi 3000

Sean Barker

Using the Stack (3)

26

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

Stack Structure

. . . Rtn address %rsp+8 Register Use(s) %rdi &v1 %rsi 3000

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

slide-14
SLIDE 14

Sean Barker

Using the Stack (4)

27

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

Stack Structure

. . . Rtn address %rsp+8 Register Use(s) %rax Return value %rsp

Updated Stack Structure

. . . Rtn address

Sean Barker

Using the Stack (5)

28

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 Return value %rsp

Updated Stack Structure

. . . Rtn address %rsp

Final Stack Structure

. . .

slide-15
SLIDE 15

Sean Barker

Stack Frame Components

29

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

Register Conventions

30

%rax %rdx %rcx

Return value (caller-saved)

%r8 %r9 %r10 %r11 %rdi %rsi

Arguments (caller-saved) Caller-saved temporaries

%rbx %rsp

Callee-saved Temporaries Special

%rbp %r12 %r13 %r14 %r15

slide-16
SLIDE 16

Sean Barker

Callee-Saved Example (1)

31

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$al Stack Structure

. . . Rtn address 15213 Unused %rsp

Resul$ng Stack Structure

. . . Rtn address %rsp+8 Saved %rbx

Sean Barker

Callee-Saved Example (2)

32

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-return Stack Structure

. . . Rtn address 15213 Unused %rsp

Resul3ng Stack Structure

. . . Rtn address %rsp+8 Saved %rbx

slide-17
SLIDE 17

Sean Barker

Stack Frame Components

33

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

Recursion Example

34

/* 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

slide-18
SLIDE 18

Sean Barker

Recursion Base Case

35

/* 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 Return value Return value

Sean Barker

Recursion Register Save

36

/* 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 . . . Rtn address Saved %rbx

slide-19
SLIDE 19

Sean Barker

Recursion Call Setup

37

/* 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

38

/* 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 Recursive call return value

slide-20
SLIDE 20

Sean Barker

Recursion Result

39

/* 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 Return value

Sean Barker

Recursion Result

40

/* 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 Return value Return value %rsp . . .