2010-05-28 39 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