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)