2011-08-25 14 views
5

मुझे मिश्रित सी/एएसएम में एक साधारण आवेदन लिखने के लिए काम किया गया है जिसे गणित कॉप्रोसेसर का उपयोग करना है।x87 एफपीओपी और एफकॉम निर्देश - ये कैसे काम करते हैं?

फ़ंक्शन सिलेंडर (फ्लोट एक्स, फ्लोट वाई, फ्लोट जेड) है जो 1 देता है यदि दिया गया बिंदु सिलेंडर के भीतर है (सिलेंडर का 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 बिट एक में परिवर्तित कैसे होता है (यदि यह करता है, तो एक और सवाल यह है कि एफसीओएम (पॉप संस्करण के लिए एफसीओएमपी) कैसे काम करता है? यह तुलना करता है कि क्या (st0 से st1 या st1 से st0?), और मैं कहां देख सकता हूं कि मान छोटा/बराबर/बड़ा है या नहीं?

किसी भी मदद के लिए धन्यवाद!

+5

इससे पहले कि आप बहुत गहरा मिलता है, बजाय SSE2 गणित का उपयोग कर x87 का विचार करें। इसके साथ काम करना बहुत आसान है (आप स्टैक के बजाय रजिस्टरों का उपयोग करना चाहते हैं), इसमें अधिक फ़ंक्शन उपलब्ध हैं, और आमतौर पर तेज़ होते हैं। – duskwuff

+0

क्या duskwuff ने कहा। 'x87' प्रभावी रूप से बहिष्कृत किया जा रहा है, और नए सॉफ्टवेयर को लक्षित करने के लिए बहुत कम कारण है। –

+0

@ स्टीफन - कुछ ओएस द्वारा "बहिष्कृत", सीपीयू नहीं, विक्रेता (लेकिन यहां तक ​​कि अभी भी समर्थित है)। उपयोग के कारण: उदाहरण के लिए 80-बिट विस्तारित परिशुद्धता और अनुवांशिक गणित कार्य। – PhiS

उत्तर

5

फ़्लोटिंग पॉइंट तुलना एक दर्द का प्रकार है। आप एफपीयू पर तुलना कर सकते हैं, लेकिन इससे पहले कि आप उस पर आधारित कुछ भी कर सकें, आपको फ्लोटिंग पॉइंट स्टेटस शब्द को सीपीयू में स्थानांतरित करना होगा, जिन झंडे की आप परवाह करते हैं, उनके लिए परीक्षण करें और उसके बाद प्रतिक्रिया दें।

बस उदाहरण के लिए, अपने प्रारंभिक तुलना कि z> = 0.0 कुछ इस तरह दिखेगा:

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

हम्म, क्या यह 'परीक्षण आह' नहीं होना चाहिए ...? [संदर्भ] (http://webster.cs.ucr.edu/AoA/Windows/HTML/RealArithmetic.html#1000117)। व्यक्तिगत रूप से मुझे ['FCOMI'] का उपयोग करना पड़ता है (http://stackoverflow.com/questions/7057501/x86-assembler-floating-point-compare/7057771#7057771) स्थिति शब्द के लिए बिटमैस्क के साथ गड़बड़ करने से आसान, यह केवल उपलब्ध है पी 6 + पर हालांकि। – user786653

+3

@ user786653: ओह - हाँ, यह आह होना चाहिए, कुल्हाड़ी नहीं। मैं क्षमाप्रार्थी हूं।हां, एफसीओएमआई अच्छा है, लेकिन जब तक पी 6 साथ आया, मैं लगभग उतना ही असेंबली कोड नहीं लिख रहा था। अगर मैं नए प्रोसेसर के लिए लिख रहा था, तो शायद मैं इसके बजाय एसएसई का उपयोग करूंगा। –

+2

मैं सहमत हूं, अगर मैंने इसे x86 असेंबलर में लिखना था। ऐसा लगता है कि OP को x87 का उपयोग करने पर सेट किया गया है, इसलिए मुझे लगा कि मैं वहां से बाहर निकलना चाहता हूं। मुझे लगता है कि 'sahf' + हस्ताक्षरित परीक्षण (जैसे' fcomi') काम कर रहा है। – user786653

संबंधित मुद्दे