我的任务是在混合 C/ASM 中编写一个必须使用数学协处理器的简单应用程序。
如果给定点在圆柱体内(圆柱体的底位于 x=0,y=0,半径 = 5 和高度 = 10),则函数 cylinder(float x, float y, float z) 返回 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 for pop 变体)是如何工作的?它将什么与什么(st0 到 st1 或 st1 到 st0?)进行比较,我在哪里可以看到该值是否更小/等于/更大?
谢谢你的帮助!