2010-04-24 15 views
42
LEA EAX, [EAX] 

मुझे माइक्रोसॉफ्ट सी कंपाइलर के साथ संकलित एक बाइनरी में इस निर्देश का सामना करना पड़ा। यह स्पष्ट रूप से ईएक्स के मूल्य को नहीं बदल सकता है। तो फिर वहां क्यों है?एलआईए ईएक्स, [ईएक्स] का क्या मतलब है?

+0

पर अनुकूलन है? – Potatoswatter

+0

@Potatoswatter: हाँ, यह बाइनरी का एक रिलीज़ संस्करण है, इसलिए अनुकूलन चालू होना चाहिए। इसके अलावा, मैं disassembling के लिए ollydbg का उपयोग कर रहा हूँ। –

+0

क्या आपके पास इस मणि के लिए संबंधित सी कथन है? – Wikser

उत्तर

79

यह NOP है।

निम्नलिखित टाइपिंग का उपयोग NOP के रूप में किया जाता है। वे सभी एक ही काम करते हैं लेकिन परिणामस्वरूप विभिन्न लंबाई के मशीन कोड होते हैं। संरेखण आवश्यकता के आधार पर उनमें से एक चुन लिया जाता है:

xchg eax, eax   = 90 
mov eax, eax   = 89 C0 
lea eax, [eax + 0x00] = 8D 40 00 
+0

धन्यवाद unicornaddict। यह इसे साफ़ करता है। –

+3

++ यह समझ में आता है –

+5

दरअसल, यह सख्ती से 'एनओपी' नहीं है, क्योंकि यह' ईएक्स' पर डेटा निर्भरता पेश करता है। आधुनिक सीपीयू इस विशिष्ट पैटर्न को 'एनओपी' के रूप में पहचानते हैं और डेटा निर्भरता को अनदेखा करते हैं, लेकिन कुछ पुराने CPUs शायद नहीं। –

3
LEA EAX, [EAX] 

वास्तव में ईएक्स के मूल्य को नहीं बदलता है।

MOV EAX, EAX 

आप अनुकूलित कोड, या unoptimized कोड में यह देखा: जहाँ तक मैं समझता हूँ, यह समान समारोह में करने के लिए है?

+0

पर सिर्फ शून्य है। यह अनुकूलित कोड ठीक है। लेकिन यह इस एलआईए को औचित्य/समझाता है? –

+0

@ फ्रेडरिक: इसे अनुकूलित नहीं किया गया था, मुझे लगता है कि यह समझ में आता है कि संकलक कुछ प्रकार के गणना के लिए एलआईए का उपयोग करता है और एक विशेष मामला इस अनावश्यक कथन उत्पन्न करता है (यह अप्रत्याशित कोड में होता है) –

+0

यह ग्राहकों द्वारा जारी एक बाइनरी है मेरी कंपनी। तो यह अनुकूलित संस्करण होना चाहिए। –

33

से this लेख:

यह चाल MSVC द्वारा किया जाता है ++ संकलक ( से पहले अलग लंबाई के NOP निर्देश फेंकना गद्दी के लिए कूद लक्ष्य)। उदाहरण के लिए, MSVC++ निम्नलिखित कोड अगर यह की जरूरत है 4 बाइट और 6-बाइट गद्दी उत्पन्न करता है:

8d6424 00 ली [EBX +00], EBX ; 4-बाइट पैडिंग 8 डी 9 बी 00000000
ली [esp + 00000000], esp; 6-बाइट गद्दी

पहली पंक्ति के रूप में "npad 4" संकलक द्वारा उत्पन्न विधानसभा लिस्टिंग में चिह्नित है, और दूसरा "npad 6" है। रजिस्ट्रार (ebx, esp) को को शायद ही कभी इस्तेमाल किए गए लोगों से कोड में झूठी निर्भरताओं से बचने के लिए चुना जा सकता है।

तो यह सिर्फ एक प्रकार का एनओपी है, जो उन्हें संरेखित करने के लिए जेएमपी निर्देशों के लक्ष्यों से पहले दिखाई देता है।

दिलचस्प बात यह है कि आप इस तरह के निर्देशों की विशिष्ट प्रकृति से कंपाइलर की पहचान कर सकते हैं।

+2

से भी सूचीबद्ध किया है, यह कहकर कि यह 'एनओपी' है, केवल आधा जवाब है (फिर भी, विचित्र रूप से, चयनित एक)। यह बताते हुए कि आप इन 'एनओपी' क्यों करना चाहते हैं, पूरा जवाब है। बहुत बढ़िया। –

+0

मुझे एमएसवीसी ++ कंपाइलर का उपयोग करके इसका सामना करना पड़ा। –