在下面的代码中,我想知道
fld ST(0)
的作用。我听说它重复了堆栈中的顶部值,但我不知道它在以下代码中在哪里带来该值:
fild dword ptr [L1000F140]
fstp qword ptr [esp+20h]
fld ST(0)
fdiv qword ptr [L1000F148]
fmul qword ptr [L1000A520]
我的看法是,上面的代码以符号方式表示:
value[esp+20h]= value[L1000F140]
new stack top value=value[esp+20h]/value[L1000F148]*value[L1000A520]
我说得对吗?
我想知道为什么
fstp
不弹出加载的值,所以fld
会重复value[L1000F140]
?
Raymond Filiatreault 提供了一份很好的 x87 FPU 指南。 第 1 章 解释了 FPU 寄存器堆栈的工作原理。
是的,
fld st(0)
推送堆栈顶部的副本。 英特尔 insn 参考手册明确提到了 fld st(n)
的这种特殊情况使用
我相信你是对的,
fstp
确实在fild
之后弹出。
第一个
fild / fstp
对将全局int
(位于L1000F140)转换为x87堆栈上的浮点数。
然后
fld st(0)
复制 x87 堆栈的顶部(即 fild/fstp
之前的值)。
然后将该值除以另一个全局值,然后乘以另一个值。
最终的 x87 堆栈:
st(0)=orig / global1 * global2
st(1)=orig