C2244 при попытке вызвать функцию pow из встроенной сборки - PullRequest
1 голос
/ 28 мая 2010

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

Ответы [ 2 ]

1 голос
/ 28 мая 2010

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

call _pow

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

#include <math.h>

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

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

0 голосов
/ 28 мая 2010

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

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