1

私はアセンブリプログラミングが初めてで、より大きなプログラムの一部として、浮動小数点値を別の C 関数に渡す必要があります。テスト プログラムからアセンブリ関数への呼び出しがあります。これは、パラメーターを正しいスタックにプッシュするだけで、2 番目の C 関数を呼び出します。

私のCテスト関数:

 extern void ext_func(char *result, double d); // C function
 extern double tester(char *str, float d);

 double a = tester(str, 3.14)
 printf("%s\n", str);       // Resulting in '0.000000'

 // doing some fancy stuff with the float value and puts in result
 ext_func(str, 3.14);       // gives str = "3.140000"

x86、gcc -m32:

     .globl tester
tester:
     pushl  %ebp        # Standard
     movl   %esp, %ebp  #
     flds   12(%ebp)    # Push second parameter on stack
     pushl  8(%ebp)
     call   ext_func
     addl   $4, %esp
     leave
     ret

ext_functダブルを期待しているときに32ビットしかプッシュしないことに問題があると思います。しかし、私は fldl、fld1、fildl、fldl 12 と 16(%ebp)、および「楽しみ」のために他のいくつかを試しました。

  • 私の最初の質問は、ext_func がフロート スタック (ST) にいくつかのデータを欠いているため、フロート値を作成できないのですか? (呼び出し先関数を持っていないことは理解していますが、関数が何をするかは問題ではありませんか?)
  • 第 2 に、コンパイラは常に f-stack にアクセスして、float 値が必要な場合に取得しますか? それとも、メモリスタックからそれらを読み取ることができますか?
  • 第三に、私がここで見逃しているものは他にありますか? もし私が
printf("%f", a);     //3.140000  
printf("%f", str);      //3.140000

しかし、他の方法でaは、000000 で終わる大きな負の数 (100 桁程度) が返されます。

4

1 に答える 1