首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >x87 FPOP和FCOM指令--它们是如何工作的?

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

Stack Overflow用户
提问于 2011-08-26 02:37:39
回答 1查看 2.2K关注 0票数 5

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

有一个函数cylinder (浮点x,浮点y,浮点z),如果给定点在圆柱体内,则返回1(圆柱体的底线为x=0,y=0,半径=5,高度= 10),如果不在,则返回0。

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

但我对x87的了解为零。

这是我写的所有东西。

代码语言:javascript
运行
复制
_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 variant)是如何工作的?它将什么与什么( st0到st1或st1到st0?)进行比较,我在哪里可以看到值是更小/等于还是更大?

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2011-08-26 02:56:10

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

举个例子,你最初比较z>=0.0应该是这样的:

代码语言:javascript
运行
复制
fldz
fcomp z
fnstsw ax
test ah, 041h; I *think* I've got the right flags there...
jp good
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7195502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档