1619, 1/81 회원가입  로그인  
   wjsqud011
   http://없다.
   [머리속] push ebp mov ebp,esp에...

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=1851 [복사]


디버깅에서 보면 흔히
push ebp
mov ebp,esp
를 볼 수 있을 것입니다.

이것의 이유는 2가지 때문입니다.

1. 프로그램이 종료 될때 반환하기 위해서
2. 컴퓨터 마다 환경이 다르므로

제가 공부하다가 이게 왜 있나 인터넷과 서적을 뒤져, 끝내 알아 냈습니다.

1. 프로그램이 종료 될때 반환하기 위해서 라고 제가 말했는데...
그 이유에 대해 설명하겠습니다.
'http://www.hackerschool.org/Sub_Html/HS_University/BOF/essential/12.html'에서 보면
복귀 할때 리턴 어드레스를 저장한다고 했습니다. 그 리턴 어드레스를 스텍에 저장하기 위해서 입니다.
즉, main도 함수이기 때문에 다음과 같은 작업이 필요한 것입니다. 그리고 main이 복귀 된다는 것은
프로그램이 종료된다는 의미 입니다.

2. 컴퓨터 마다 환경이 다르므로 라고 제가 말했습니다.
그 이유는 상황에 따라 다릅니다. 어떤 컴퓨터는 메이x를 실행하고 그 프로그램을 실행 할 수도 있고,
어떤 컴퓨터는 인터넷을 실행하고, 다 다릅니다. 따라서 ebp 값도 변한다는 이야기 입니다.
그래서 컴파일러는 그러한 것을 고려하여 위와 같은 명령어를 하는 것입니다.



참고 - 알아두면 좋은거???

main도 함수이기 때문에 어디선가 값을 받을 것 입니다. 즉 운영체제에서 받을 텐데....
어떻게 받을 까요??
우리가 디버깅하면 mov eax,[ebp+4]와 같은 것을 보실수 있습니다.
                                        ------
                                            |------->이것이 바로 변수 입니다.
다음과 같은 규칙이 있습니다.
ebp-x 같은 경우는 새로운 변수를 생성한다는 이야기 입니다.
ebp+x 같은 경우는 변수를 불러 오겠다는 이야기 입니다.

그려면 main함수 같은 경우
int main(int arvc, char *arvg[])
{
     printf("%d",arvc);
}
와 같은 것이 있으면 디버깅에서 보면 어떻게 할까요??
아마도

push ebp
mov ebp,esp
push dword ptr[ebp+4]
call printf
라고 할 것입니다. 아마도.... 제 생각에는.....
아니면 말고......




2번째 참고, 욕사절, 잘못됬으면 너무 직설적으로 하지마세요.. ㅠㅠㅠ 저 상처받아요... ㅠㅠㅠ
저는 B형이지만 몇%는 A형 피도 섞어 있을 거예요.... 아마도... 그러니 제발 직설적으로는....

  Hit : 10246     Date : 2011/08/18 01:20



    
릴라고 무슨말인지를 알아보질 못하겠네요...push ebp부분은 스택이 새로 시작될 때 쓰여 집니다. 그전 스택ebp로 돌아가기위해 push ebp를 통해 백업해두고 mov ebp,esp로 현재 스택의 끝부분에서부터 새로운 스택을 만들겠다는 것이구요... 2011/08/18  
늅늅 1
작성자분도 그 얘기를 하신거같은데요..
2011/08/18