如何繁殖在MASM兩個浮點型變量,裝配用戶輸入的輸入爲3.02和0.008乘以它,然後打印如何乘兩個浮點型變量在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
如何繁殖在MASM兩個浮點型變量,裝配用戶輸入的輸入爲3.02和0.008乘以它,然後打印如何乘兩個浮點型變量在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
如果你想使用的FPU請記住,它使用了一堆只能從內存中加載或保存到內存的寄存器。
我假設你可以通過使用Intel manual 1或者如果你覺得懷舊,可以自己記錄關於FPU編程模型的文檔,請登錄reading this 387 manual from Intel dated 05/26/1987。
指令fstp dword [eax]
節省的st(0)
內容在地址由eax
表示。這種尋址模式是間接尋址模式,它始終用英特爾彙編語法中的方括號標記。
將此與中的st(0)
保存進行對比,應該看起來像fstp eax
(無括號)。
唉,後者不被支持,可能是因爲FPU支持64位和80位格式,這些格式在當時不適合任何寄存器。
推送數據。從存儲器進入FPU堆棧使用fld
來彈出寄存器到內存中,使用fstp
(或者如果您不想彈出堆棧,則使用fst
)。
要執行乘法運算,請使用fmul
,它有幾個變體,其中一個可以與內存操作數一起運行,並將結果直接存儲在st(0)
中。
如果您覺得偏執,您可以在程序開始時使用finit
,該指令將復位FPU的控制寄存器以將寄存器標記爲空。
操作系統應該已經以乾淨狀態啓動您的進程。
這裏一個簡單的例子:
.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
截至今天,你可以使用向量寄存器與標量指令。
您可以在之前鏈接的英特爾手冊中找到相關文檔。
.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
感謝您回覆它真的很有幫助 –
該代碼加載fin並將其乘以fin。這與fin^2(平方)相同。你的'fmul'應該把你希望乘以* fin *的值作爲它的操作數。但是代碼與這個問題不符,因爲'fin'是一個常數5.0,而你正在談論乘以3.02 x 0.008。 –