함수가 어떤 방법으로 실행이 되는지 확인해봅니다
일단 코드
void func() { }
int main()
{
func();
return 0;
}
디스어셈 하면....
08048344 <func>:
void func()
{ }
8048344: 55 push %ebp
8048345: 89 e5 mov %esp,%ebp
8048347: 5d pop %ebp
8048348: c3 ret
08048349 <main>:
int main()
{
8048349: 8d 4c 24 04 lea 0x4(%esp),%ecx
804834d: 83 e4 f0 and $0xfffffff0,%esp
8048350: ff 71 fc pushl -0x4(%ecx)
8048353: 55 push %ebp
8048354: 89 e5 mov %esp,%ebp
8048356: 51 push %ecx
func();
8048357: e8 e8 ff ff ff call 8048344 <func>
return 0;
804835c: b8 00 00 00 00 mov $0x0,%eax
}
call 부터 보겠습니다.
함수라고 해서 특별히 해주는 건 없습니다
단순히 함수에 있는 코드로 점프합니다.
우리가 보통 시작지점을 main에서 보면
main도 하나의 함수라고 볼수 있습니다
func함수가 끝나면 main으로 다시 돌아와야 합니다
그럴려면 점프하기 전에 func함수 다음의 코드주소를 스택에 저장합니다
바로 -> 804835c: b8 00 00 00 00 mov $0x0,%eax
스택에 804835c를 저장합니다 그래야 func가 끝나면 여기로 다시 점프를 하면 되죠
call 부르기 전
(gdb) x $esp
0xbf8274f4: 0xbf827510
call을 부른후
(gdb) x $esp
0xbf8274f0: 0x0804835c
스택에 들어간게 보이죠
func에서 하는 일은 없습니다
밑에 코드는 main에서 시작하는 코드와 유사합니다
바로 스택을 초기화하는 건데
이건 함수에서 변수를 추가해서 보는게 더 좋겠네요
8048344: 55 push %ebp
8048345: 89 e5 mov %esp,%ebp
8048347: 5d pop %ebp
8048348: c3 ret
바로 다음장에서 인자를 넘겨 테스트 해보겠습니다.