| pjm2108 |
esp가 스택의 가장 아랫부분을 가리키고 있기 때문입니다. 어셈블리로 관찰하면 쉽게 이해 됩니다.
ebp는 스택의 시작부분, esp는 스택의 끝부분을 나타내는 레지스터라고 말하고 시작합시다.
push ebp
mov ebp, esp
sub esp, 40h
..중략
add esp, 40h
mov esp, ebp
pop ebp
ret
이게 함수를 call 하면 이동한 루틴의 기본 형태입니다. stdcall이냐 fastcall이냐 뭐 이런거에 따라 달라진다는데, 일단은 저런 형태이구요. sub esp, 40h를 눈여겨 보시면 됩니다. 이건 스택의 크기가 40h 라는 의미입니다.
원래 esp가 ebp였음을 기억하면, esp에서 -40h 했으니, 스택의 가장 아랫부분을 가리키고 있다는 것이 이해되죠?
한마디로 말하면 스택은 [esp ---------<------- ebp][ret] 이라고 보시면 됩니다.
방향이 이상할 수 있는데, 만약 int a; 를 하셔서 지역변수를 선언하면 ... 아 스택에 대한건 끊을께요.
아무튼 esp가 스택의 마지막 부분을 가리키고 있기 때문에 이를 통해 offset을 추측하겠다! 라는 겁니다.
위의 40h는 어떤 지역변수도 선언되지 않았을 때 입니다. 만약 int 형 지역변수가 하나 추가되면 -44h 하겠죠.. |
2013/05/04 |
|