x87 FPUのチュートリアルは、Stackoverflowの範囲を超えていますが、MASM forumsにお勧めします。もう1つの良い情報源はIntel Instruction Set Referenceです。特に、F
で始まるほとんどの関数は、x87浮動小数点ユニット(FPU)関連の命令です。
通常、浮動小数点値を整数に加算することはできません。彼らは2つの異なる表現です。あなたができることは、整数を浮動小数点値に変換してから浮動小数点計算を行うことです。特に、FI
で始まる命令は、整数メモリオペランドを浮動小数点に変換する浮動小数点演算です。
は猫を肌には多くの方法がありますが、あなたは上記にリンクされているFPUのチュートリアルを確認した場合、あなたは1つの単純な方法は、これを行うためにあることを実現することができる:
sub esp, 8 ; Allocate space on stack to store integer
mov dword [esp], 2 ; Move the 32-bit integer value onto stack temporarily
fild dword [esp] ; Load integer 2 from stack into top of FPU stack at st(0)
; Converting it to 2.0 in the process
mov dword [esp], __float32__(3.25)
; Move 3.25 onto stack temporarily
fadd dword [esp] ; Add 3.25 to st(0). Result in st(0). So st(0)=5.25
fstp qword [esp] ; Store 64-bit double to stack for printf and pop FPU stack.
むしろストア値にグローバル変数を使用するよりもメインメモリに一時的にx87 FPUをロード/操作するための一時的なステージング領域として確保したスタック領域を使用しました。
SSE2命令セット(32ビットモードのX86-64プロセッサを含む)をサポートするCPUを使用している場合は、他にもオプションがあります。 1つは、SIMD命令とレジスタを使用して32ビットおよび64ビットの浮動小数点演算を行うことです。
- cvtsi2sd:あなたのようないくつかの有用な指示を見つける命令セット・リファレンスを使用して倍精度FP値をスカラーするダブルワード整数に変換
- cvtss2sd:スカラ倍精度FP値
にスカラ単精度FP値を変換
- addsd:スカラ倍精度浮動小数点が
- movsd値追加:スカラ倍精度浮動小数点を移動バリュー
スカラー単精度FP値は32ビットのfloat型です。スカラ倍精度は64ビットの倍精度です。
sub esp, 8
mov dword [esp], 2 ; Load integer 2 (32-bit signed value) onto stack temporarily
cvtsi2sd xmm0, [esp] ; Convert 2 on stack to 64-bit float and store in XMM0
mov dword [esp], __float32__(3.25)
; Load 32-bit float value of 3.25 onto stack
cvtss2sd xmm1, [esp] ; Load 32-bit single and convert it to 64-bit double. Store in XMM1
addsd xmm0, xmm1 ; Add 64-bit float in XMM0 and XMM1 store XMM0
movsd qword [esp], xmm0 ; Move 64-bit float back onto stack to be printed by printf
ここに何かを保存する前にnum1から0を読み込んだ後、スタックにその0を配置します。あなたは浮動小数点ロードとストアbtwでそれを行う必要はありません。 – harold
@harold質問を編集しました、ありがとう、別のエラーがあります。 –
OKこれで定数に追加しようとしています – harold