私はANSI CコードをASM(正確にはTASM)モジュールと組み合わせようとしています。
私は古典的な仕事を選ぶことに決めました - 配列の数値の平均を得て、それはほとんど働いており、コンパイルとリンクは成功しましたが、最後には平均が-0に等しいと言います。フロートの平均[]配列(インテル8086)
どうしたのですか?
#include <stdio.h>
extern float avg(int, float*);
int main()
{
int n = 2;
float tab[] = {2.0, 3.0};
printf("%.3g\n", avg(n, tab));
return 0;
}
そして.ASM手順:ここに私の.Cコードの必要な部分だ
avg PROC
finit
push BP
mov BP, SP
push bx
mov cx, [bp+4] ; no of elements
mov bx, [bp+8] ; address
fldz ; zero
jcxz avg_end ; if cx==0, end
iter:
fadd DWORD PTR [bx]
add bx, 4
loop iter
fidiv DWORD PTR [bp+4] ; sum/n
avg_end:
pop bx
pop BP
ret
avg ENDP
私のプログラムは、1以上のextern関数の内部でもあり、それがうまく動作します。
唯一の問題は、avg PROC
コード内になければなりません。私はあなたのアイデアを感謝します!
なぜbxに8が追加されましたか?あなたの環境の 'float'が8バイトだと確信していますか? – MikeCAT
実際には16ビットのDOSプログラムを書いていますか?もしそうなら、なぜですか? – zwol
16ビット環境で引数間にオフセット4を使用すると、奇妙に見えます。あなたのABIに沿っていると確信していますか? – MikeCAT