2016-12-24 15 views
-2

に2つのfloatの変数を乗算し、組立ユーザーは3.02として入力に入り、0.008でそれを乗算して、あなたがFPUを使用する場合は方法MASMに2つのfloatの変数を乗算する方法MASM

.data 
fin dd 5.0 

.code 
main proc 

fld fin 
fmul fin ;to multiply fin with fin 
fstp dword [eax] ;cannot mov result in eax 
call writefloat 

exit 
main EndP 
end main 
+0

このコードは 'fin'を読み込み、' fin'で乗算します。これはfin^2(二乗)と同じです。あなたの 'fmul'は' fin * * 'を乗算したい値をオペランドとして取るべきです。しかし、コードは質問と一致しません。なぜなら、 'fin'は定数5.0なので、あなたは3.02 x 0.008を乗算することを話しています。 –

答えて

0

それを印刷メモリからロードするか、またはメモリにのみ保存できる積み重ねられたレジスタセットを使用したことに注意してください。
Intel manual 1を使用するか、ノスタルジックな感じがある場合はreading this 387 manual from Intel dated 05/26/1987のいずれかを使用して、FPUプログラミングモデルについてドキュメント化することができます。

命令fstp dword [eax]アドレスがeaxでを示さst(0)の内容を保存します。この種のアドレッシングモードは、間接アドレッシングモードであり、インテルアセンブリ構文で角括弧を使用して一貫してマークされています。
st(0)eaxに保存すると、これはfstp eax(角括弧は不要)のようになります。
後者はサポートされていない可能性があります。これは、FPUが、当時、レジスタに適合できなかった64ビットと80ビットのフォーマットをサポートしているからです。


データをプッシュする。メモリからFPUスタックへfldを使用し、レジスタをメモリにポップアップさせ、fstp(またはスタックをポップしたくない場合はfst)を使用します。
乗算にはfmulを使用しますが、いくつかの変形があります。その1つはメモリオペランドで演算し、その結果を直接st(0)に格納することができます。

このプログラムは、プログラムの開始時にfinitを使用することができます。この命令は、FPUの制御レジスタをリセットしてレジスタを空にするように設定します。
OSはすでにクリーンな状態でプロセスを開始する必要があります。ここでは簡単な例

:今日のよう

.DATA 

    A dd 5.0 
    B dq 0.008 

    C dd 0   ;Move into a BSS section if the assembler support it 

.CODE 

    finit    ;For paranoid only 

    fld DWORD [A]  ;ST(0) = A 
    fmul QWORD [B]  ;ST(0) = ST(0)*B = A*B 
    fstp DWORD [C]  ;C = ST(0) = A*B 

    mov eax, DWORD [C] ;EAX = C = A*B 
    call writefloat 

あなたはスカラ命令とベクトルレジスタを使用することができます。
関連ドキュメントは、以前にリンクされたIntelのマニュアルに記載されています。

.DATA 

    A dd 5.0   ;Use float 
    B dd 0.008  ;Use float again, avoid cvtss2sd 

    C dd 0   ;Move into a BSS section if the assembler support it 

.CODE 

movss xmm0, DWORD PTR [A] ;xmm0.f[0] = A 
mulss xmm0, DWORD PTR [B] ;xmm0.f[0] = A * B 
movd eax, xmm0    ;eax = xmm0.f[0] = A * B 
           ;Beware, 1 extra cycle for bypass delay 
call writefloat 
+0

返事をいただきありがとうございました –

関連する問題