x87 FPOP和FCOM指令 - 这些如何工作?

时间:2011-08-25 18:37:39

标签: c assembly x86 x87

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

如果给定点在圆柱体内,则返回1的函数柱面(浮点数x,浮点数y,浮点数z)(圆柱体的基数为x = 0,y = 0,半径= 5,高度= 10 ),如果不是,则为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)如何工作?它比较什么(st0到st1或st1到st0?),我在哪里可以看到该值是小/等于/更大?

感谢您的帮助!

1 个答案:

答案 0 :(得分: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