2012-12-11 17 views
5

आप क्या सी ++ कार्यों के भीतर कोडांतरक embedding (और सामान्य रूप से कॉल सी ++ फ़ंक्शन का उपयोग कर) कुछ सीमाएं होती हैं जो बहुत विलंबता प्रति संवेदनशील है एक आवेदन पत्र है, तो तरह लिख रहे हैं:सी ++ स्वीकार्य के भीतर असेंबलर एम्बेड करना?

inline __int64 GetCpuClocks() 
{ 

    // Counter 
    struct { int32 low, high; } counter; 

    // Use RDTSC instruction to get clocks count 
    __asm push EAX 
    __asm push EDX 
    __asm __emit 0fh __asm __emit 031h // RDTSC 
    __asm mov counter.low, EAX 
    __asm mov counter.high, EDX 
    __asm pop EDX 
    __asm pop EAX 

    // Return result 
    return *(__int64 *)(&counter); 

} 

(ऊपर समारोह से आया एक और एसओ पोस्ट मैंने देखा)

क्या आप ब्लैक बॉक्स जैसे असेंबलर-इनलाइन कार्यों का इलाज कर सकते हैं? क्या आप असेंबलर में किए गए गणनाओं से आसानी से परिणाम प्राप्त कर सकते हैं? क्या ऐसे खतरे हैं जिन्हें आप नहीं जानते कि वर्तमान में रजिस्ट्रार आदि में कौन से चर हैं? क्या यह हल करने से अधिक समस्याएं पैदा करता है, या यह विशिष्ट छोटे कार्यों के लिए स्वीकार्य है?

http://www.codeproject.com/Articles/15971/Using-Inline-Assembly-in-C-C

EDIT2 यह और अधिक की ओर उद्देश्य से है:

(मान लें आपके वास्तुकला तय किया जा रहा है, और जाना जाता है)

संपादित मैं सिर्फ यह पाया, यह क्या मैं पर इशारा कर रहा हूँ लिनक्स और x86- यह सिर्फ एक सामान्य सी ++/असेंबलर प्रश्न (या तो मैंने सोचा)।

+1

क्या आप विशेष रूप से विज़ुअल सी ++ के बारे में पूछ रहे हैं? मुझे लगता है कि अन्य कंपाइलरों में अन्य बाधाएं हो सकती हैं। –

+0

@ रोब नोप, अगर कुछ भी मैं लिनक्स, आईसीसी और जी ++ के लिए लक्ष्य रख रहा था। मैंने बस देखा कि पहले असेंबलर समारोह मैंने देखा। – user997112

+1

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

उत्तर

1

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

आपके उदाहरण में, ये __asm push EAX और __asm pop EAX निर्देश हैं।

असली जवाब है, मुझे लगता है, कि तुम क्या एएसएम सुनिश्चित करें कि आप एक ब्लैक बॉक्स के रूप में यह इलाज कर सकते हैं होने के लिए करता है के बारे में पर्याप्त पता करने की जरूरत है। :)

+0

तो मूल रूप से सुनिश्चित करें कि जिस राज्य में आप शुरू करते हैं वह वह राज्य है जिसमें आप समाप्त होते हैं? क्या होगा यदि आप असेंबलर से गणना वापस करना चाहते हैं, तो आप यह कैसे करेंगे? – user997112

+0

यूप, सुनिश्चित करें कि आप राज्य के साथ गड़बड़ नहीं करते हैं। मान वापस लौटने पर मुझे लगता है कि संकलक पर निर्भर करेगा। – Almo

3

मैं subquestion पर जवाब देने के लिए करना चाहते हैं:

इसे हल की तुलना में अधिक समस्याएं पैदा कर, या यह विशिष्ट छोटे कार्यों के लिए स्वीकार्य है करता है?

यह निश्चित रूप से करता है! इनलाइन असेंबलर का उपयोग करके, आप कोड को अनुकूलित करने के लिए कंपाइलर से क्षमता लेते हैं। यह आंशिक अभिव्यक्ति सबस्टेशन या किसी अन्य फैंसी अनुकूलन नहीं कर सकता है। वास्तव में, वास्तव में कोड उत्पन्न करना मुश्किल है जो कि कंपाइलर -ओ 3 के साथ उत्सर्जित करता है उससे बेहतर है। और बोनस के रूप में, कोड अगले कंपाइलर रिलीज के साथ भी बेहतर हो जाता है (यह मानते हुए कि अगली कंपाइलर रिलीज इसे तोड़ नहीं देती है))।

कंपाइलर्स आमतौर पर मानव मस्तिष्क (या स्वच्छता सुनिश्चित करने के लिए) की तुलना में अधिक व्यापक दायरे को समझ सकते हैं, जो सही जगह पर सही कार्य को रेखांकित करने में सक्षम होते हैं, आंशिक अभिव्यक्ति प्रतिस्थापन करने के लिए जो कोड को और अधिक कुशल बनाता है। चीजें आप एएसएम में ऐसा कभी नहीं होगा क्योंकि अपने कोड नरक के रूप में पढ़ने योग्य नहीं हो जाता है।

एक अचूक संदर्भ के रूप में, मैं एसएचए 1 के गिट कार्यान्वयन से संबंधित लिनस टोरवाल्ड्स द्वारा this post करना चाहता हूं, जो libcrypt में हाथ से अनुकूलित SHA1 से बेहतर प्रदर्शन करता है।

वास्तव में, मुझे लगता है कि आजकल इनलाइन असेंबलर का एकमात्र उचित उपयोग प्रोसेसर निर्देशों को कॉल कर रहा है जो अन्यथा उपलब्ध नहीं हैं (जिसे आपने उद्धृत किया है, लिनक्स पर उपलब्ध है उदाहरण के लिए clock_gettime, कम से कम यदि आप केवल बाद में हैं उच्च रिज़ॉल्यूशन टाइम काउंटर) या यदि आपको उन चीजों को करना है जहां आपको कंपाइलर को ट्रिक करने की आवश्यकता है (उदाहरण के लिए विदेशी फ़ंक्शन इंटरफेस के कार्यान्वयन के दौरान)।


स्निपेट पर और अन्य ने क्या कहा। विशेष रूप से ऐसे कार्यों के साथ आपको एक प्रदर्शन जुर्माना मिलेगा। इनलाइन एएसएम में, आपको सुपर-सावधान रहना होगा कि रजिस्टरों को राज्य में रखा जाता है, संकलक उन्हें मानते हैं (ऊपर के रूप में पुश/पॉप)। यद्यपि यदि आप सामान्य रूप से कोड लिखते हैं, तो संकलक देखभाल कर सकता है और वास्तव में उन चरों को रख सकता है जिनके लिए यह रजिस्टरों में समझ में आता है और जो ढेर पर फिट नहीं होते हैं।

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

+0

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

+0

@ user997112 आपके मन में कौन सा मामला है? संख्याओं के साथ सब कुछ करने के बारे में सोचते हुए, आप शायद इसे काट नहीं पाएंगे। यह भी ध्यान रखें कि मैंने संदर्भ को बदल दिया है, मेरे मूल में वास्तव में इनलाइन एएसएम शामिल है। –

+0

मेरे पास कुछ भी दिमाग में नहीं है, लेकिन यह निश्चित रूप से उपयोगी होगा अगर यह पता लगाना संभव हो कि क्या कोई क्षेत्र कंपाइलर्स खराब हैं या नहीं। – user997112

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