当我从内联汇编中调用它们时,如何将参数传递给C++函数

Emi*_*l D 8 x86 callstack inline-assembly argument-passing

所以,我希望能够从c ++ dll调用函数.出于某些原因,我想从我的C++代码中的__asm块中调用它们.我的问题是:我知道在调用函数之前,我必须按照函数调用约定指定的顺序在堆栈上推送它的参数.但是,我可以简单地做这样的事情:

int a=5;   
double b = 5.0;  
__asm{  
       push b 
       push a  
       call functionAddress  
}
Run Code Online (Sandbox Code Playgroud)

令我担心的是,我似乎记得汇编中的标准字大小是2字节,而C++中int的大小通常是4bytes,而double是8字节.所以,在上面的例子中,我真的推送每个变量的全部值,或只是前几个字节?如果上面的代码不正确,那么正确的方法是什么?另外,如果我们调用的函数返回一个double,那么这个值存储在哪里?我假设它不能在寄存器中,因为它只能存储32位(4字节).对这个混乱的任何帮助将非常感激:)

I. *_*edy 13

要推送8字节值(如双精度数),您将无法使用常规PUSH指令.并且您也不会将浮点参数(或双精度数)推送到浮点堆栈.您需要"手动"将这些胖参数放在堆栈中.例如,要将π作为参数推送到函数f:

  __asm {
    FLDPI                    // load pi onto FP stack
    SUB ESP,8                // make room for double on processor stack
    FSTP QWORD PTR [ESP]     // store pi in proc stack slot (and pop from FP stack)
    CALL f
    ADD ESP,8                // clean up stack (assuming f is _cdecl)
  }
Run Code Online (Sandbox Code Playgroud)