0

在下面的代码中,我想知道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]了它?

4

1 回答 1

1

Raymond Filiatreault有一个很好的 x87 FPU 指南第 1 章解释了 FPU 寄存器堆栈的工作原理。

是的,fld st(0)推送堆栈顶部的副本。英特尔 insn 参考手册明确提到了这种特殊情况的使用fld st(n)

我相信你是对的,fstpfild.

  • 第一fild / fstp对将全局int(在 L1000F140)转换为堆栈上的浮点数。

  • 然后fld st(0)复制堆栈的顶部(即在 之前的值fild/fstp)。

  • 然后将该值除以另一个全局值,然后乘以另一个值。
  • 最终堆栈:
st(0)=orig / global1 * global2
st(1)=orig
于 2015-08-01T05:30:18.237 回答