call stack - wellesley collegecs240/f18/slides/x86-procedures-handout.pdfprocedures and the call...

5
Procedures and the Call Stack Topics Procedures Call stack Procedure/stack instructions Calling conventions Register-saving conventions Call Stack Memory region managed with stack discipline %rsp holds lowest stack address (address of "top" element) Stack Pointer: %rsp stack grows toward lower addresses higher addresses Stack “Top” Stack “Bottom” 9 Stack frames support procedure calls. Contents Local variables Function arguments (after first 6) Return information Temporary space Management Space allocated when procedure is entered “Setup” code Space deallocated before return “Finish” code Why not just give every procedure a permanent chunk of memory to hold its local variables, etc? 26 %rsp Stack Pointer Caller Frame Stack “Top” Frame for current procedure Procedure Control Flow Instructions Procedure call: callq label 1. Push return address on stack 2. Jump to label Return address: Address of instruction after call. Example: 400544: callq 400550 <mult2> 400549: movq %rax,(%rbx) Procedure return: retq 1. Pop return address from stack 2. Jump to address 28

Upload: others

Post on 25-Oct-2020

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Call Stack - Wellesley Collegecs240/f18/slides/x86-procedures-handout.pdfProcedures and the Call Stack Topics •Procedures •Call stack •Procedure/stack instructions •Calling

ProceduresandtheCallStack

Topics

• Procedures

• Callstack

• Procedure/stackinstructions

• Callingconventions

• Register-savingconventions

CallStack

Memoryregionmanagedwithstackdiscipline

%rsp holdsloweststackaddress

(addressof"top"element)

StackPointer:%rsp

stackgrows

toward

lower addresses

higher

addresses

Stack“Top”

Stack“Bottom”

9

Stackframessupportprocedurecalls.

Contents

Localvariables

Functionarguments(afterfirst6)

Returninformation

Temporaryspace

Management

Spaceallocatedwhen procedureisentered

“Setup”code

Spacedeallocatedbeforereturn

“Finish”code

Whynotjustgiveeveryprocedure apermanent

chunkofmemorytoholditslocalvariables,etc?

26

%rspStackPointer

Caller

Frame

Stack“Top”

Framefor

current

procedure

ProcedureControlFlowInstructions

Procedurecall:callq label1. Pushreturnaddressonstack

2. Jumptolabel

Returnaddress: Addressofinstructionaftercall.Example:

400544: callq 400550 <mult2>400549: movq %rax,(%rbx)

Procedurereturn:retq1. Popreturnaddressfromstack

2. Jumptoaddress

28

Page 2: Call Stack - Wellesley Collegecs240/f18/slides/x86-procedures-handout.pdfProcedures and the Call Stack Topics •Procedures •Call stack •Procedure/stack instructions •Calling

Call Example(step1)

0000000000400550 <mult2>:400550: mov %rdi,%rax••400557: retq

0000000000400540 <multstore>:••400544: callq 400550 <mult2>400549: mov %rax,(%rbx)••

0x400544

0x120

•••

%rsp

0x120

0x128

0x130

%rip

29

0000000000400550 <mult2>:400550: mov %rdi,%rax••400557: retq

0000000000400540 <multstore>:••400544: callq 400550 <mult2>400549: mov %rax,(%rbx)••

0x400557

0x118

0x400549

•••

%rsp

0x120

0x128

0x130

0x118

%rip

Return Example(step1)

31

ProcedureDataFlow

Onlyallocatestackspacewhenneeded

%rdi

%rsi

%rdx

%rcx

%r8

%r9

%rax

Arg 7

• • •

Arg 8

Arg n

• • •High

Addresses

Low

Addresses

Diane’sSilkDressCosts$8 9

First6argumentspassed

inregisters

Returnvalue

Arg 1

Arg 6

Remainingargumentspassed

onstack(inmemory)

StackFrame

35

ReturnAddress

SavedRegisters

+

Local Variables

ExtraArguments

fornextcall

ExtraArguments

tocallee

Caller

Frame

Stackpointer%rsp

Callee

Frame

Page 3: Call Stack - Wellesley Collegecs240/f18/slides/x86-procedures-handout.pdfProcedures and the Call Stack Topics •Procedures •Call stack •Procedure/stack instructions •Calling

Example:increment

long increment(long* p, long val) {long x = *p;long y = x + val;*p = y;return x;

}

increment:movq (%rdi), %raxaddq %rax, %rsimovq %rsi, (%rdi)ret

Register Use(s)

%rdi Argumentp

%rsi Argumentval, y

%rax x,Returnvalue

37

ProcedureCallExample(initialstate)

38

call_incr:subq $16, %rspmovq $240, 8(%rsp)movl $61, %esileaq 8(%rsp), %rdicall incrementaddq 8(%rsp), %raxaddq $16, %rspret

long call_incr() {long v1 = 240;long v2 = increment(&v1, 61);return v1+v2;

}

InitialStackStructure

•••

Returnaddr <main+8>%rsp

%rsi

%rdi

%rax

ProcedureCallExample(step4)

42

call_incr:subq $16, %rspmovq $240, 8(%rsp)movl $61, %esileaq 8(%rsp), %rdicall incrementaddq 8(%rsp), %raxaddq $16, %rspret

long call_incr() {long v1 = 240;long v2 = increment(&v1, 61);return v1+v2;

}

