基本FPU指令/堆栈概述?

Pro*_*Sim 3 x86 assembly x87

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

基本上,fpu寄存器的寻址让我很困惑.如果我参考st(#),我是在谈论一个特定的寄存器吗?或者它是从堆栈顶部偏移?

我想我的大多数问题都可以通过这个例子来回答:

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

fld x
fld y
fmul st, st(1)
Run Code Online (Sandbox Code Playgroud)

结果会是:

ST(0) = y * x
ST(1) = x
Run Code Online (Sandbox Code Playgroud)

要么:

ST(0) = x * y
ST(1) = y
Run Code Online (Sandbox Code Playgroud)

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

Igo*_*sky 5

这是从顶部偏移.负载将现有物品进一步推入堆叠,弹出物使它们向后移动靠近顶部.这是你的小程序看起来如何执行:

                   ST(0)      ST(1)
<start>            ---         ---
fld x               x          ---
fld y               y           x
fmul st(0), st(1)  y*x          x
Run Code Online (Sandbox Code Playgroud)

这个参考文章解释得非常好.