call stack - wellesley collegecs240/f18/slides/x86-procedures-handout.pdfprocedures and the call...
TRANSCRIPT
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
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
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à
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
/* 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