我假設這是一項家庭作業,需要您使用x87 FPU指令。或者,您可以使用SSE/SSE2 SIMD指令來執行添加。在Win32
Ç調用(cdecl)公約要求單精度和雙精度浮在ST(0)要返回(在FPU堆棧頂部寄存器)。由於faddp增加了兩個數字並將結果放在ST(0)表示我們不需要任何臨時變量來存儲結果。然後,這些線可以刪除:
.data
res dq 0
和
fstp res ; pop sum from the stack and store it in res
當創建您應該指定的參數的大小的程序被通過,使MASM確切地知道操作數是什麼規模進行操作。爲確保您使用雙精度值,請將參數double標記爲REAL8(8字節REALS)。您還應該將PROC標記爲使用C調用約定與PROC C
,以便正確設置和解決堆棧和參數。過程聲明應該是這樣的:
procSuma proc C num1:REAL8,num2:REAL8
生成的代碼可能看起來像:
.model flat, c
.code
procSuma proc C num1:REAL8,num2:REAL8
fld num1 ; load num1 and push it onto the fpu stack
fld num2 ; load num2 and push it onto the fpu stack
faddp ; pop two numbers, add them, push sum on the stack.
; result in st(0) (top of FPU stack)
; We return double values in st(0) so nothing to do
; since faddp put our result in st(0)
ret
procSuma endp
end
您可以通過使用FADD而不是FADDP降低除了一對夫婦的說明:
fld num1 ; load num1 and push it onto the fpu stack
fadd num2 ; Add ST(0)(num1) to num2 and store result in ST(0).
; We return double values in st(0) so nothing to do
; since fadd put our result in st(0)
「沒有工作」是指什麼?沒有編譯,沒有產生正確的結果,還有別的? –
它沒有產生正確的結果。 –
請清楚說明您的問題實際得到的預期輸出和輸出 – LBes