Machine-Level Programming III:ProceduresSept. 16, 2003Machine-Level Programming III:ProceduresSept. 16, 2003TopicsTopics IA32 stack discipline Register saving conventions Creating pointers to local variablesclass07.ppt15-213“The course that gives CMU its Zip!”– 2 –15-213, F’03IA32 StackIA32 Stack Region of memory managed with stack discipline Grows toward lower addresses Register %esp indicates lowest stack address address of top elementStackPointer%espStack GrowsDownIncreasingAddressesStack “Top”Stack “Bottom”– 3 –15-213, F’03IA32 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’03IA32 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’03%esp%eax%edx%esp%eax%edx%esp%eax%edx0x1045550x1080x1080x10c0x1100x104555213213123Stack Operation ExamplesStack Operation Examples0x1080x10c0x1105552131230x108 0x104pushl %eax0x1080x10c0x1102131230x104213popl %edx0x108213– 6 –15-213, F’03Procedure 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 %eaxReturn address = 0x8048553Procedure return:Procedure return: ret Pop address from stack; Jump to address– 7 –15-213, F’03%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– 8 –15-213, F’03%esp%eip0x104%esp%eip0x80485910x80485910x1040x1040x1080x10c0x1100x8048553123Procedure Return ExampleProcedure Return Example0x1080x10c0x110123ret8048591: c3 ret0x108%eip is program counter0x80485530x8048553– 9 –15-213, F’03Stack-Based LanguagesStack-Based LanguagesLanguages that Support RecursionLanguages that Support Recursion e.g., C, Pascal, Java Code must be “Reentrant” Multiple simultaneous instantiations of single procedure Need some place to store state of each instantiation Arguments Local variables Return pointerStack DisciplineStack Discipline State for given procedure needed for limited time From when called to when return Callee returns before caller doesStack Allocated in Stack Allocated in FramesFrames state for single procedure instantiation– 10 –15-213, F’03Call Chain ExampleCall Chain ExampleCode StructureCode Structureyoo(…){••who();••}who(…){• • •amI();• • •amI();• • •}amI(…){••amI();••}yoowhoamIamIamICall Chain Procedure amIrecursiveamI– 11 –15-213, F’03StackPointer%espyoowhoprocFramePointer%ebpStack“Top”Stack FramesStack FramesContentsContents Local variables Return information Temporary spaceManagementManagement Space allocated when enter procedure “Set-up” code Deallocated when return “Finish” codePointersPointers Stack pointer %esp indicates stack top Frame pointer %ebp indicates start of current frameamI– 12 –15-213, F’03StackPointer%espyoo•••FramePointer%ebpStack OperationStack OperationyooCall Chainyoo(…){••who();••}– 13 –15-213, F’03StackPointer%espyoowho•••FramePointer%ebpStack OperationStack OperationyoowhoCall Chainwho(…){• • •amI();• • •amI();• • •}– 14 –15-213, F’03StackPointer%espyoowhoamI•••FramePointer%ebpStack OperationStack OperationyoowhoamICall ChainamI(…){••amI();••}– 15 –15-213, F’03StackPointer%espyoowhoamI•••FramePointer%ebpStack OperationStack OperationyoowhoamICall ChainamI(…){••amI();••}amIamI– 16 –15-213, F’03StackPointer%espyoowhoamI•••FramePointer%ebpStack OperationStack OperationyoowhoamICall ChainamI(…){••amI();••}amIamIamIamI– 17 –15-213, F’03StackPointer%espyoowhoamI•••FramePointer%ebpStack OperationStack OperationyoowhoamICall ChainamI(…){••amI();••}amIamIamI– 18 –15-213, F’03StackPointer%espyoowhoamI•••FramePointer%ebpStack OperationStack OperationyoowhoamICall ChainamI(…){••amI();••}amIamI– 19 –15-213, F’03StackPointer%espyoowho•••FramePointer%ebpStack OperationStack OperationyoowhoCall Chainwho(…){• • •amI();• • •amI();• • •}amIamIamI– 20 –15-213, F’03StackPointer%espyoowhoamI•••FramePointer%ebpStack OperationStack OperationyoowhoCall ChainamI(…){••••}amIamIamIamI– 21 –15-213, F’03StackPointer%espyoowho•••FramePointer%ebpStack OperationStack OperationyoowhoCall Chainwho(…){• • •amI();• • •amI();• • •}amIamIamIamI– 22 –15-213, F’03yoo(…){••who();••}StackPointer%espyoo•••FramePointer%ebpStack OperationStack OperationyoowhoCall ChainamIamIamIamI– 23 –15-213, F’03IA32/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 variables If can’t keep in registers Saved register context Old frame pointerCaller Stack FrameCaller Stack Frame Return address Pushed by call instruction Arguments for this callStack Pointer(%esp)Frame Pointer(%ebp)Return AddrSavedRegisters+LocalVariablesArgumentBuildOld %ebpArgumentsCallerFrame– 24 –15-213, F’03Revisiting 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– 25 –15-213, F’03Revisiting 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
View Full Document