호그와트

x86 함수 호출 규약에 대해서 알아봅시다

영웅*^%&$ 2023. 7. 26. 16:05
728x90

x86 함수 호출 규약:

stdcall: 인자들을 스택에 푸시하며, 호출된 함수(callee)가 스택 정리를 담당합니다. 이 규약은 Windows API 함수에서 주로 사용됩니다.

cdecl: 인자들을 스택에 푸시하며, 호출하는 함수(caller)가 스택 정리를 담당합니다. 이 규약은 일반적인 함수에서 주로 사용됩니다.

fastcall: 첫 두 개의 인자를 ECX와 EDX 레지스터에 저장하고, 나머지 인자들은 스택에 푸시합니다. 호출된 함수(callee)가 스택 정리를 담당합니다. 이 규약은 최적화가 필요한 함수에서 사용됩니다.

thiscall: 인스턴스 포인터를 ECX에 저장하고, 나머지 인자들은 스택에 푸시합니다. 호출된 함수(callee)가 스택 정리를 담당합니다. 이 규약은 클래스의 멤버 함수에서 사용됩니다.

x86-64 함수 호출 규약:

MS ABI: 첫 네 개의 인자를 RCX, RDX, R8, R9 레지스터에 저장합니다. 호출하는 함수(caller)가 스택 정리를 담당합니다. 이 규약은 일반적인 함수와 Windows syscall에서 사용됩니다.

System V ABI: 첫 여섯 개의 인자를 RDI, RSI, RDX, RCX, R8, R9 레지스터에 저장하고, 나머지 인자들은 스택에 푸시합니다. 호출하는 함수(caller)가 스택 정리를 담당합니다. 이 규약은 일반적인 함수에서 사용됩니다.

728x90