1

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

2 回答 2

1

它没有找到符号pow,因为库函数的实际名称以某种方式装饰。每个平台都有一个如何修饰名称的标准,这可能会因使用的调用约定而异。许多(大多数?)平台使用单个下划线前缀作为通常的装饰,所以我会尝试:

call _pow

或者,您可以编写一个像这样的简单程序:

#include <math.h>

double foo(double x) {
    return pow(1.5, x);
}

并查看生成的汇编代码以了解您的平台上的装饰约定。

于 2010-05-28T17:08:26.820 回答
0

我找到了解决方案。对于有类似问题的任何人:在 C++ 代码中创建指向 pow 函数的指针,并在内联汇编代码中使用此指针:

double (*pow_func)(double, double) = pow;
__asm 
{
  call pow_func
}
于 2010-05-28T01:17:34.510 回答