2010-12-15 10 views
5

मैं वर्तमान में सी कोडों को अलग करके एएसएम सीख रहा हूं। एक बात रुचि मुझे उस जीसीसी संकलक इसmov% rax,% rax का उद्देश्य क्या है?

movq %rax,%rax 

जो स्पष्ट रूप से कोई मतलब नहीं है की तरह कोड उत्पन्न करता है। तो ऐसा करने का उद्देश्य क्या है?

मुझे आश्चर्य है कि क्या इसका उपयोग पाइपलाइन को बेहतर बनाने के लिए CPU के कुछ चक्रों को बर्बाद करने के लिए किया जाता है?

आपके संकेत के लिए धन्यवाद!

+0

इसका उपयोग पाइपलाइन में सुधार करने के लिए नहीं किया जाता है। सभी x86 प्रोसेसर (ऐतिहासिक कारणों के लिए?) में हार्डवेयर है जो इस तरह के खतरों को हल करते समय रोकता है। केवल आरआईएससी, जो कि सरल हैं, इसके लिए कंपाइलर समर्थन की आवश्यकता है। – ruslik

+1

@ruslik: एक स्टॉल खुद ही एक खतरे है। –

उत्तर

10

यह मूल रूप से नो-ऑप है, हां।

संकलक ऐसा करता है क्योंकि 4-बाइट सीमा पर गठबंधन किए गए पते पर ब्रांच करना एक असाइन किए गए पते पर ब्रांच करने से तेज़ है। तो यदि आपके पास लूप है, तो संकलक इसे संरेखण में लाने के लिए इसे शुरू करने से ठीक पहले "पैडिंग" डालेगा।

+0

एक उचित स्पष्टीकरण की तरह लग रहा है। लेकिन एनओपी निर्देश का उपयोग क्यों नहीं करते? – xis

+4

x86 में "समर्पित" एनओपी निर्देश नहीं है। 1-बाइट एनओपी निर्देश में सटीक ओपोड है 'xchg% eax,% eax', और इसी तरह अन्य nop आकारों के लिए। संकलक इसे आवश्यक पैडिंग की मात्रा के लिए सही आकार के साथ नो-ऑप चुनता है। –

+5

क्योंकि एक मानक एनओपी निर्देश 1 बाइट लंबा है, और संकलक को पैडिंग के लिए 2 बाइट की आवश्यकता होती है। 1 निर्देश 2 से तेज है, भले ही दोनों एनओपी हैं। पूर्व में, सामान्य 3 बाइट्स एनओपी 'ली एडी, [ईडीआई + 0] ' – ruslik

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