학습자료(~2017)/C,C++

함수 호출 과정과 스택 프레임 Stack Frame

단세포소년 2011. 7. 20. 09:33
반응형

함수 호출 과정과 스택 프레임Stack Frame

1. 인자를 스택에 집어 넣는다
// int main(int argc, char* argv[])
    x = function(a, b, c);
0041117E mov    eax,dword ptr [c]
00411181 push   eax    // 인자 c를 스택에 집어넣는다
00411182 mov    ecx,dword ptr [b]
00411185 push   ecx    // 인자 b를 스택에 집어넣는다
00411186 mov    edx,dword ptr [a]
00411189 push   edx    // 인자 a를 스택에 집어넣는다

표 1) 인자를 스택에 집어 넣는 어셈블리 코드와 스택의 상태



2. 함수를 호출한다
0041118A call   function (4110A5h)

표 2) 함수를 호출하는 어셈블리 코드와 스택의 상태



3. 프레임 포인터를 설정한다
// int function(int a, int b, int c)
int function(int a, int b, int c)
{
00411140 push   ebp    // 호출한 함수의 프레임 포인터를 저장한다
00411141 mov    ebp,esp  // 현재 스택 위치를 프레임 포인터로 설정한다

표 3) 프레임 포인터를 재설정하는 어셈블리 코드와 스택의 상태



4. 로컬 변수를 위한 공간을 할당한다
00411143 sub    esp,40h   // 로컬 변수 공간으로 64 바이트를 할당한다

표 4) 로컬 변수 공간을 할당하는 어셈블리 코드와 스택의 상태



5. 호출한 함수의 실행 상태를 보존한다
00411146 push   ebx    // 호출한 함수의 실행 상태를 보존한다
00411147 push   esi
00411148 push   edi

표 5) 실행 상태를 보존하는 어셈블리 코드와 스택의 상태



6. 함수를 실행한다
    return a+b+c;
00411149 mov    eax,dword ptr [ebp+8]
0041114C add    eax,dword ptr [ebp+12]
0041114F add    eax,dword ptr [ebp+16]

표 6) 인자로 주어진 값을 더한 뒤 리턴하는 어셈블리 코드



7. 호출한 함수의 실행 상태를 복구한다
00411152 pop    edi    // 호출한 함수의 실행 상태를 복구한다
00411153 pop    esi
00411154 pop    ebx

표 7) 실행 상태를 복구하는 어셈블리 코드와 스택의 상태

8. 스택을 정리하고, 프레임 포인터를 복구한다
00411155 mov    esp,ebp    // 사용한 스택을 정리한다
00411157 pop    ebp      // 호출한 함수의 프레임 포인터를 복구한다

표 8) 프레임 포인터를 복구하는 어셈블리 코드와 스택의 상태


9. 함수로부터 돌아간다
00411158 ret

표 9) 함수에서 리턴하는 어셈블리 코드와 스택의 상태


10. 스택에 집어넣은 인자를 정리한다
0041118F add    esp,0Ch         // 스택에 넣은 인자를 꺼낸다
00411192 mov    dword ptr [x],eax    // 리턴 값을 x에 저장한다

표 10) 인자를 정리하는 어셈블리 코드와 스택의 상태

반응형