私はアセンブリプログラミングが初めてで、より大きなプログラムの一部として、浮動小数点値を別の 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 桁程度) が返されます。