从程序集中调用的C++方法返回对象数据
Returning Object Data from C++ Method Called in Assembly
我有一个用C++编写的方法,它返回一个对象。这种方法被称为via assembly(原因很冗长)。示例:
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++/汇编函数调用并没有起到很大的作用。感谢任何能提供帮助的人。
这取决于所使用的调用调用约定的类型。它还取决于编译器如何处理对象。在这种情况下,您的对象至少包含3个值,这使得所有值都不太可能放在一个寄存器中(您的代码假设返回值将在EAX中——如果您返回int,则会是这样)。
从程序集来看,您似乎使用的是x86 32位程序集。在这种情况下,调用约定表示应该在堆栈上传递参数,对于这种情况,我认为x86位的调用约定表明,您需要自己为返回值保留内存,并将对象应存储的地址作为参数传递。在Windows上,返回指针(存储对象的地址)是第二个参数,在Linux上是第一个参数。
由于未能执行此操作,DoStuff方法可能会覆盖返回地址,并导致程序在返回指令时崩溃。
相关文章:
- 从父类方法返回子类对象
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 让bool方法返回其他整数
- 不能将方法返回的值用于另一个方法
- 从私有成员变量的成员方法返回unique_ptr
- 我的模板类方法返回错误类型?
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 我无法使用C++指针指向类方法返回的 std::vector
- 对象引用中的字段以不同的方法返回不同的值
- 类方法返回指向具有模板的类成员的指针
- 如何将字符串从 C++/CLI 方法返回到调用它的非托管C++
- 从工厂方法返回的ComPtr的引用计数增加两次
- 如何使用 SFINAE 从 end() 方法返回 (const_) 迭代器
- Arduino trim() 和 replace() 方法返回从 'void' 到非标量类型'String'请求的转换
- 从类方法返回 "const char*" 作为 std::string&
- 如何使用 "get" 方法返回类的私有 std::unique_ptr 成员
- 可能从单个方法返回不同类型的对象
- qml 未知方法返回类型:ArchiveFile*,即使调用了 qmlRegisterUncreatableType
- 如何从方法返回静态常量 int std::array?
- 当从其他方法返回 vector 时,C++无法访问矢量元素