gpt4 book ai didi

c++ - 从程序集中调用的 C++ 方法返回对象数据

转载 作者:太空宇宙 更新时间:2023-11-04 11:43:26 24 4
gpt4 key购买 nike

我有一个用 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++/汇编函数调用并没有多大帮助。感谢任何可以提供帮助的人。

最佳答案

要看调用的是什么类型Calling Convention那是用过的。它还取决于编译器如何处理对象。在这种情况下,您的对象至少包含 3 个值,这使得所有值都不太可能适合一个寄存器(您的代码假设返回值将在 EAX 中——如果您返回一个 int 就会是这样)。

从程序集来看,您似乎使用的是 x86 32 位程序集。在这种情况下,调用约定说你应该在堆栈上传递参数,对于这种情况,我认为 x86 位的调用约定说你需要自己为返回值保留内存,并将对象应该存储的地址作为参数传递。在 Windows 上,返回指针(存储对象的地址)是第二个参数,在 Linux 上是第一个参数。

由于您没有这样做,DoStuff 方法可能会覆盖返回地址,并导致程序在返回指令时崩溃。

关于c++ - 从程序集中调用的 C++ 方法返回对象数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20551472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com