我想从内联汇编中调用pow函数。问题是我收到错误C2244:'pow':无法将函数定义与现有声明匹配。我是新组装所以这可能是一个微不足道的问题,但我该如何解决这个问题呢?我想它与编译器无关,无法正确解决pow的过载问题。以下代码片段导致错误:
do_POW:
// push first argument to the stack
sub esp, size value_type
fld qword ptr [ecx]
fstp qword ptr [esp]
// push second argument to the stack
sub esp, size value_type
fld qword ptr [ecx - size value_type]
fstp qword ptr [esp]
// call the pow function
call pow
sub ecx, size value_type
fstp qword ptr [ecx]
add esp, 2 * size value_type
jmp loop_start
答案 0 :(得分:1)
找不到符号pow
,因为库函数的实际名称以某种方式进行修饰。每个平台都有一个标准,用于表示名称的装饰方式,这可能因使用的调用约定而异。许多(大多数?)平台使用单个下划线前缀作为通常的装饰,所以我会尝试:
call _pow
或者,您可以编写一个这样的简单程序:
#include <math.h>
double foo(double x) {
return pow(1.5, x);
}
查看生成的汇编代码,了解平台上的装饰约定。
答案 1 :(得分:0)
我找到了解决方案。对于任何有类似问题的人:在C ++代码中创建指向pow函数的指针,并在内联汇编代码中使用此指针:
double (*pow_func)(double, double) = pow;
__asm
{
call pow_func
}