2015-01-08 4 views
1

cdecl 호출 규칙을 사용하는 함수를 작성 중이므로 함수를 호출하기 전에 레지스터의 상태가 유지되는지 확인해야합니다.cdecl 함수를 만들 때 레지스터의 상태를 유지하는 방법은 무엇입니까?

제 질문은 이것이 일반적으로 수행되는 방식입니다. 함수 시작시 스택에있는 레지스터를 밀어 넣은 다음 함수 끝에서 레지스터로 꺼내는 것입니까?

+0

예, 푸시/팝이 작동합니다. 물론 명시 적 로컬 변수에 저장할 수도 있습니다. ** ** 모든 레지스터를 저장하지 않아도된다는 것을 알고 있다고 가정합니다. – Jester

+0

예, 발신자가 아닌 일부는 수신자, 여기를 보시려면 https://en.wikipedia.org/wiki/X86_calling_conventions#cdecl을 방문하십시오. – zx485

답변

1

나는 cdecl 호출 규칙을 사용하는 함수를 작성하고 있으므로 함수를 호출하기 전에 레지스터의 상태가 유지되는지 확인해야합니다. 당신은 아마 알다시피

, 당신은 EAX, ECX와 EDX에 원하는 것을 자유롭게 이용할 수 있지만 내 질문이 일반적으로 수행하는 방법이다 pretty much everything else

저장해야합니다. 함수 시작시 스택에있는 레지스터를 밀어 넣은 다음 함수 끝에서 레지스터로 꺼내는 것입니까?

예, 일반적으로 완료되었습니다. 처음에는 모든 것을 푸시하고 돌아 오기 전에 POP하세요.

하지만 때로는 발신자 저장 레지스터를 대신 사용하는 것이 좋습니다. 함수에서 EDX를 절대로 사용하지 않고 내용을 다룰 수있는 방식으로 함수를 호출하지 않는다고 가정 해 보겠습니다. 그러나 당신은 당신의 기능에서 EDI를 사용하기를 원합니다. 스택에 EDI를 저장하거나 EDX에 저장할 수 있습니다. 대신 레지스터를 사용하여

push edi 
; Do something with EDI, e.g. string manipulation 
pop edi 

mov edx, edi 
; Do something with EDI without corrupting EDX, e.g. string manipulation 
mov edi, edx 

는 스택을 사용하는 것보다 약간 빠른, 그래서 예를 들어 당신이 루프에서이 기능을 사용하는 경우이 일부 눈에 보이는 성능 향상을 제공 할 수 있습니다.

이 아니므로 처음부터 모든 것을 저장하고 돌아 오기 전에 복원하십시오. 기능을 사용하기 바로 직전에 레지스터를 저장하고 기능 수행 도중에 바로 복원 할 수 있습니다.