[링크 : http://engdic.daum.net/dicen/contents.do?query1=E255050] |
아무튼 문득 Iczelion 의 강좌를 읽다보니 어셈블리 기본 구조에
STDCALL 이라는 용어가 나오고, calling convention 이 나오길래 자세히 읽어 봤더니
'함수를 호출시에 인자를 넘겨주는 데이터를 stack에 넣는 방법'을 의미한다.
.MODEL FLAT,
STDCALL
push [third_param] ; Push the third parameterPASCAL calling convention is the reverse of C calling convention. It passes parameters from left to right and the callee is responsible for the stack balancing after the call. Win16 adopts PASCAL convention because it produces smaller codes. C convention is useful when you don't know how many parameters will be passed to the function as in the case of wsprintf(). In the case of wsprintf(), the function has no way to determine beforehand how many parameters will be pushed on the stack, so it cannot do the stack balancing. STDCALL is the hybrid of C and PASCAL convention. It passes parameter from right to left but the callee is responsible for stack balancing after the call.Win32 platform use STDCALL exclusively. Except in one case: wsprintf(). You must use C calling convention with wsprintf(). [링크 : http://win32assembly.online.fr/tut1.html] |
예를 들어, C언어의 경우에는 STDCALL을 사용하며,
인자(argument)들은 오른쪽 부터 stack에 push() 된다.
즉,
push(arg4);
push(arg3);
push(arg2);
push(arg1);
이런식으로 함수 호출시 인자를 넘겨주게 된다.
음.. 개인적인 생각이지만, C언어의 경우 heap은 아래에서 위로 커나가는데 그 방향을 맞추려고
stack에도 데이터를 이렇게 반대 순서로 넣는게 아닐까 싶다.
물론 argument 순서가 의미는 없기 때문에(받아들이는 쪽에서 알아서 받는다면)
가장 위에 첫 인자가 있을 이유는 없는데, 굳이 이런식으로 방향성을 가진다는건...
메모리 구조에 기인한게 아닐려나?
(아니면 말구 -ㅁ-!)
'Programming > 언어론' 카테고리의 다른 글
dangling if-else (0) | 2014.08.13 |
---|---|
double의 정확도 자릿수 (0) | 2011.03.25 |
함수 포인터 (function pointer) (0) | 2010.09.16 |
type system (0) | 2010.09.15 |