2009-10-06 18 views
6

को चालू करता है मैं इस तरह कोड है मैं चल बिन्दु अपवादों के साथ एक मुद्दा में चल रहा हूँ दृश्य स्टूडियो 2005 में चालू की गई:चल बिन्दु ढेर फ्लोटिंग प्वाइंट अपवादों के साथ निपटने

double d = 0.0; 
    double d2 = 3.0; 
    double d3 = d2/d; 

और अगर मैं रजिस्टर एक एसईएच हैंडलर दिनचर्या, तो मैं आसानी से div-by-zero को C++ अपवाद में बदल सकता हूं और इसे पकड़ सकता हूं। अब तक सब ठीक है।

हालांकि, जब मैं ऐसा करता हूं, तो पहला ऑपरेंड (ऊपर उदाहरण में 0.0) एफपीयू रजिस्टर स्टैक पर छोड़ा जाता है। अगर मैं इसे आठ बार करता हूं, तो मैं तब से प्रत्येक फ़्लोटिंग पॉइंट ऑपरेशन के साथ एक फ्लोटिंग पॉइंट स्टैक चेक अपवाद प्राप्त करना शुरू कर दूंगा।

मैं एफएसटीपी निष्पादित करने के लिए __asm ​​ब्लॉक का उपयोग करके इसका सामना कर सकता हूं, इस प्रकार स्टैक से भटकने वाले मूल्य को पॉप कर रहा हूं, और सबकुछ ठीक है।

हालांकि, यह मुझे चिंतित करता है, क्योंकि मैंने इसे कहीं भी पर चर्चा नहीं की है। मैं उन मूल्यों की संख्या के बारे में कैसे निश्चित हो सकता हूं जिन्हें मुझे पॉप करना चाहिए? क्या अपवाद के समय स्टैक पर बस सबकुछ पॉप करना सुरक्षित है? क्या इस क्षेत्र में कोई अनुशंसित सर्वोत्तम अभ्यास है?

धन्यवाद!

+0

क्या यह एसईएच के साथ भी होता है? यदि आप एसईएच हैंडलर पंजीकृत नहीं करते हैं तो क्या वही व्यवहार करता है? –

+0

यह _controlfp() कॉल करने के परिणामस्वरूप होता है जो उन अपवादों को अनमास्क करता है जिनमें मुझे रूचि है (जैसे div-by-zero)। मुझे नहीं लगता कि मेरे पास एसईएच हैंडलर पंजीकृत है या नहीं - लेकिन अगर मैं नहीं करता, तो मैं सिर्फ एक अनचाहे अपवाद के साथ दुर्घटनाग्रस्त हूं। –

उत्तर

3

मैं कुछ भी या तो नहीं मिल रहा है, वहीं मैं संभावना जवाब देने के लिए के रूप में कुछ स्पष्टीकरण दे सकते हैं:

ABI परिभाषित करता है कि एक समारोह पर कॉल स्टैक खाली होना चाहिए, और यह बाहर निकलने पर फिर से खाली होना चाहिए जब तक कि रिटर्न एक फ़्लोटिंग पॉइंट वैल्यू न हो, जहां यह स्टैक पर एकमात्र आइटम होगा।

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

जो आपकी समस्या का कारण बनता है - आम तौर पर एक अपवाद उठाते हुए संकलक एफपीयू को खाली होने का ख्याल रखता है, लेकिन एक एसईएच हैंडलर में, कंपाइलर के पास कोई सुराग नहीं होता है जिससे यह किसी अन्य कार्य में प्रवेश करता है, और इस प्रकार नहीं ले सकता मामले में चीजों की देखभाल। (इसके अलावा यह फिर से धीमा हो रहा है)

जिसका अर्थ है कि सबसे अधिक संभावना है कि एफपीयू स्टैक वापसी पर अपने "संगत" राज्य में होना चाहिए, जिसका अर्थ है कि आप शायद ईएमएमएस निर्देश के बराबर चाहते हैं।

ईएमएमएस क्यों? ठीक है, जब तक कि यह समर्थित नहीं है यह करता है निम्नलिखित:

  • स्पष्ट ढेर
  • ढेर टैग को साफ करता है (जब किसी MMX- सक्षम से बाहर निकल रहा है जो अनुपयोगी ढेर ठीक करता है (जो सभी बचे हुए चल बिन्दु तर्क ठीक करता है) फ़ंक्शन)

यदि आप पेंटियम 1 या इससे भी बदतर का समर्थन करना चाहते हैं, तो आप निश्चित रूप से() ईएमएमएस के आसपास (और) इसके बजाय कुछ और उपयोग कर सकते हैं।

पाठ्यक्रम की कोई गारंटी नहीं है, लेकिन मुझे आशा है कि मैंने संभावित उत्तर के संभावित कारणों की व्याख्या की है।

+0

यह समझ में आता है - मैं काफी निष्कर्ष पर आया था। धन्यवाद। –

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