2012-03-25 13 views
1

私は大きな問題を抱えています。fdiv !!!!私は、これは、私はあなたが見ることができるように私はので、私はちょうどすることができますTASMを使用していst(0)で結果を(見ることができないので、私はresultadoに結果を移動区分8086/8087 1/3 = 3?

.model small 
.stack 100h 
.data 

var1 dd 1 
var2 dd 3 
var3 dd 2 
resultado dt 0.0 

.code 

mov ax,@data 
mov ds,ax 
finit 
fild var1 
fild var2 
fdiv 
fstp resultado 
ffree 

.exit 

何をすべきかです1/3を分割しようとしていますデバッガの変数を参照してください)結果は3EAAAA3Aになるはずですが、私は40400000を取得しています...それは3です!どのように可能ですか?私は変数と何も交換しようとした!手伝って頂けますか?? =(

+0

実際のコードを表示したり、実際のコードをアセンブルしてリンクしたりします。表示されたコードの最後に「END」がありません。 'END'がASMファイルにない場合、TASMはこの.ASMファイルから新しい.OBJファイルを生成することができないため、過去に組み立てたプログラムをリンクし、実行し、デバッグしている可能性がありますそれに「END」があった。また、このコードの 'FSTP'は、4バイトではなく10バイトを格納します。これは' END'と同じ問題で説明できます。 –

答えて

5

FPUが8087年以前の場合は、fdivの後にfwait命令を置く必要があります。そうしないと、FPUがまだ除算を実行している間にFPUから結果を読み取ることができます。未定義。

この「機能」は80287 FPUで削除されました。

+0

TASMは、上記のコードをコンパイルするときに 'FWAIT'を自動的に挿入します。 –

+0

ありがとうございました!私は今正しい結果を持っている! –

+0

@AlvaroFallas:** the ** answerとして役立つ答えを記入してください。 –

1

提示コードは述べた問題は発生しません。それは、0.3(3)FDIVで((それは実際にFDIVP ST(1), STなので、それはSTを分割算出し、 1)= 1.0(ST(0)= 3.0)を計算し、これを10バイト(AB AA AA AA AA AA AA AA AA AA AA AA AA FD 3F)のシーケンスとしてresultadoに格納する。