我可以强制g++;要在堆栈上传递浮点数参数? 为了实现一个类似C的调用方法,我需要将C++代码与汇编相结合。但当我向它传递浮点数时遇到了麻烦,发现这些参数是通过一些浮点指令传递的

我可以强制g++;要在堆栈上传递浮点数参数? 为了实现一个类似C的调用方法,我需要将C++代码与汇编相结合。但当我向它传递浮点数时遇到了麻烦,发现这些参数是通过一些浮点指令传递的,c++,assembly,g++,C++,Assembly,G++,那么有没有办法强迫g++使用公共堆栈(esp)?谢谢。更改装配侧以匹配。程序集不受调用约定的约束 如果是第三方程序集,请在程序集中构建一个代理函数来移动参数,然后跳转到实际函数。将程序集端更改为匹配。程序集不受调用约定的约束 如果是第三方程序集,在程序集中构建一个代理函数来移动参数,然后跳转到实际函数。从注释中,我认为您基本上是在尝试使用std::function和std::bind(来自C++11)提供的类型安全功能来实现 #包括 #包括 使用名称空间std; 无效foo(整数x,双y,浮点z

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

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


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

将程序集端更改为匹配。程序集不受调用约定的约束


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

从注释中,我认为您基本上是在尝试使用
std::function
std::bind
(来自C++11)提供的类型安全功能来实现

#包括
#包括
使用名称空间std;
无效foo(整数x,双y,浮点z)
{

从评论中可以看出,我认为您基本上是在尝试使用
std::function
std::bind
(来自C++11)提供的类型安全功能来实现

#包括
#包括
使用名称空间std;
无效foo(整数x,双y,浮点z)
{


它们不是在堆栈上传递的,而是在寄存器上传递的吗?@PetrBudnik,这取决于您的ABI和调用约定。大多数x86 ABI在FPU堆栈上传递它们。大多数x86_64 ABI在SSE寄存器中传递它们。而且,这听起来像是一个错误。如果您可以提供更多上下文,可能会有一个更简单的解决方案。@zneak但如果我获取传递变量的地址?编译器必须将其溢出到堆栈上。@PetrBudnik,我不确定我是否理解您的评论。如果您确定了变量的地址,则该变量必须存在于可寻址内存中,但这与调用约定无关。当发出函数调用时,编译器不关心该变量是否存在于堆栈上:它需要在已知的方法,以便被调用函数可以检索它。它们不是在堆栈上传递的,而是在寄存器上传递的吗?@PetrBudnik,这取决于您的ABI和调用约定。大多数x86 ABI在FPU堆栈上传递它们。大多数x86_64 ABI在SSE寄存器中传递它们。此外,这有点像是一种错误。如果您可以提供更多上下文,可能会有一个更简单的解决方案。@z好的,但如果我记下传递的变量的地址,编译器必须将其溢出到堆栈上。@PetrBudnik,我不确定我是否理解你的评论。如果你确实得到了它的地址,变量必须存在于可寻址内存中,但这与调用约定无关。当发出函数调用时,编译器不关心变量是否存在或是否存在堆栈上的ot:它需要以已知的方式传递值,以便被调用的函数可以检索它。它包装数据并将其传递给汇编代码。有了这些信息,我恐怕无法区分浮点和常用参数之间的区别。顺便说一句,没有第三方代码。目前我使用的原型是:void Invoke(void*proc,int argnum,…)。它包装数据并将其传递给汇编代码。有了这些信息,我恐怕无法区分浮点和常用参数之间的区别。顺便说一句,没有第三方代码。这看起来很酷!但我如何使用它从另一个线程调用?你是说我需要这样调用:void Invoke(function*),然后将其发送到绘图线程并调用它?新建对象的目的是获取指向该对象的指针。您可以将该指针传递给另一个线程,将其强制转换为
函数*
,并对其使用调用运算符。我刚刚编辑了答案,以显示如何将其传递给接受
void*
参数的函数听起来不错!这似乎很好地解决了我的问题!现在我对std::bind和std::function的实现非常感兴趣。非常感谢!奇怪的是,调用约定的低级问题不是由汇编或编译器指令解决的,而是像只出现在最新版本中的函数对象这样的高级构造C++标准。@ C.R.,我明白你说的,但是我的答案并没有解决在栈上传递实数的问题:而是解决了在另一个线程上调用具有预先指定参数的任意函数的问题。我想回答这个问题的最重要的一件事就是教任何人问题,而不是ATT。清空的解决方案。:)这看起来很酷!但我如何使用它从另一个线程调用?你的意思是我需要这样调用:void Invoke(function*),然后将其发送到绘图线程并调用它?新建对象的目的是获取指向该对象的指针。您可以将该指针传递给另一个线程,将其强制转换为
函数*
,并对其使用调用运算符。我刚刚编辑了答案,以显示如何将其传递给接受
void*
参数的函数听起来不错!这似乎很好地解决了我的问题!现在我对std::bind和std::function的实现非常感兴趣。非常感谢!奇怪的是,调用约定的低级问题不是由汇编或编译器指令解决的,而是像只出现在最新版本中的函数对象这样的高级构造C++标准。@ C.R.,我明白你说的,但是我的答案并没有解决在栈上传递实数的问题:而是解决了在另一个线程上调用具有预先指定参数的任意函数的问题。我想回答这个问题的最重要的一件事就是教任何人问题,而不是ATT。清空的解决方案。:)
#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);
}