2014-01-15 34 views
0

的我有一個問題:假設我的浮點單元的堆棧如下:使用FSTP命令

ST0 = +1.5000000000000000e+0001 ST1 = +5.0000000000000000e+0000 
ST2 = +2.5000000000000000e+0001 ST3 = +0.0000000000000000e+0000 
ST4 = +0.0000000000000000e+0000 ST5 = +0.0000000000000000e+0000 
ST6 = +0.0000000000000000e+0000 ST7 = +0.0000000000000000e+0000 

做這個指令後:

fstp st(1) 

我的預測認爲,單元會將st(0)發送到st(1)(堆棧上的情況將爲1.5;1.5;2.5;0 etc),然後彈出堆棧的頂部,以便識別爲1.5;2.5;0 etc.

而是,我看到以下內容:

ST0 = +1.5000000000000000e+0001 ST1 = +2.5000000000000000e+0001 
ST2 = +0.0000000000000000e+0000 ST3 = +0.0000000000000000e+0000 
ST4 = +0.0000000000000000e+0000 ST5 = +0.0000000000000000e+0000 
ST6 = +0.0000000000000000e+0000 ST7 = +1.5000000000000000e+0001 

我的問題是,爲什麼st(7)改變,我如何能實現我的預期效果。謝謝你的幫助!

回答

0

ST7已經更改,因爲它是旋轉堆棧後st0的先前內容。您的調試器應該以某種方式表明該值不可用。

+0

是的,但如何消除這個問題? – Simon

+0

究竟是什麼問題? –

-1

好的我現在得到了答案。在最後一個寄存器中顯示非零值的問題是由FPU堆棧構建的結果。 st(7)中顯示的值只是垃圾,是編譯器彈出頂部項目的方法的結果。所以要彈出堆棧,它只是旋轉堆棧。

注意:其他編譯器可能不需要這樣工作,所以我們不應該期望每個代碼都像這樣執行。這是一個編譯器的問題。