【发布时间】: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。