2014-01-15 33 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)中显示的值只是垃圾,是编译器弹出顶部项目的方法的结果。所以要弹出堆栈,它只是旋转堆栈。

注意:其他编译器可能不需要这样工作,所以我们不应该期望每个代码都像这样执行。这是一个编译器的问题。