2017-11-02 12 views
0

私は算術演算を実行するMASM32プロジェクトに取り組んでいます。浮動小数点ユニットを使用するには、コプロセッサ(8087命令セット)を使用する必要があります。だから、私の浮動小数点の制限は、100.0であり、すべての数は制限よりも小さくなければならない。私は2つの数値を合計し、結果を比較しようとしていますが、うまくいきません。float sumを比較する

.386 
.model flat, stdcall 
option casemap :none 
include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
include \masm32\include\user32.inc 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\user32.lib 
include c:\masm32\include\masm32rt.inc 
.data 
    ;Variables de comparación. 
    FP_max DD 100 
    ;Variables volcadas de la tabla de símbolos. 
    _a DD 25 
    _b DD 80.0 
.code 
    start: 
     fild _a 
     fild _b 
     fadd 
     fcom FP_max  ;compare ST(0) with the value of the real8_var variable 
     fstsw ax   ;copy the Status Word containing the result to AX 
     sahf    ;transfer the condition codes to the CPU's flag register 
     ja overflow  ;when all flags are 0 

     jmp end_program 

     overflow: 
      print "ERROR: overflow.", 13, 10, 0 
      jmp end_program 
     end_program: 
      invoke ExitProcess, 0 
    end start 

質問:私は間違っていますか?どのようにそれを修正することができますか?ありがとう!

+0

あなたは 'fstsw ax' /' sahf'を使ったかのように 'fcomi'を使ってフラグを直接設定できます。 (私は考えているppro、つまり過去20年間のx86が必要です) –

答えて

1

fildは整数→FPロードです。 fldは浮動荷重です。 (あなたのアセンブラは、ラベルの後ろの最初のディレクティブを見て、32ビットのロードを欲しいと魔法のように推論しますが、同じ命令は64ビットの整数またはFPをロードできます)。

ddは、式に小数点があるかどうかに基づいて計算されます。 (MASMはおそらくfild _bを使用


)(。Float data example using MasmをREAL4ようなFPの解釈を強制する他の方法を持っていますが、_b、32ビット2進浮動小数点値を保持する32ビットのように、そのビットパターンを治療します整数は

。あなたがする何を意味するのか、おそらく使用_b DD 80の代わり_b DD 80.0ない、またはfild _bの代わりにfld _bを使用しています。

あなたが理由LOA、FP_max DD 100と逆の問題を抱えていますメモリからfcomとしてください。それをREAL4にします。

(またはficomを使用しますが、整数と比較して、直接フラグを設定するためのficomi指示がないことに注意してください。あなたが使用する必要がありますfcomiは(あります)浮動小数点数を比較し、fcomp + fildようですが、必要とすることなく、あるficomがあります余分なFPレジスタ。fiaddと同じ考え方)。

x87スタックをポップするには、おそらくfaddpfcomipを使用する必要があります。そのため、不平衡のままにしないでください。

タグwikiのx87リンクの一部を参照してください。

+0

しかし、その場合、1,32のような番号を定義するにはどうすればよいですか? –

+0

@TomiSebastiánJuárez。ああ、通常の 'fld'の代わりに' fild'を使っていたので整数を使いたいと思っていました。あなたは、あなたが質問したいことを正確に言ったはずです。私の答えを更新しました。 –