StackStructure

increment:movq (%rdi), %rax # x = *paddq %rax, %rsi # y = x+61movq %rsi, (%rdi) # *p = yret

•••

Returnaddr <main+8>

301Unused

Returnaddr <call_incr+?>

%rsp

%rsi

301

%rdi

&v1

%rax

240

long increment(long* p, long val) {long x = *p;long y = x + val;*p = y;return x;

}v1incall_incrà

ProcedureCallExample(step6)

StackStructure

44

long call_incr() {long v1 = 240;long v2 = increment(&v1, 61);return v1+v2;

}

call_incr:subq $16, %rspmovq $240, 8(%rsp)movl $61, %esileaq 8(%rsp), %rdicall incrementaddq 8(%rsp), %raxaddq $16, %rspret

•••

Returnaddr <main+8>

301Unused

Update %rax:v1+v2

%rsp

%rsi

301

%rdi

&v1

%rax

541

v1incall_incrà

Page 4: Call Stack - Wellesley Collegecs240/f18/slides/x86-procedures-handout.pdfProcedures and the Call Stack Topics •Procedures •Call stack •Procedure/stack instructions •Calling

APuzzle

*p = d;return x - c;

movsbl %dl,%edxmovl %edx,(%rsi)movswl %di,%edisubl %edi,%ecxmovl %ecx,%eax

WritetheCfunction

header,types,and

orderofparameters.

Cfunctionbody:

assembly:

movsbl =movesign-extendingabytetoalong(4-byte)

movswl =movesign-extendingaword(2-byte)toalong(4-byte)

RegisterSavingConventions

yoo calls who:Caller Callee

Willregistercontentsstillbethereafteraprocedurecall?

Conventions:

CallerSave

Callee Save

yoo:• • •movq $12345, %rbxcall whoaddq %rbx, %rax• • •ret

who:• • •addq %rdi, %rbx• • •ret

49

?

x86-6464-bitRegisterConventions

51

%rax

%rbx

%rcx

%rdx

%rsi

%rdi

%rsp

%rbp

%r8

%r9

%r10

%r11

%r12

%r13

%r14

%r15Callee saved Callee saved

Callee saved

Callee saved

Callee saved

Callersaved

Callee saved

Stackpointer

CallerSaved

Returnvalue– Callersaved

Argument#4– Callersaved

Argument#1– Callersaved

Argument#3– Callersaved

Argument#2– Callersaved

Argument#6– Callersaved

Argument#5– Callersaved

Callee-SavedExample

call_incr2:pushq %rbxsubq $16, %rspmovq %rdi, %rbxmovq $240, 8(%rsp)movl $61, %esileaq 8(%rsp), %rdicall incrementaddq %rbx, %raxaddq $16, %rsppopq %rbxret

long call_incr2(long x) {long v1 = 240;long v2 = increment(&v1, 61);return x+v2;

}

Begin/EndStackStructure

%rsp

...

Rtn address

StackStructureincall_incr2

240

Unused %rsp

...

Rtn address

%rsp+8Saved%rbx

52

Page 5: Call Stack - Wellesley Collegecs240/f18/slides/x86-procedures-handout.pdfProcedures and the Call Stack Topics •Procedures •Call stack •Procedure/stack instructions •Calling

/* Recursive popcount */long pcount_r(unsigned long x) {if (x == 0) {return 0;

} else {return (x & 1)

+ pcount_r(x >> 1);}

}

RecursiveFunctionpcount_r:movl $0, %eaxtestq %rdi, %rdije .L6pushq %rbxmovq %rdi, %rbxandl $1, %ebxshrq %rdicall pcount_raddq %rbx, %raxpopq %rbx

.L6:rep; ret

54

x86-64stackstorageexample

(1)

61

long int call_proc() {long x1 = 1;int x2 = 2;short x3 = 3;char x4 = 4;proc(x1, &x1, x2, &x2,

x3, &x3, x4, &x4);return (x1+x2)*(x3-x4);

}

call_proc:subq $32,%rspmovq $1,16(%rsp) # x1movl $2,24(%rsp) # x2movw $3,28(%rsp) # x3movb $4,31(%rsp) # x4• • •

Returnaddresstocallerofcall_proc ←%rsp

ProcedureSummary

call, ret, push, popStackdisciplinefitsprocedurecall/return.*

IfPcallsQ:Q(andcallsbyQ)returnsbeforeP

Conventionssupportarbitraryfunctioncalls.

Register-saveconventions.

Stackframesavesextraargs orlocalvariables.

Resultreturnedin%rax

*Take251tolearnaboutlanguageswhereitdoesn't. 66

ReturnAddress

SavedRegisters

+

Local Variables

ExtraArguments

fornextcall

ExtraArguments

tocallee

Caller

Frame

Stackpointer

%rsp

Callee

Frame

128-byteredzone

%rax

%rbx

%rcx

%rdx

%rsi

%rdi

%rsp

%rbp

%r8

%r9

%r10

%r11

%r12

%r13

%r14

%r15Callee saved Callee saved

Callee saved

Callee saved

Callee saved

Callersaved

Callee saved

Stackpointer

CallerSaved

Returnvalue– Callersaved

Argument#4– Callersaved

Argument#1– Callersaved

Argument#3– Callersaved

Argument#2– Callersaved

Argument#6– Callersaved

Argument#5– Callersaved