2010-05-28 1 views
1

Я хотел бы назвать функцию pow из встроенной сборки. Проблема в том, что я получаю ошибку C2244: «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++ и использовать этот указатель в коде рядных сборок:

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» при разборке. –

+0

@ schrödingers cat: Когда у вас есть VisualStudio, вы создаете для вас код сборки, он дает вам код сборки, который * он не может собрать *? Это кажется довольно сломанным; Если бы я был вами, я бы сообщил об ошибке. –

Смежные вопросы