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


Top Related