5

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

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

所以,看起来很简单。检查 z 是否在 <0,10> 内,然后检查 x^2 + y^2 < 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?)进行比较,我在哪里可以看到该值是否更小/等于/更大?

谢谢你的帮助!

4

1 回答 1

5

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

例如,您对 z>=0.0 的初始比较看起来像这样:

fldz
fcomp z
fnstsw ax
test ah, 041h; I *think* I've got the right flags there...
jp good
于 2011-08-25T18:56:10.063 回答