汇编:fld st(0)如何复制以下代码中的顶部堆栈值?

时间:2015-08-01 04:54:58

标签: assembly x86 x87

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

1 个答案:

答案 0 :(得分:1)

Raymond Filiatreault有一个很好的guide to x87 FPUChapter 1解释了FPU寄存器堆栈的工作原理。

是的,fld st(0)推送堆栈顶部的副本。英特尔insn ref手册明确提到了fld st(n)

的这种特殊情况

我相信你是fstpfild之后弹出的。

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

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

  • 然后将该值除以另一个全局,并乘以另一个。
  • 最终筹码:
st(0)=orig / global1 * global2
st(1)=orig