2010-05-28 81 views
1

我想从内联汇编中调用pow函数。问题是我收到错误C2244:'pow':无法将函数定义匹配到现有声明。我是装配新手,所以这可能是一个微不足道的问题,但我该如何解决这个问题?我想这与编译器不能正确解决pow的超载有关。以下代码片段导致错误:C2244当试图从内联汇编调用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

我找到了解决方案。对于具有任何类似的问题:创建一个指向C++代码pow函数和内联汇编代码中使用此指针:因为库函数的实际名称装饰

double (*pow_func)(double, double) = pow; 
__asm 
{ 
    call pow_func 
} 
1

它没有找到符号pow某种程度上来说。每个平台都有一个关于如何装饰名称的标准,这可能会随着使用的调用约定而变化。许多(?大多数)平台使用单下划线前缀通常的装修,所以我会尝试:

call _pow 

或者,你可以写一个简单的程序是这样的:

#include <math.h> 

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

,并期待在生成的汇编代码,以查看您的平台上的装饰规范。

+0

这是我的第一个想法。问题在于VisualStudio在反汇编中只显示“call pow”。 – 2010-05-29 00:48:36

+0

@schrödingerscat:当你有VisualStudio为你生成汇编代码时,它会给你汇编代码*它无法汇编*?这似乎相当破碎;如果我是你,我会报告一个错误。 – 2010-05-29 01:42:26