【发布时间】:2011-01-19 18:34:50
【问题描述】:
所以,我希望能够从 c++ dll 调用函数。 出于某些原因,我想从我的 C++ 代码中的 __asm 块中调用它们。 我的问题是:我知道在调用函数之前,我必须按照函数调用约定指定的顺序将其参数推送到堆栈上。但是,我可以简单地做这样的事情吗:
int a=5;
double b = 5.0;
__asm{
push b
push a
call functionAddress
}
让我担心的是,我似乎记得汇编中的标准字大小是 2 字节,而 C++ 中 int 的大小通常是 4 字节,而双精度则为 8 字节。所以,在上面的示例中,我真的是在推动每个变量的全部值,还是只是前几个字节?如果上面的代码不正确,那么正确的方法是什么?另外,如果我们调用的函数返回一个双精度值,这个值存储在哪里?我假设它不能在寄存器中,因为它只能存储 32 位(4 字节)。对于这个混乱的任何帮助将不胜感激:)
【问题讨论】:
-
你尝试的时候发生了什么?
-
我在使用双打时遇到了问题:我在 dll 中创建了一个测试函数,它接受一个双参数并在输入大于 5.0 时返回 1。问题是我尝试调用汇编中的函数几次,参数为 7.45454,返回值并不总是相同。
标签: x86 callstack argument-passing inline-assembly