Machine-Level Programming III: Procedures Sept. 14, 2007IA32 StackIA32 Stack PushingIA32 Stack PoppingProcedure Control FlowProcedure Call ExampleProcedure Return ExampleStack-Based LanguagesCall Chain ExampleStack FramesStack OperationSlide 12Slide 13Slide 14Slide 15Slide 16Slide 17Slide 18Slide 19Slide 20Slide 21IA32/Linux Stack FrameRevisiting swapSlide 24swap Setup #1swap Setup #2swap Setup #3Effect of swap Setupswap Finish #1swap Finish #2swap Finish #3swap Finish #4Register Saving ConventionsSlide 34IA32/Linux Register UsageRecursive FactorialRfact Stack SetupRfact BodyRfact RecursionRfact ResultRfact CompletionPointer CodeCreating & Initializing PointerPassing PointerUsing PointerIA 32 Procedure Summaryx86-64 General Purpose Registersx86-64 Register Conventionsx86-64 Registersx86-64 Long Swapx86-64 Locals in the Red Zonex86-64 NonLeaf without Stack Framex86-64 Call using Jumpx86-64 Stack Frame ExampleUnderstanding x86-64 Stack FrameStack OperationsInteresting Features of Stack Framex86-64 Procedure SummaryMachine-Level Programming III:ProceduresSept. 14, 2007Machine-Level Programming III:ProceduresSept. 14, 2007IA32IA32stack disciplineRegister saving conventionsCreating pointers to local variablesx86-64x86-64Argument passing in registersMinimizing stack usageUsing stack pointer as only referenceclass06.ppt15-213“The course that gives CMU its Zip!”15-213, F’07– 2 –15-213, F’07IA32 StackIA32 StackRegion of memory managed with stack disciplineGrows toward lower addressesRegister %esp indicates lowest stack addressaddress of top elementStackPointer%espStack GrowsDownIncreasingAddressesStack “Top”Stack “Bottom”– 3 –15-213, F’07IA32 Stack PushingIA32 Stack PushingPushingPushingpushl SrcFetch operand at SrcDecrement %esp by 4Write operand at address given by %espStack GrowsDownIncreasingAddressesStack “Top”Stack “Bottom”StackPointer%esp-4– 4 –15-213, F’07IA32 Stack PoppingIA32 Stack PoppingPoppingPoppingpopl DestRead operand at address given by %espIncrement %esp by 4Write to DestStackPointer%espStack GrowsDownIncreasingAddressesStack “Top”Stack “Bottom”+4– 5 –15-213, F’07Procedure Control FlowProcedure Control FlowUse stack to support procedure call and returnProcedure call:Procedure call:call labelPush return address on stack; Jump to labelReturn address valueReturn address valueAddress of instruction beyond callExample from disassembly 804854e: e8 3d 06 00 00 call 8048b90 <main> 8048553: 50 pushl %eaxReturn address = 0x8048553Procedure return:Procedure return:ret Pop address from stack; Jump to address– 6 –15-213, F’07%esp%eip%esp%eip 0x804854e0x1080x1080x10c0x1100x1040x804854e0x8048553123Procedure Call ExampleProcedure Call Example0x1080x10c0x1101230x108call 8048b90804854e: e8 3d 06 00 00 call 8048b90 <main>8048553: 50 pushl %eax0x8048b900x104%eip is program counter– 7 –15-213, F’07%esp%eip0x104%esp%eip 0x80485910x80485910x1040x1040x1080x10c0x1100x8048553123Procedure Return ExampleProcedure Return Example0x1080x10c0x110123ret8048591: c3 ret0x108%eip is program counter0x80485530x8048553– 8 –15-213, F’07Stack-Based LanguagesStack-Based LanguagesLanguages that Support RecursionLanguages that Support Recursione.g., C, Pascal, JavaCode must be “Reentrant”Multiple simultaneous instantiations of single procedureNeed some place to store state of each instantiationArgumentsLocal variablesReturn pointerStack DisciplineStack DisciplineState for given procedure needed for limited timeFrom when called to when returnCallee returns before caller doesStack Allocated in Stack Allocated in FramesFramesstate for single procedure instantiation– 9 –15-213, F’07Call Chain ExampleCall Chain ExampleCode StructureCode Structureyoo(…){••who();••}who(…){• • •amI();• • •amI();• • •}amI(…){••amI();••}yoowhoamIamIamICall ChainProcedure amI recursiveamI– 10 –15-213, F’07StackPointer%espyoowhoprocFramePointer%ebpStack“Top”Stack FramesStack FramesContentsContentsLocal variablesReturn informationTemporary spaceManagementManagementSpace allocated when enter procedure“Set-up” codeDeallocated when return“Finish” codePointersPointersStack pointer %esp indicates stack topFrame pointer %ebp indicates start of current frameamI– 11 –15-213, F’07StackPointer%espyoo•••FramePointer%ebpStack OperationStack OperationyooCall Chainyoo(…){••who();••}– 12 –15-213, F’07StackPointer%espyoowho•••FramePointer%ebpStack OperationStack OperationyoowhoCall Chainwho(…){• • •amI();• • •amI();• • •}– 13 –15-213, F’07StackPointer%espyoowhoamI•••FramePointer%ebpStack OperationStack OperationyoowhoamICall ChainamI(…){••amI();••}– 14 –15-213, F’07StackPointer%espyoowhoamI•••FramePointer%ebpStack OperationStack OperationyoowhoamICall ChainamI(…){••amI();••}amIamI– 15 –15-213, F’07StackPointer%espyoowhoamI•••FramePointer%ebpStack OperationStack OperationyoowhoamICall ChainamI(…){••amI();••}amIamIamIamI– 16 –15-213, F’07StackPointer%espyoowhoamI•••FramePointer%ebpStack OperationStack OperationyoowhoamICall ChainamI(…){••amI();••}amIamIamI– 17 –15-213, F’07StackPointer%espyoowhoamI•••FramePointer%ebpStack OperationStack OperationyoowhoamICall ChainamI(…){••amI();••}amIamI– 18 –15-213, F’07StackPointer%espyoowho•••FramePointer%ebpStack OperationStack OperationyoowhoCall Chainwho(…){• • •amI();• • •amI();• • •}amIamIamI– 19 –15-213, F’07StackPointer%espyoowhoamI•••FramePointer%ebpStack OperationStack OperationyoowhoCall ChainamI(…){••••}amIamIamIamI– 20 –15-213, F’07StackPointer%espyoowho•••FramePointer%ebpStack OperationStack OperationyoowhoCall Chainwho(…){• • •amI();• • •amI();• • •}amIamIamIamI– 21 –15-213, F’07yoo(…){••who();••}StackPointer%espyoo•••FramePointer%ebpStack OperationStack OperationyoowhoCall ChainamIamIamIamI– 22 –15-213, F’07IA32/Linux Stack FrameIA32/Linux Stack FrameCurrent Stack Frame (“Top” Current Stack Frame (“Top” to Bottom)to Bottom)Parameters for function about to call“Argument build”Local variablesIf
View Full Document