컴파일러는 CPU 아키텍쳐에 따라 적절한 함수 호출 규약을 적용합니다.
대표적인 함수 호출 규약(x86)으로는 cdecl, stdcall, fastcall 등이 있습니다.
x86 아키텍쳐의 기본적인 함수 호출 규약인 cdecl은
함수의 인자를 오른쪽에서 부터 왼쪽으로 스택에 저장하고
caller가 스택을 정리합니다.
stdcall 호출 규약은 cdecl과 마찬가지로 함수의 인자를
오른쪽에서부터 왼쪽으로 스택에 저장하지만
사용한 스택을 callee가 정리합니다.
fastcall은 왼쪽에서부터 오른쪽으로 두 개의 인자를 각각 ECX, EDX
에 저장 한 이후 다시 오른쪽에서부터 왼쪽으로 함수의 인자를
스택에 저장합니다. 또한 stdcall과 마찬가지로 사용한 스택을
callee가 정리합니다.
SYSTEM V 호출 규약은 Linux, MacOs 등에서 사용하는 호출규약 입니다.
함수의 인자를 오른쪽에서 왼쪽으로 RDI, RSI, RDX, RCX, R8, R9 순서로
6개의 인자를 레지스터의 저장합니다. 함수의 인자가 이보다 더 많다면
스택에 저장합니다.
또한 SYSTEM V 호출규약은 Caller가 사용한 스택을 정리합니다.
그리고 함수의 반환 값을 RAX로 전달합니다.