다른 접선 토론을 해결하기 위해 다른 답변 하나를 추가하겠습니다.
C ABI (응용 프로그램 이진 인터페이스)는 원래 스택에서 인수를 역순으로 (즉, 오른쪽에서 왼쪽으로 푸시) 전달해야했으며 호출자도 스택 저장소를 비 웁니다. 현대 ABI는 실제로 인수를 전달하기 위해 레지스터를 사용하지만 많은 고민 고려 사항은 원래 스택 인수 전달로 되돌아갑니다.
대조적으로, 원래 파스칼 ABI는 논쟁을 왼쪽에서 오른쪽으로 밀었 고, 수신자는 논쟁을 터뜨려 야했다. 원래 C ABI는 두 가지 중요한 점에서 원래 Pascal ABI보다 우수합니다. 인수 푸시 순서는 첫 번째 인수의 스택 오프셋이 항상 알려져 있으므로 알 수없는 인수 수를 갖는 함수를 허용합니다. 여기서 초기 인수는 다른 인수 수 (ala printf
)를 제어합니다 .
C ABI가 우월한 두 번째 방법은 발신자와 수신자가 몇 개의 인수에 동의하지 않는 경우의 동작입니다. C의 경우 실제로 마지막 인수를 지난 인수에 액세스하지 않는 한 나쁜 일이 없습니다. Pascal에서 스택에서 잘못된 수의 인수가 표시되고 전체 스택이 손상되었습니다.
원래 Windows 3.1 ABI는 Pascal을 기반으로했습니다. 따라서 Pascal ABI (왼쪽에서 오른쪽 순서의 인수, 수신자 수신자)가 사용되었습니다. 인수 번호가 일치하지 않으면 스택이 손상 될 수 있으므로 맹 글링 구성표가 형성되었습니다. 각 함수 이름은 인수의 크기를 바이트 단위로 나타내는 숫자로 엉망입니다. 따라서 16 비트 시스템에서 다음 함수 (C 구문)는 다음과 같습니다.
int function(int a)
너비가 2 바이트 function@2
이므로으로 맹 글링되었습니다 int
. 선언과 정의가 일치하지 않으면 링커가 런타임에 스택을 손상시키지 않고 함수를 찾지 못합니다. 반대로, 프로그램이 연결되면 호출이 끝날 때 스택에서 올바른 바이트 수가 팝되는지 확인할 수 있습니다.
32 비트 Windows 이상에서는 stdcall
ABI를 대신 사용하십시오 . 푸시 순서는 C에서와 마찬가지로 오른쪽에서 왼쪽으로 파스칼 ABI와 유사합니다. Pascal ABI와 마찬가지로 이름 맹 글링은 스택 손상을 피하기 위해 인수 바이트 크기를 함수 이름으로 엉망으로 만듭니다.
여기 다른 곳에서 만든 클레임과 달리 C ABI는 Visual Studio에서도 함수 이름을 엉망으로 만들지 않습니다. 반대로 stdcall
ABI 사양으로 장식 된 맹 글링 기능 은 VS 고유하지 않습니다. GCC는 Linux를 컴파일 할 때도이 ABI를 지원합니다. 이것은 Wine 에 의해 광범위하게 사용되며 , 자체 컴파일 된 로더를 사용하여 Linux 컴파일 된 바이너리를 Windows 컴파일 된 DLL에 런타임 링크 할 수 있습니다.