C2244 при попытке вызвать функцию pow из встроенной сборки

Я хотел бы вызвать функцию 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 

person schrödingers cat    schedule 28.05.2010    source источник


Ответы (2)


Он не находит символ pow, потому что фактическое имя библиотечной функции каким-то образом оформлено. У каждой платформы есть стандарт оформления имен, который может различаться в зависимости от используемого соглашения о вызовах. Многие (большинство?) платформ используют один префикс подчеркивания в качестве обычного украшения, поэтому я бы попробовал:

call _pow

Кроме того, вы можете написать простую программу, подобную этой:

#include <math.h>

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

и посмотрите на сгенерированный ассемблерный код, чтобы увидеть, какое соглашение об оформлении используется на вашей платформе.

person Stephen Canon    schedule 28.05.2010
comment
Это была моя первая идея. Проблема в том, что VisualStudio просто показал call pow в дизассемблированном виде. - person schrödingers cat; 29.05.2010
comment
@schrödingers cat: Когда VisualStudio создает для вас ассемблерный код, он дает вам ассемблерный код, который не может собрать? Это кажется довольно сломанным; Я бы сообщил об ошибке на вашем месте. - person Stephen Canon; 29.05.2010

Я нашел решение. Для тех, у кого есть подобные проблемы: создайте указатель на функцию pow в коде C++ и используйте этот указатель во встроенном коде сборки:

double (*pow_func)(double, double) = pow;
__asm 
{
  call pow_func
}
person schrödingers cat    schedule 28.05.2010