문제

스택 정리를 담당하는 사람이 누구인지 알고 싶습니다.

다음과 같이 fun 함수가 있다고 가정해 보겠습니다.

var = fun(int x, int y, float z, char x);

언제 fun 호출되면 매개변수와 함께 스택으로 이동한 다음 함수가 반환될 때 스택 정리를 담당하는 사람은 함수 자체이거나 반환 값을 보유할 "var"입니다.

한 가지 더, 호출 규칙의 개념을 설명할 수 있는 사람이 있나요?

도움이 되었습니까?

해결책

전화 컨벤션 스택 청소를하는 사람을 말합니다. 발신자 또는 Callee.

전화 규칙은 다음과 같이 다를 수 있습니다.

  • 매개 변수 및 반환 값이 배치되는 경우 (레지스터에서; 통화 스택에서; 둘 다 혼합)
  • 매개 변수가 전달되는 순서 (또는 단일 매개 변수의 일부)
  • 함수 호출을 설정하고 청소하는 작업이 발신자와 Callee로 나누는 방법.
  • Callee가 직접 사용할 수있는 레지스터도 때때로 포함될 수 있습니다.

아키텍처에는 거의 항상 가능한 통화 규칙이 있습니다.

다른 팁

답변을 직접 언급하셨습니다. 호출 규칙.

호출 규칙은 다음과 유사합니다. 계약.다음 사항을 결정합니다.

  • 매개변수 정리는 누가 담당합니까?
  • 매개변수가 호출된 함수에 전달되는 방법과 순서입니다.
  • 반환 값이 저장되는 위치입니다.

플랫폼과 프로그래밍 환경에 따라 다양한 호출 규칙이 있습니다.x86 플랫폼의 두 가지 일반적인 호출 규칙은 다음과 같습니다.

표준 호출

매개변수는 오른쪽에서 왼쪽으로 스택에 전달됩니다.그만큼 ~라고 불리는 함수는 스택을 정리합니다.

cdecl

매개변수는 오른쪽에서 왼쪽으로 스택에 전달됩니다.그만큼 부름 함수는 스택을 정리합니다.

두 경우 모두 반환 값은 EAX 등록 (또는 ST0 부동 소수점 값의 경우)

x86 플랫폼용 많은 프로그래밍 언어에서는 호출 규칙을 지정할 수 있습니다. 예를 들면 다음과 같습니다.

델파이

function MyFunc(x: Integer): Integer; stdcall;

마이크로소프트 C/C++

int __stdcall myFunc(int x)

일부 사용 참고 사항:

간단한 애플리케이션을 만들 때 호출 규칙을 변경하거나 알아야 할 필요는 거의 없지만 호출 규칙에 관심을 가져야 하는 두 가지 일반적인 경우가 있습니다.

  • 외부 라이브러리를 호출할 때 Win32 API는 다음과 같습니다.호환 가능한 호출 규칙을 사용해야 합니다. 그렇지 않으면 스택이 손상될 수 있습니다.
  • 인라인 어셈블러 코드를 생성하는 경우:어떤 레지스터와 스택의 어디에서 변수를 찾을 수 있는지 알아야 합니다.

자세한 내용을 보려면 다음 Wikipedia 문서를 추천합니다.

그 라인이 완료 될 때 Var는 fun ()에 의해 반환 된 값을 유지하고 Fun이 사용하는 스택의 메모리는 "푸시", "팝"모든 깔끔하게 사라집니다.

Call Concentions : 컴파일러가 조직하는 모든 것을 재미있게 수행 할 수 있도록 구성합니다. 해당 매개 변수 x, y, z를 고려하십시오. 그들은 스택에 어떤 순서를 밀어 넣습니까 (실제로 스택을 통해 지나가는가)? 발신자와 칼리가 동의하는 한 중요하지 않습니다! 컨벤션입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top