시작하기 전에...
사외교육을 갔다가 너무 내용이 좋아서 정리하면서 글을 올리게 되었다. 교육내용을 모두 올린건 은 아니고 일부분을 재구성해서  올렸다.
강석민 강사님께 감사 드립니다^^
cafe.naver.com/cppmaster

C언어의 함수 호출 원리

함수를 호출할 때 인자값과 리턴값이 있기 마련이다. C언어에서는 어떤방법으로 인자값와 리턴값을 처리할까?

결론부터 말하면 인자값은 스택에 넣어서 함수로 가고, 리턴값은 eax레지스터에 넣어 돌려 보내준다.

int add(int a, int b)

{

return 10;

}

void main()

{

add(1, 2);

}

add(1,2)의 함수를 호출 할 때 인자값은 스택에 넣는다고 했다. 스택이라는 자료구조의 특성상 인자값은 뒤에서부터 스택에 쌓이게 된다.

foo(1, 2);의 코드를 어셈으로 바꿔보면 다음과 같이 명확이 이 내용이 보이게 된다.

_asm{

push2

push1

calladd

addesp,8

}

참고로, C에 어셈코드를 삽입하기 위해서는 _asm{ .. 어셈...}이렇게 하면 된다.그리고 함수를 호출할때는 VC2005이상은 _add가 아니고 add라고 해야 한다.

그리고 마지막코드 add esp, 8은 스택의 정리를 함수를 호출 하는 쪽에서 정리 하는 모습이다. 이는 조금 뒤에 다뤄 보도록 하자.

 

다음으로 리턴을 하는 방법에 대해 코드를 보자.

foo안에서 return 10을 하고 있다. 이 코드를 어셈으로 고쳐 본다면...아래와 같다.

_asm{

moveax,10

ret

}

리턴될 값은 eax에 넣어야 한다.( 관례인지 인텔 아키텍쳐 때문에 그런건지는 알아봐야 겠다.) 그리고는 리턴해주고 있다.여기서는 크게 언급할 내용이 없는 듯하다..