1

インラインアセンブリから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 
4

2 に答える 2

1

powライブラリ関数の実際の名前が何らかの方法で装飾されているため、シンボルが見つかりません。各プラットフォームには、名前の装飾方法に関する標準があります。これは、使用される呼び出し規約によって異なる場合があります。多くの(ほとんど?)プラットフォームは、通常の装飾として単一のアンダーバープレフィックスを使用するため、次のことを試してみます。

call _pow

または、次のような簡単なプログラムを作成することもできます。

#include <math.h>

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

生成されたアセンブリコードを見て、プラットフォームの装飾規則を確認します。

于 2010-05-28T17:08:26.820 に答える
0

私は解決策を見つけました。同様の問題を抱えている人のために:C ++コードでpow関数へのポインターを作成し、インラインアセンブリコードでこのポインターを使用します。

double (*pow_func)(double, double) = pow;
__asm 
{
  call pow_func
}
于 2010-05-28T01:17:34.510 に答える