스택에 대한 질문....
자료구조는 아니고
여기서 본 글이구요...
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