gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:02:54 33 4
gpt4 key购买 nike

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

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

感谢您的帮助!

最佳答案

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

举个例子,你最初的比较 z>=0.0 看起来像这样:

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

关于c - x87 FPOP 和 FCOM 指令——它们是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7195502/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com