【问题标题】:Basic FPU instructions/stack overview?基本的 FPU 指令/堆栈概述?
【发布时间】:2011-07-20 17:13:48
【问题描述】:

我试图对 x86 上的浮点运算有一个基本的了解。我知道我们有一个带有堆栈的专用 FPU,但我没有找到太多关于堆栈在不同指令方面的行为的相关信息。

基本上,fpu 寄存器的寻址让我感到困惑。如果我指的是 st(#),我是在谈论一个特定的寄存器吗?还是从栈顶偏移?

我认为这个例子可以回答我的大部分问题:

如果我有一个空的 FPU 堆栈,然后运行:

fld x
fld y
fmul st, st(1)

结果会是:

ST(0) = y * x
ST(1) = x

或:

ST(0) = x * y
ST(1) = y

?

请注意,它们之间的差异是 ST(1) 中的值。

【问题讨论】:

    标签: assembly x86 x87


    【解决方案1】:

    这是从顶部的偏移量。负载将现有项目进一步推入堆栈,弹出使它们移回到更靠近顶部的位置。以下是您的小程序的执行方式:

                       ST(0)      ST(1)
    <start>            ---         ---
    fld x               x          ---
    fld y               y           x
    fmul st(0), st(1)  y*x          x
    

    This reference 很好地解释了这一切。

    【讨论】:

    • 谢谢!该参考资料也很有帮助。
    【解决方案2】:

    英特尔开发人员手册是了解特定 fpu 指令如何工作(以及 fpu 自身如何工作)的最佳位置。在您的示例中,首先加载 x,将其放在 st(0),当您加载 y 时,st(0) 被下推到 st(1),y 被放入 st(0)。当你 fmul 时,st(0) 变为 y * x,st(1) 保持 x。它基本上是一个 FILO 堆栈(带有环绕和其他一些特殊功能)

    【讨论】:

    猜你喜欢
    • 2013-11-22
    • 1970-01-01
    • 2021-09-17
    • 2012-04-20
    • 2019-09-26
    • 2012-10-12
    • 2023-03-17
    • 1970-01-01
    • 2011-05-23
    相关资源
    最近更新 更多