2012-03-25 31 views
1

我有一個巨大的問題,使用fdiv !!!!我試圖劃分1/3所以這是我做的師8086/8087 1/3 = 3?

.model small 
.stack 100h 
.data 

var1 dd 1 
var2 dd 3 
var3 dd 2 
resultado dt 0.0 

.code 

mov ax,@data 
mov ds,ax 
finit 
fild var1 
fild var2 
fdiv 
fstp resultado 
ffree 

.exit 

正如你可以看到我的結果轉移到resultado,因爲我看不到st(0)結果(我用TASM所以我只可以看調試器中的變量)結果應該是3EAAAA3A,但我得到40400000 ...這就是3 !!!這怎麼可能??我嘗試交換變量,沒有任何東西!你可以幫我嗎?? =(

+0

向我們展示實際代碼或彙編並鏈接實際代碼。顯示的代碼末尾有'END'缺失。如果'END'不在你的ASM文件中,TASM很可能無法從這個.ASM文件中生成一個新的.OBJ文件,所以你可能會鏈接,執行和調試一個你過去組裝過的程序。有'END'在裏面。此外,此代碼中的'FSTP'存儲10個字節,而不是4個。這可以通過與'END'相同的問題來解釋。 – 2012-03-25 09:37:35

回答

5

如果FPU與8087一樣大,則必須在fdiv之後加上fwait指令,否則在FPU仍在執行除法操作時,可能會從FPU讀取結果,並且您寫回的結果是不確定的。

這個「功能」已經在80287 FPU被刪除。

+0

當編譯上述代碼時,TASM會自動插入'FWAIT'。 – 2012-03-25 09:31:37

+0

謝謝!!!我現在有正確的結果! – 2012-03-25 20:32:16

+0

@AlvaroFallas:標記幫助作爲**答案的答案。 – 2012-03-25 22:25:52

1

所提出的代碼不表現出了上述問題。它計算0.3(3)FDIV(它實際上FDIVP ST(1), ST,所以它劃分ST( 1)= 1.0(ST(0)= 3.0),然後將其作爲10字節的序列(AB AA AA AA AA AA AA AA FD 3F)存儲到resultado