개체를 반환하는 C++로 작성된 메서드가 있습니다. 이 메소드는 어셈블리를 통해 호출됩니다 (매우 긴 이유가 있음). 예 :C++에서 개체 데이터 반환 어셈블리에서 호출 된 메서드
Person DoStuff(int a)
{
Person output;
output.Name = "Koder";
output.Age = 1337;
output.Cash = 80.86;
cout << "Given number is " << a << endl;
return output;
}
가치에 의한 반품은 불쾌하고 좋지 만,이 문제는 관련이 없습니다. 이 메서드를 호출하면 다음과 같이 표시됩니다.
Variant vMethod = &DoStuff;
void* pMethod = vMethod.As<void*>();
int paramVal = 78;
int* retVal = nullptr;
__asm
{
push paramVal
call pMethod
mov retVal, EAX
}
이 메서드의 반환 값이 int 일 때이 메서드는 완벽하게 작동합니다. 그러나 이제 객체를 반환하면 실제 call
명령어는 예외를 발생시킵니다. 추측 할 수 있듯이 예외는 return
성명서에 있습니다. 나는 이것이 이런 방식으로 썼을 때 일어날 것이라는 것을 알았지 만, 원시가 아닌 (또는 정수가 아닌) 반환 값을 검색하는 방법에 대한 단서가 없습니다. 인터넷 검색/어셈블리 함수 호출은 전체적으로 도움이되지 못했습니다. 도움을 줄 수있는 사람에게 감사드립니다.
나는 그것에 대한 단서가 없다. 가장 좋은 추측은 : C++을 사용하여 함수를 호출하고 실행 파일을 생성하는 대신 어셈블리 코드 (gcc -S)를 생성하고 반환 값이 처리됩니다. –
코드를 분해하면 도움이되었습니다. 메서드 호출 및 반환 값 반환 스택을 초기화하는 방법을 볼 수있었습니다. 감사! –