2016-12-18 6 views
5

में असेंबली फ़ंक्शन इनलाइन बनाना मुझे पता है कि x64 मोड में एमएसवीसी कंपाइलर कोड के इनलाइन असेंबली स्निपेट का समर्थन नहीं करता है, और असेंबली कोड का उपयोग करने के लिए आपको कुछ बाहरी my_asm_funcs.asm फ़ाइल में अपने फ़ंक्शन को परिभाषित करना होगा :x64 विजुअल स्टूडियो

my_asm_func PROC 
    mov rax, rcx 
    ret 
my_asm_func ENDP 

और फिर अपने ग या ज फ़ाइल में आप एक शीर्ष लेख ऐसे ही समारोह के लिए निर्धारित किए हैं:

int my_asm_func(int x); 

हालांकि कि समाधान कई चिंताओं का जवाब देता है, लेकिन मैं अभी भी है कि बनाने में दिलचस्पी है असेंबली कोड फ़ंक्शन इनलाइन होने के लिए, दूसरे शब्दों में - कॉम के बाद पायलट मैं my_asm_func पर किसी भी "कॉल" नहीं चाहता, मैं सिर्फ अपने अंतिम संकलित कोड में असेंबली के इस टुकड़े को चिपकाना चाहता हूं। मैंने इनलाइन और __forceinline कीवर्ड के साथ फ़ंक्शन घोषित करने का प्रयास किया, लेकिन कुछ भी मदद नहीं कर रहा है। क्या मैं अभी भी क्या करना चाहता हूं?

+2

क्या आपने कंपाइलर इंट्रिनिक्स के माध्यम से खोज की है? यह मौका हो सकता है, कि कुछ ऐसा है, जिसमें 'my_asm_func' की कार्यक्षमता शामिल है। आम तौर पर, कंपाइलर के साथ अपनी स्वयं की असेंबली इनलाइन को मिलाकर बहुत अनुकूलन (अनुकूलन के स्तर के आधार पर) काम करने के लिए मुश्किल हो सकता है, इसके रखरखाव का उल्लेख नहीं करना। –

+1

नहीं, संभव नहीं है। कुछ कारणों से यह [एक समान प्रश्न का उत्तर] देखें (http://stackoverflow.com/a/5542379/597607)। –

उत्तर

10

नहीं, आप जो चाहते हैं उसे करने का कोई तरीका नहीं है।

माइक्रोसॉफ्ट का कंपाइलर x86-64 लक्ष्यों के लिए इनलाइन असेंबली का समर्थन नहीं करता है, जैसा कि आपने कहा था। यह आपको बाहरी कोड मॉड्यूल (* .asm) में अपने असेंबली फ़ंक्शंस को परिभाषित करने के लिए मजबूर करता है, उन्हें एमएएसएम के साथ इकट्ठा करता है, और परिणाम को अलग-अलग संकलित सी/सी ++ कोड के साथ जोड़ता है।

चरणों की आवश्यक पृथक्करण का अर्थ है कि सी/सी ++ कंपाइलर आपके असेंबली फ़ंक्शंस को रेखांकित नहीं कर सकता क्योंकि वे संकलन के समय इसके लिए दृश्यमान नहीं हैं।

लिंक-टाइम कोड जनरेशन (एलटीसीजी) सक्षम होने के साथ भी, आपके असेंबली मॉड्यूल को रेखांकित नहीं किया जाएगा क्योंकि लिंकर बस इसका समर्थन नहीं करता है।

सीधे सी या सी ++ कोड में उल्लिखित एक अलग मॉड्यूल में लिखित असेंबली फ़ंक्शंस प्राप्त करने का कोई तरीका नहीं है।

कोई तरीका नहीं है कि inline या __forceinline कीवर्ड कुछ भी कर सकते हैं। असल में, कोई तरीका नहीं है कि आप उन्हें संकलक त्रुटि (या कम से कम एक चेतावनी) के बिना उपयोग कर सकते हैं। इन एनोटेशन को फ़ंक्शन की परिभाषा (जो, इनलाइन फ़ंक्शन के लिए, इसकी घोषणा के समान ही है) पर जाना है, लेकिन आप इसे फ़ंक्शन की परिभाषा पर नहीं डाल सकते हैं, क्योंकि यह एक अलग * .asm फ़ाइल में परिभाषित है। ये एमएएसएम कीवर्ड नहीं हैं, इसलिए उन्हें परिभाषा में जोड़ने की कोशिश करना आवश्यक रूप से एक त्रुटि में होगा। और सी हेडर में असेंबली फ़ंक्शन की अगली घोषणा पर उन्हें समान असफल होने वाला है, क्योंकि वहां कोई कोड नहीं है-बस एक प्रोटोटाइप।

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

आपका एकमात्र अन्य विकल्प सी/सी ++ कोड के विभिन्न क्रमपरिवर्तनों के साथ बैठना और खेलना है जब तक कि आप वांछित ऑब्जेक्ट कोड उत्पन्न करने के लिए कंपाइलर प्राप्त न करें।यह उन मामलों में बहुत शक्तिशाली हो सकता है जहां आप जिन निर्देशों को उत्पन्न करना चाहते हैं, उनके लिए इंट्रिनिक्स उपलब्ध नहीं हैं, लेकिन इसमें बिगड़ने में बहुत समय लगता है, और आपको यह सुनिश्चित करने के लिए फिर से जाना होगा कि यह आपके द्वारा जारी रखा जाता है जब आप कंपाइलर संस्करणों को अपग्रेड करते हैं तो चाहते हैं।

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