我可以强制g ++在堆栈上传递浮点数参数吗?

时间:2013-09-17 02:34:37

标签: c++ assembly g++

为了实现类似C#的invoke方法,我需要将C ++代码与程序集结合起来。但是当我向它传递浮点数时,我遇到了麻烦,发现这些参数是通过一些浮点指令传递的。

那么有没有办法强迫g ++使用公共堆栈(esp)?感谢。

2 个答案:

答案 0 :(得分:2)

更改装配面以匹配。程序集不受调用约定的约束。

如果是第三方程序集,请在程序集中构建一个代理函数来移动参数,然后跳转到实际函数。

答案 1 :(得分:2)

从评论中,我认为您基本上是尝试使用std::functionstd::bind(来自C ++ 11)提供的类型安全功能来实现目标。

#include <functional>
#include <iostream>

using namespace std;

void foo(int x, double y, float z)
{
    cout << x << ", " << y << ", " << z << endl;
}

void call_agent(void* pointer)
{
    function<void()>* wrapper = reinterpret_cast<function<void()>*>(pointer);
    (*wrapper)();
    delete wrapper;
}

int main()
{
    function<void()>* callback = new function<void()>(bind(&foo, 1, 7.5, 8.4f));
    call_agent(callback);
}

只需将指向std::function<void()>对象的指针传递给awake函数(并在调用它们后将其delete传递给它们)。 void()作为模板参数意味着包装函数应该没有返回值并且不接受任何参数,你可以根据需要调整它(int()将是“int返回值而没有参数”,{{ 1}}将是“char返回值并接受短和浮动”等。)

std::bind(Function, args...)返回未指定类型的可调用对象。然后,传递给char(short, float)的参数将转发给该函数。 std::function包装任何类型的可调用对象,包括函数指针和bind调用的结果,因此您不必担心要调用的事物的类型。

更重要的是,如果向std::bind提供不正确的参数,则会遇到编译时错误,而不必通过反汇编来弄清楚出了什么问题。您还可以将复合类型传递给bind(结构,联合),甚至非POD类型。