2012-03-20 3 views
7

EAX는 32 비트 플랫폼에서 함수의 반환 값을 저장하는 데 사용됩니다. 함수의 반환 값 크기가 4 바이트보다 큰지 궁금합니다. 어떻게 eax에서 처리합니까? 이 경우 OS는 스택에 반환 값을 저장하고 EAX에 스택 주소를 저장할 수 있지만 EAX에 저장된 값이 반환 값에 대한 주소인지 아니면 실제로 반환 값 자체인지를 OS가 어떻게 알 수 있습니까?eax는 4 바이트보다 큰 반환 값을 저장할 수 있습니까?

+0

이 질문에 대한 답변보기 : http://stackoverflow.com/questions/2155730/how-do-c-compilers-implement-functions-that-return-large-structures –

답변

12

호출자와 수신자는 레지스터와 스택에 들어있는 내용에 동의해야합니다. 이것은 calling convention이라고하며, application binary interface (ABI)이라는 더 큰 개념의 일부입니다. 호출 수신자는 호출 할 방법 (예 : , 즉 인수가 스택에 있는지, 레지스터에 있어야하는지 등)을 정의하고 컴파일러는 생성하는 코드가 호출 규칙을 준수하는지 확인합니다.

구체적인 질문은 ABI에 따라 다릅니다. 때로는 반환 값이 4 바이트보다 크지 만 8 바이트보다 크면 EAX와 EDX로 나눌 수 있습니다. 하지만 대부분의 경우 호출 함수는 메모리를 할당하고 (보통 스택에)이 영역에 대한 포인터를 호출 된 함수에 전달합니다.

OS의 역할은 생각만큼 중요하지 않습니다. 서로 다른 호출 규칙을 가진 바이너리는 같은 시스템 상에 공존 할 수 있으며 바이너리는 내부적으로 다른 호출 규칙을 사용할 수도 있습니다. OS의 ABI는 바이너리가 시스템 라이브러리를 호출 할 때만 중요합니다.

관련 문제