스택에 대한 질문....
자료구조는 아니고
여기서 본 글이구요...
http://web.kaist.ac.kr/~taekwonv/stack.htm
여기나오는 어셈 코드중에서..
10:
11: void main(void) // main함수의 시작이다.
12: {
00401060 push ebp
00401061 mov ebp,esp
00401063 sub esp,4Ch
00401066 push ebx
00401067 push esi
00401068 push edi
00401069 lea edi,[ebp-4Ch]
0040106C mov ecx,13h
00401071 mov eax,0CCCCCCCCh
00401076 rep stos dword ptr [edi] //여기까지가 준비과정. 그리 신경쓰지 말자.
13: int a;
14: int b;
15: int c;
16:
17: a=1;
00401078 mov dword ptr [ebp-4],1 //지역변수 a의 값을 ebp-4에 기록. 역시 bp-4n의 법칙 따르고 있죠.
18: b=2;
0040107F mov dword ptr [ebp-8],2 //지역변수 b의 값을 ebp-8에 기록. 역시 bp-4n의 법칙을 따릅니다.
19: c=plusFunc(a, b); //esp=12ff28, ebp=12ff80, [ebp-4]=01000000, [ebp-8]=02000000
00401086 mov eax,dword ptr [ebp-8]
00401089 push eax //esp=12ff24(02000000), ebp=12ff80 스택의 값이 줄어들었죠. 스택은 거꾸로 자랍니다.
0040108A mov ecx,dword ptr [ebp-4] //역시 esp만 변할뿐 ebp는 기준점으로 변하지 않죠
0040108D push ecx //esp=12ff20(01000000), ebp=12ff80 인자가 반대순서 2, 1로 들어간 것을 확인합니다.
0040108E call @ILT+0(plusFunc) (00401005) //esp=12ff1c(93104000), ebp=12ff80 현재 esp엔 리턴주소가 들어가죠. 401093 보이시죠
//요녀석의 주소가 401093으로 리턴되면 일루 오죠. 그럼 콜을 따라가보죠.
//piusFunc로 가셨다가 일루 리턴해오세요. 아래로 내려가세요.
00401093 add esp,8 //스택을 두 개 썼으니 두 개 빼줘야죠. 이로써 스택은 복구됨. 뜻을 음미해보세요
00401096 mov dword ptr [ebp-0Ch],eax //지역변수 c가 [ebp-c]에 리턴값 eax를 받아서 저장됨
20: }
00401099 pop edi
0040109A pop esi
0040109B pop ebx
0040109C add esp,4Ch
0040109F cmp ebp,esp
004010A1 call __chkesp (004010c0)
004010A6 mov esp,ebp
004010A8 pop ebp //컴파일러가 스택을 꼼꼼하게 검사해주는군요.
004010A9 ret //리턴. 어디로 리턴될까나?
질문!!!!
00401063 sub esp,4Ch
이것의 의미가 스택프레임을 만들어준다고 했는데...
esp=12ff28일때 push하면 12ff24가 되면서 계속 음으로 자라는데... ebp와 esp사이의 공간은 어떤 용도 인건지요?
지역변수
지역변수 저장용입니다.
Written By the Black Knight of Destruction
Written By the Black Knight of Destruction
댓글 달기