x87 FPOP 和 FCOM 指令 - 它们如何工作?

发布于 2024-12-01 05:19:53 字数 829 浏览 2 评论 0原文

我的任务是用混合 C/ASM 编写一个必须使用数学协处理器的简单应用程序。

如果给定点位于圆柱体内(圆柱体的底面为 x=0,y=0,半径 = 5,高度 = 10),则函数圆柱体(float x, float y, float z) 返回 1,并且0 如果不是。

所以,看起来很简单。检查 z 是否在 <0,10> 范围内,然后检查 x^2 + y^2 < 是否在 <0,10> 范围内。 25.

但我对 x87 的了解为零。

这就是我写的一切。

_cylinder PROC

push ebp
mov ebp, esp
sub esp,8 ; I can't use .data in the application, so I reserve some space on the stack for numbers 10 and 25
mov [esp],10
mov [esp+4],25

finit
fldz
fld [ebp+8]

    ;here i get stuck 

add esp, 8
pop ebp
_cylinder ENDP

所以我被困住了。因此,我尝试查找可以在应用程序中使用哪些说明。我陷入了困境,因为我在网上找到的每个教程/说明列表都写得很糟糕,我几乎无法理解任何内容。

问题是,当我从数学协处理器中弹出一些内容时会发生什么?在哪里可以找到弹出的值?它如何从 80 位值转换为 32 位值(当然,如果可以的话) 另一个问题是,FCOM(FCOMP for pop 变体)是如何工作的?它比较什么与什么(st0 与 st1 或 st1 与 st0?),我在哪里可以看到该值是否较小/等于/较大?

感谢您的帮助!

I've been tasked with writing a simple application in mixed C/ASM that has to use math coprocessor.

There's the function cylinder(float x, float y, float z) that returns 1 if the given point is within the cylinder (the cylinder has a base at x=0,y=0, radius = 5 and height = 10), and 0 if it isn't.

So, looks simple. Check whether z is within <0,10>, and then check if x^2 + y^2 < 25.

But my knowledge about x87 is nil.

There's everything I've written.

_cylinder PROC

push ebp
mov ebp, esp
sub esp,8 ; I can't use .data in the application, so I reserve some space on the stack for numbers 10 and 25
mov [esp],10
mov [esp+4],25

finit
fldz
fld [ebp+8]

    ;here i get stuck 

add esp, 8
pop ebp
_cylinder ENDP

So I got stuck. So, I try to find what instructions could I use in the application. And there I get stuck, because every tutorial/instruction list i find on the net is written so badly I can barely understand anything.

The question is, what happens when I pop something from the math coprocessor? Where can I find the popped value? How does it converts from 80-bit value to 32 bit one (if it does, of course)
Another question is, how does the FCOM (FCOMP for pop variant) works? It compares what to what ( st0 to st1 or st1 to st0?), and where can I see whether the value is smaller/equal/bigger?

Thanks for any help!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

深爱不及久伴 2024-12-08 05:19:53

浮点比较有点痛苦。您可以在 FPU 上进行比较,但在此基础上执行任何操作之前,您必须将浮点状态字传输到 CPU,测试您关心的标志,然后据此做出反应。

举例来说,您最初的比较 z>=0.0 看起来像这样:

fldz
fcomp z
fnstsw ax
test ah, 041h; I *think* I've got the right flags there...
jp good

Floating point comparisons are kind of a pain. You can do the comparison on the FPU, but before you can do anything based on that, you have to transfer the floating point status word to the CPU, test for the flags you care about, and then react based on that.

Just for example, your initial comparison that z>=0.0 would look something like this:

fldz
fcomp z
fnstsw ax
test ah, 041h; I *think* I've got the right flags there...
jp good
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文