[英]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.