基本 FPU 指令/堆栈概述?
我试图对 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) 中的值。
I'm trying to get a basic understanding of floating point operations on x86. I understand that we have a dedicated FPU with a stack, but I'm not finding much relevant information on how the stack behaves in terms of different instructions.
Basically, the addressing of the fpu registers confuses me. If I refer to st(#), am I talking about a specific register? Or is it an offset from the top of the stack?
I think most of my questions can be answered by this one example:
If I have an empty FPU stack, and run:
fld x
fld y
fmul st, st(1)
Will the result be:
ST(0) = y * x
ST(1) = x
or:
ST(0) = x * y
ST(1) = y
?
Note that the difference between these is the value in ST(1).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是从顶部的偏移量。负载将现有项目进一步推入堆栈,弹出操作使它们移回更靠近顶部的位置。以下是您的小程序的执行方式:
此参考 很好地解释了这一切出色地。
It's an offset from the top. The loads push the existing items further into the stack, the pops make them move back closer to the top. Here's how your little program would look execute:
This reference explains it all pretty well.
英特尔开发人员手册将是查找特定 FPU 指令如何工作(以及 FPU 自身如何工作)的最佳位置。在您的示例中,首先加载 x,将其放入 st(0),当您加载 y 时,st(0) 被下推到 st(1),y 被放入 st(0)。当您进行 fmul 时,st(0) 变为 y * x,st(1) 保持 x。它基本上是一个 FILO 堆栈(具有环绕和其他一些特殊功能)
The intel developer manuals would be the best place for finding how a specific fpu instruction works (and how the fpu its self works). In your example, x is loaded first, putting it at st(0), when you load y, st(0) is pushed down to st(1) and y is put into st(0). When you fmul, st(0) becomes y * x, st(1) stays x. Its basically a FILO stack(with wrap around and some other special features)