2011-05-05 4 views
5

어셈블리 언어의 메서드에서 값을 반환하는 방법에 대해 약간 혼란 스럽습니다. 내가 아는 한, eax 레지스터는 반환 될 결과를 저장하는 데 사용됩니다. 예를 들어 eax (IA-32 어셈블리 언어)로 결과 반환

내 결과는 4라고 내가 사용

mov eax, 4 

지금 EAX 4를 가지고 있고이 방법을 반환합니다. 제가해야 할 일이 있습니까, 아니면 ret의 지시가 자동으로 결과를 돌려 줄 것입니까?

문제는 내가 ret을 사용할 때 발신자에게로 돌아가고 발신자가 결과를 저장 한 레지스터에 자유롭게 액세스 할 수 있기 때문에 레지스터 eax에 대해 특별한 것을 알지 못한다는 것입니다. ebx 또는 ecx을 대신 결과를 저장할 수 없었습니까?

답변

7

결과가 eax에 저장되는 이유는 관습입니다. 당신은 당신이 좋아하는 레지스터에 그것을 저장하기로 결정할 수 있습니다. 그러나 함수 호출자는 반환 값의 내용이 eax에 저장되어 있다고 가정합니다. 또한 ret을 호출 할 때 추가 작업을 할 필요가 없음을 의미합니다.

4

설명하는 내용은 최소한 Microsoft 컴파일러에서 사용하는 convention입니다. eax 자체에 대한 특별한 것은 없습니다. 어셈블리 언어 함수가 일반적인 호출 규칙 중 하나로 컴파일 된 C/C++ 코드에 의해 호출 된 경우 결과는 eax으로 전달 될 것으로 예상됩니다.

ret은 함수가 호출 된 지점으로 컨트롤을 반환하기 만합니다. 영향을받는 레지스터가 없습니다 (물론 ESP 및 명령어 포인터 제외).

+0

나는이 특별한 관례가 GCC 이상을 포함하여 좀더 널리 퍼져 있다고 생각했다. 이 규칙을 사용하지 않는 일반적인 컴파일러에 대해 알고 있습니까? –

+0

Nope. 그러나 관례에 따라 가능한 것은 무엇이든합니다. –

+1

@ Mr. Shickadance : 사용자 코드에서 호출 할 수는 없지만 일부 Delphi 컴파일러 도우미는 ZF를 사용하여 부울 결과를 반환합니다. –