함수 호출 과정과 스택 프레임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) 인자를 정리하는 어셈블리 코드와 스택의 상태
'학습자료(~2017) > C,C++' 카테고리의 다른 글
유니코드(unicode) 관련 함수 (0) | 2011.11.17 |
---|---|
[WINAPI] 파일 경로 조작 api (1) | 2011.11.12 |
icon overlay 아이콘 오버레이 [펌 정리] (0) | 2011.11.10 |
Icon Overlay 아이콘 오버레이 (0) | 2011.11.08 |
register 변수와 volatile 변수 (0) | 2011.04.05 |