我的任务是在混合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?),我在哪里可以看到该值是小/等于/更大?
感谢您的帮助!
答案 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