Machine-Level Programming III:ProceduresSept. 15, 2006Machine-Level Programming III:ProceduresSept. 15, 2006IA32IA32 stack discipline Register saving conventions Creating pointers to local variablesx86x86--6464 Argument passing in registers Minimizing stack usage Using stack pointer as only referenceclass06.ppt15-213“The course that gives CMU its Zip!”15-213, F’06–2–15-213, F’06IA32 StackIA32 Stack Region of memory managed with stack discipline Grows toward lower addresses Register %esp indicates lowest stack addressz address of top elementStackPointer%espStack GrowsDownIncreasingAddressesStack “Top”Stack “Bottom”–3–15-213, F’06IA32 Stack PushingIA32 Stack PushingPushingPushing pushl Src Fetch operand at Src Decrement %esp by 4 Write operand at address given by %espStack GrowsDownIncreasingAddressesStack “Top”Stack “Bottom”StackPointer%esp-4–4–15-213, F’06IA32 Stack PoppingIA32 Stack PoppingPoppingPopping popl Dest Read operand at address given by %esp Increment %esp by 4 Write to DestStackPointer%espStack GrowsDownIncreasingAddressesStack “Top”Stack “Bottom”+4–5–15-213, F’06Procedure Control FlowProcedure Control Flow Use stack to support procedure call and returnProcedure call:Procedure call:call label Push return address on stack; Jump to labelReturn address valueReturn address value Address of instruction beyond call Example from disassembly804854e: e8 3d 06 00 00 call 8048b90 <main>8048553: 50 pushl %eaxzReturn address = 0x8048553Procedure return:Procedure return: ret Pop address from stack; Jump to address–6–15-213, F’06%esp%eip%esp%eip0x804854e0x1080x1080x10c0x1100x1040x804854e0x8048553123Procedure 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’06%esp%eip0x104%esp%eip0x80485910x80485910x1040x1040x1080x10c0x1100x8048553123Procedure Return ExampleProcedure Return Example0x1080x10c0x110123ret8048591: c3 ret0x108%eip is program counter0x80485530x8048553–8–15-213, F’06Stack-Based LanguagesStack-Based LanguagesLanguages that Support RecursionLanguages that Support Recursion e.g., C, Pascal, Java Code must be “Reentrant”z Multiple simultaneous instantiations of single procedure Need some place to store state of each instantiationz Argumentsz Local variablesz Return pointerStack DisciplineStack Discipline State for given procedure needed for limited timez From when called to when return Callee returns before caller doesStack Allocated in Stack Allocated in FramesFrames state for single procedure instantiation–9–15-213, F’06Call Chain ExampleCall Chain ExampleCode StructureCode Structureyoo(…){••who();••}who(…){•••amI();•••amI();•••}amI(…){••amI();••}yoowhoamIamIamICall Chain Procedure amIrecursiveamI–10–15-213, F’06StackPointer%espyoowhoprocFramePointer%ebpStack“Top”Stack FramesStack FramesContentsContents Local variables Return information Temporary spaceManagementManagement Space allocated when enter procedurez “Set-up” code Deallocated when returnz “Finish” codePointersPointers Stack pointer %esp indicates stack top Frame pointer %ebp indicates start of current frameamI–11–15-213, F’06StackPointer%espyoo•••FramePointer%ebpStack OperationStack OperationyooCall Chainyoo(…){••who();••}–12–15-213, F’06StackPointer%espyoowho•••FramePointer%ebpStack OperationStack OperationyoowhoCall Chainwho(…){•••amI();•••amI();•••}–13–15-213, F’06StackPointer%espyoowhoamI•••FramePointer%ebpStack OperationStack OperationyoowhoamICall ChainamI(…){••amI();••}–14–15-213, F’06StackPointer%espyoowhoamI•••FramePointer%ebpStack OperationStack OperationyoowhoamICall ChainamI(…){••amI();••}amIamI–15–15-213, F’06StackPointer%espyoowhoamI•••FramePointer%ebpStack OperationStack OperationyoowhoamICall ChainamI(…){••amI();••}amIamIamIamI–16–15-213, F’06StackPointer%espyoowhoamI•••FramePointer%ebpStack OperationStack OperationyoowhoamICall ChainamI(…){••amI();••}amIamIamI–17–15-213, F’06StackPointer%espyoowhoamI•••FramePointer%ebpStack OperationStack OperationyoowhoamICall ChainamI(…){••amI();••}amIamI–18–15-213, F’06StackPointer%espyoowho•••FramePointer%ebpStack OperationStack OperationyoowhoCall Chainwho(…){•••amI();•••amI();•••}amIamIamI–19–15-213, F’06StackPointer%espyoowhoamI•••FramePointer%ebpStack OperationStack OperationyoowhoCall ChainamI(…){••••}amIamIamIamI–20–15-213, F’06StackPointer%espyoowho•••FramePointer%ebpStack OperationStack OperationyoowhoCall Chainwho(…){•••amI();•••amI();•••}amIamIamIamI–21–15-213, F’06yoo(…){••who();••}StackPointer%espyoo•••FramePointer%ebpStack OperationStack OperationyoowhoCall ChainamIamIamIamI–22–15-213, F’06IA32/Linux Stack FrameIA32/Linux Stack FrameCurrent Stack Frame (Current Stack Frame (““TopTop””to Bottom)to Bottom) Parameters for function about to callz “Argument build” Local variablesz If can’t keep in registers Saved register context Old frame pointerCaller Stack FrameCaller Stack Frame Return addressz Pushed by call instruction Arguments for this callStack Pointer(%esp)Frame Pointer(%ebp)Return AddrSavedRegisters+LocalVariablesArgumentBuildOld %ebpArgumentsCallerFrame–23–15-213, F’06Revisiting swapRevisiting swapvoid swap(int *xp, int *yp) {int t0 = *xp;int t1 = *yp;*xp = t1;*yp = t0;}int zip1 = 15213;int zip2 = 91125;void call_swap(){swap(&zip1, &zip2);}call_swap:•••pushl $zip2 # Global Varpushl $zip1 # Global Varcall swap•••&zip2&zip1Rtn adr%espResultingStack•••Calling swap from call_swap–24–15-213, F’06Revisiting swapRevisiting swapvoid swap(int *xp, int *yp) {int t0 = *xp;int t1 = *yp;*xp = t1;*yp = t0;}swap:pushl %ebpmovl %esp,%ebppushl %ebxmovl 12(%ebp),%ecxmovl 8(%ebp),%edxmovl (%ecx),%eaxmovl (%edx),%ebxmovl %eax,(%edx)movl %ebx,(%ecx)movl -4(%ebp),%ebxmovl %ebp,%esppopl %ebpretBodySetUpFinish–25–15-213, F’06swap Setup #1swap Setup #1swap:pushl %ebpmovl %esp,%ebppushl
View Full Document