【问题标题】:x87 FPOP and FCOM instructions - how do these work?x87 FPOP 和 FCOM 指令 - 这些是如何工作的?
【发布时间】:2011-08-25 18:37:38
【问题描述】:

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

如果给定点在圆柱体内(圆柱体在 x=0,y=0,半径 = 5 和高度 = 10 ),否则为 0。

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

但我对 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?),我在哪里可以看到该值是否更小/等于/更大?

感谢您的帮助!

【问题讨论】:

  • 在深入之前,请考虑使用 SSE2 数学而不是 x87。它更容易使用(您可以使用寄存器而不是堆栈),具有更多可用功能,并且通常更快。
  • 黄昏说什么。 x87 实际上已被弃用,新软件几乎没有理由将其作为目标。
  • @PhiS:与 SSE 和 AVX 相比,x87 只会变得更慢。 80 位精度在对浮点有深入了解的程序员手中偶尔有用,但在面对编译器优化时,往往会以不可预知的行为形式造成弊大于利。超越数学指令比基于 SSE 或 AVX 的软件实现要慢。 x87 在它的时代非常有用,但它早就该继续前进了。
  • 我不明白这个问题。您必须用“C/ASM”编写程序吗?那么为什么不直接用 C 编写代码呢?
  • ray.masmcode.com/tutorial/index.html 是 x87 的一个很好的介绍。它有大量的细节,但是以一种 insn ref 手册没有的方式将各个部分组合在一起。有关更多链接,请参阅stackoverflow.com/tags/x86/info

标签: c assembly x86 x87


【解决方案1】:

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

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

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

【讨论】:

  • 嗯,不应该是test ah, ...吗? Reference。就我个人而言,我发现使用FCOMI 比使用状态字的位掩码更容易,但它只在 P6+ 上可用。
  • @user786653:哎呀——是的,应该是啊,不是斧头。我很抱歉。是的,FCOMI 很好,但是当 P6 出现时,我写的汇编代码几乎没有。如果我正在为更新的处理器编写代码,我可能会改用 SSE。
  • 我同意,如果我不得不用 x86 汇编器编写它。似乎OP设置为使用x87,所以我想我会在那里完成它。我似乎也模糊地记得sahf + 未签名的测试(与fcomi 一样)工作。
  • 你可以在那里使用 FNSTSW AX,还是你的意思是使用 FSTSW AX?
  • @Brian:我相信在这种情况下你可以使用 FNSTSW。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 2013-08-22
相关资源
最近更新 更多