2010-05-28 2 views
1

인라인 어셈블리에서 pow 함수를 호출하고 싶습니다. 문제는 내가 C2244 오류가 발생했습니다 : '펑': 기존 선언에 함수 정의를 일치시킬 수 없습니다. 나는 이것이 사소한 질문일지도 모를 새로운 어셈블리이지만 어떻게 해결할 수 있습니까? 나는 그것이 pow의 과부하를 적절하게 해결할 수없는 컴파일러와 관련이 있다고 생각한다. 다음 코드 단편은 오류의 원인입니다.인라인 어셈블리에서 pow 함수를 호출 할 때 C2244

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++ 코드에서 펑 함수에 대한 포인터를 만들고 인라인 어셈블리 코드에서이 포인터를 사용 라이브러리 함수의 실제 이름이 장식되어 있기 때문에

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

그것은 기호 pow을 찾는 아니에요 어떤 식 으로든. 각 플랫폼에는 이름이 어떻게 장식되는지에 대한 표준이 있으며 이는 호출 규칙이 사용되는 방식에 따라 다를 수 있습니다. 많은 (? 대부분의) 플랫폼은 일반적인 장식으로 하나의 언더 접두사를 사용, 그래서 나는 시도 할 것이다 :

#include <math.h> 

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

을하고 보면 :

call _pow 

또한,이 같은 간단한 프로그램을 작성할 수 있습니다 플랫폼에 장식 규칙이 무엇인지 확인하기 위해 어셈블리 코드를 생성했습니다.

+0

이것은 내 첫 번째 아이디어였습니다. 문제는 VisualStudio가 디스 어셈블리에서 "call pow"을 보였다는 것입니다. –

+0

@ schrödingers cat : VisualStudio에서 어셈블리 코드를 생성하면 * 어셈블 할 수없는 어셈블리 코드가 생깁니다. 그것은 오히려 부서진 것처럼 보입니다. 내가 너라면 버그를 신고 할거야. –