簡體   English   中英

x87 FPOP和FCOM指令-這些如何工作?

[英]x87 FPOP and FCOM instructions - how do these work?

我的任務是在混合C / ASM中編寫一個必須使用數學協處理器的簡單應用程序。

如果給定點在圓柱體內(圓柱的底數為x = 0,y = 0,半徑= 5且高度= 10),則有一個圓柱函數(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)如何工作? 它比較什么與什么(從st0到st1或從st1到st0?),並且在哪里可以看到該值是較小/等於/較大?

謝謝你的幫助!

浮點比較有點麻煩。 您可以在FPU上進行比較,但是在執行基於此的任何操作之前,您必須將浮點狀態字傳輸到CPU,測試您關心的標志,然后基於此進行響應。

例如,您的初始比較z> = 0.0看起來像這樣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM