【问题标题】:Assembly: How does fld st(0) duplicates the top stack value in the following code?汇编: fld st(0) 如何复制以下代码中的顶部堆栈值?
【发布时间】:2015-08-01 04:54:57
【问题描述】:

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

【问题讨论】:

  • 这是整个代码吗?
  • 我确定不是。 :P

标签: assembly x86 x87


【解决方案1】:

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

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

我相信你是对的,fstp 确实在 fild 之后弹出。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2017-11-18
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2019-09-18
    相关资源
    最近更新 更多