How to ensure 16byte code alignment of Delphi routines? -
पृष्ठभूमि:
मेरे पास ऑप्टिमाइज़्ड डेल्फी / बीएएसएम कार्यक्रमों की इकाई है , अधिकतर भारी कम्प्यूटेशंस के लिए इनमें से कुछ रूटीइनों में आंतरिक छोर होते हैं, जिसके लिए मैं एक महत्वपूर्ण गति-अप प्राप्त कर सकता हूं अगर लूप की शुरुआत एक DQWORD (16-बाइट) सीमा से जुड़ा है। मैं यह सुनिश्चित कर सकता हूं कि प्रश्न में लूप वांछित के रूप में गठबंधन कर दिए गए हैं, अगर मैं नियमित प्रवेश बिंदु पर संरेखण को जानता हूं।
जहां तक मैं देख सकता हूं, डेल्फी कंपाइलर डीडॉर्ड सीमाओं के लिए प्रक्रियाओं / फ़ंक्शन संरेखित करता है, और उदा। यूनिट में फ़ंक्शन जोड़ने से बाद वाले के संरेखण में बदलाव आ सकता है। हालांकि, जब तक मैं 16 के गुणकों के लिए दिनचर्या के अंत में पैड करता हूं, मैं यह सुनिश्चित कर सकता हूं कि पहले दिनचर्या के संरेखण के आधार पर बाद के रूटीन समान रूप से गठबंधन कर रहे हों- या गलत तरीके से संरेखित करें। इसलिए मैंने यूनिट के कार्यान्वयन सेक्शन की शुरुआत में महत्वपूर्ण दिनचर्या रखने की कोशिश की, और उनके सामने एक थोड़ा पैडिंग कोड डाल दिया ताकि पहली प्रक्रिया डीक्वॉर्ड की होगी।
यह नीचे जैसा दिखता है: < / P>
इंटरफ़ेस प्रक्रिया FirstProcInUnit; कार्यान्वयन प्रक्रिया __PadFirstProcTo16; वांछित कोड लम्बाई प्राप्त करने के लिए यहाँ एनओपी निर्देशों की एएसएम // चर संख्या; प्रक्रिया FirstProcInUnit; एएसएम / / डीक्यूवर्ड सीमा से शुरू होनी चाहिए / / कुछ करना / padding कुछ लेबल को डीक्यूडब्ल्यूडब्ल्यूआर सीमा के लिए संरेखित करने के लिए some16BAlignedLabel: // code, some16BAlignedLabel // पर वापस लूपिंग करना / कुछ अतिरिक्त कोड को प्राप्त करने के लिए #params // padding 16 अंत के कई करने के लिए; प्रारंभिकता __PadFirstProcTo16; // इसे यहाँ कॉल करें ताकि इसे एएसएसईआरटी ((नेटिव यूआईएनटी (@FirstProcInUnit)) और $ 0F) = 0, 'फर्स्टप्रोसी इनयूएनट डॉकवर्ड गठबंधन नहीं' को अनुकूलित नहीं किया गया है; समाप्त।
यह गर्दन में दर्द का एक सा है, लेकिन जब मैं आवश्यक हो तब काम करने के लिए इस तरह की चीज प्राप्त कर सकता हूं। समस्या यह है कि जब मैं एक ऐसी परियोजना का उपयोग विभिन्न परियोजनाओं में करता हूं, या एक ही परियोजना में अन्य इकाइयों में कुछ परिवर्तन करता हूं, तो यह अभी भी __ पैडफ्रंटप्रक्रूट 16
के संरेखण को तोड़ सकता है इसी तरह, अलग कंपाइलर संस्करणों (जैसे डी 2009 बनाम डी 2010) के साथ एक ही परियोजना को दोबारा जोड़ना आम तौर पर संरेखण भी टूटता है। इसलिए, मैंने इस तरह की चीज़ों को करने का एकमात्र तरीका हाथ से किया था, जब तक कि बाकी सभी परियोजना अपने अंतिम रूप में होनी चाहिए।
प्रश्न 1:
क्या यह सुनिश्चित करने के वांछित प्रभाव को प्राप्त करने का कोई दूसरा तरीका है (कम से कम कुछ विशिष्ट) routines DQWORD- संरेखित हैं? < / P>
प्रश्न 2:
क्यूम्बलर के संरेखण को प्रभावित करने वाले सटीक कारक कौन-कौन से हैं और (मैं कैसे) इस विशिष्ट ज्ञान का उपयोग कर समस्या को दूर करने के लिए उपयोग कर सकता हूं यहाँ पर?
मान लें कि इस प्रश्न के लिए "कोड संरेखण / संबद्ध संभाव्य रूप से छोटे गति लाभों के बारे में चिंता न करें" नहीं एक अनुमेय जवाब है।
डेल्फी XE के रूप में, कोड संरेखण की समस्या अब आसानी से $ CODEALIGN
का उपयोग करके हल हो गई है संकलक निर्देश (देखें):
{$ CODEALIGN 16} प्रक्रिया MyAlignedProc; शुरू .. अंत;
Comments
Post a Comment