C2244尝试从内联汇编调用pow函数时

时间:2010-05-28 00:00:31

标签: assembly inline-assembly

我想从内联汇编中调用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 

2 个答案:

答案 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
}