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

问题描述 投票:0回答:1

在下面的代码中,我想知道

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]

assembly x86 x87
1个回答
3
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.