2016-12-24 65 views
-2

如何繁殖在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 
+0

該代碼加載fin並將其乘以fin。這與fin^2(平方)相同。你的'fmul'應該把你希望乘以* fin *的值作爲它的操作數。但是代碼與這個問題不符,因爲'fin'是一個常數5.0,而你正在談論乘以3.02 x 0.008。 –

回答

0

如果你想使用的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 
+0

感謝您回覆它真的很有幫助 –