2008-10-24 14 views
69

मैं एमएसआईएल के माध्यम से जा रहा हूं और ध्यान में रखते हुए nop निर्देश हैं। एमएसडीएन लेख में कहा गया है कि वे कोई कार्रवाई नहीं करते हैं और यदि ऑपोड पैच किया जाता है तो स्पेस भरने के लिए उपयोग किया जाता है। रिलीज बिल्ड की तुलना में डीबग बिल्ड में उनका बहुत अधिक उपयोग किया जाता है। मुझे पता है कि इन प्रकार के बयानों का उपयोग असेंबली भाषाओं में किया जाता है ताकि यह सुनिश्चित किया जा सके कि एक ओपोड शब्द सीमा पर फिट बैठता है, लेकिन एमएसआईएल में इसकी आवश्यकता क्यों है?एनओपी ओपोड का उद्देश्य क्या है?

+18

वहाँ MSIL nop अनुदेश 86 nop निर्देश (कि मंच पर) विधानसभा में भाषा संकलक और द्वारा उत्सर्जित के बीच इन उत्तरों में बड़े पैमाने पर भ्रम की स्थिति JIT कम्पाइलर द्वारा उत्सर्जित जब विधानसभा चलाया जाता है है। [। वास्तव में स्वीकार किए जाते हैं जवाब 86 nops के बारे में है, और MSIL से कोई संबंध नहीं] आदर्श रूप में इस सवाल 2 अलग अलग सवाल में विभाजित किया जाना चाहिए: MSIL की :: nop उद्देश्य? और मूल मंच के उद्देश्य का उद्देश्य? –

उत्तर

88

NOPs कई प्रयोजनों की सेवा:

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

लोग समुद्री डाकू सॉफ्टवेयर मदद करने के लिए [विकिपीडिया] से कर रहा हूँ (https://en.wikipedia.org/wiki/NOP): "एक एनओपी सबसे अधिक इस्तेमाल किया जाता है समय के उद्देश्यों के लिए, खतरे को रोकने के लिए, खतरे को रोकने के लिए, शाखा विलंब स्लॉट पर कब्जा करने के लिए, एक मौजूदा निर्देश जैसे कि कूद के रूप में, या एक प्लेसहोल्डर के रूप में प्रोग्राम विकास में बाद में सक्रिय निर्देशों द्वारा प्रतिस्थापित करने के लिए, रिफैक्टरिंग के दौरान हटाए गए निर्देशों को प्रतिस्थापित करने के लिए समस्याग्रस्त या समय लेने वाली समस्या होगी)। कुछ मामलों में, एनओपी के पास मामूली दुष्प्रभाव हो सकते हैं; उदाहरण के लिए, मोटोरोला 68000 प्रोसेसर की श्रृंखला पर, एनओपी ओपोड पाइपलाइन के सिंक्रनाइज़ेशन का कारण बनता है। " – mbomb007

8

यह कोड में लाइन-आधारित मार्कर (उदा। ब्रेकपॉइंट्स) के लिए एक अवसर प्रदान करता है जहां एक रिलीज बिल्ड कोई भी उत्सर्जित नहीं करेगा।

+0

क्या ब्रेकपॉइंट्स को एनओपी पर होना चाहिए? क्यों न केवल नियमित ओपोड पर ब्रेकपॉइंट डालें? –

+4

रिलीज बिल्ड में बहुत से नियमित ऑपकोड अनुकूलित हो जाते हैं। यही कारण है कि गंदगी अपने breakpoints जब तक कि वहाँ एक प्लेसहोल्डर वहाँ nop breakpoints अभी भी – Jimmy

+1

को इंगित होता डिबग में बनाता था होगा, वे भी जहां कोड कोई निर्देश है पर तोड़ने के लिए एक निर्देश प्रदान करने के लिए इस्तेमाल कर रहे हैं। उदाहरण के लिए ब्रेसिज़ खोलना। –

3

उनके लिए एक क्लासिक उपयोग ऐसा है कि आपका डीबगर हमेशा एक आईएल निर्देश के साथ एक स्रोत कोड कोड को जोड़ सकता है।

+0

वैसे भी ऐसा नहीं हो सका? –

+0

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

4

दोस्त! नो-ऑप कमाल है! यह एक निर्देश है जो कुछ भी नहीं करता है लेकिन समय का उपभोग करता है। मंद अंधेरे युग में आप इसे महत्वपूर्ण लूप में समय में माइक्रोड्राफ्टमेंट करने के लिए या अधिक महत्वपूर्ण रूप से स्व-संशोधित कोड में एक भराव के रूप में उपयोग करेंगे।

+0

जब मैं सीधे हार्डवेयर पर चल रहा हूं, तो इसका उपयोग समझता है, लेकिन एमएसआईएल जेआईटीड है। –

+0

एमएसआईएल केवल उन प्रणालियों पर जेआईटीड है जिनके पास जेआईटी है - एमएसआईएल जेआईटी की मांग नहीं करता है। – plinth

1

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

कम से कम, यह उनके पारंपरिक उपयोगों में से एक है।

3

वे संपादन और को डीबगिंग करते समय उनका उपयोग करने के लिए उपयोग कर सकते हैं। यह पुराने कोड को ऑफसेट बदलने के बिना पुराने कोड को बदलने के लिए काम करने के लिए कमरे के साथ डीबगर प्रदान करता है।

+4

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

1

यह आपके विशिष्ट प्रश्न का उत्तर नहीं है, लेकिन पुराने दिनों में आप branch delay slot भरने के लिए एनओपी का उपयोग कर सकते हैं , अगर आप इसे अन्यथा उपयोगी निर्देश के साथ भरने में सक्षम नहीं हो सके।

1

क्या .NET कंपाइलर्स MSIL आउटपुट को संरेखित करते हैं? मुझे लगता है कि यह आईएल तक पहुंच बढ़ाने के लिए उपयोगी हो सकता है ... इसके अलावा, मेरी समझ यह है कि इसे पोर्टेबल और गठबंधन करने के लिए डिज़ाइन किया गया है, कुछ अन्य हार्डवेयर प्लेटफॉर्म पर एक्सेस की आवश्यकता है।

2

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

+4

मैं यकीन है कि कोई-op निर्देश का आविष्कार नहीं कर रहे थे :-) –

2

मैंने एनओपी को कोड में भी देखा है जो प्लेसहोल्डर (वीरी पुरानी प्रति सुरक्षा) के रूप में जो कुछ करता है उसे खराब करने के लिए संशोधित करता है।

1

पहली सीरीज़ जो मैंने सीखा वह एसपीएआरसी था इसलिए मैं शाखा देरी स्लॉट से परिचित हूं, अगर आप इसे किसी अन्य निर्देश के साथ भर नहीं सकते हैं, आमतौर पर वह निर्देश जिसे आप शाखा निर्देश से ऊपर रखना चाहते हैं या काउंटर में वृद्धि करना चाहते हैं लूप, आप एक एनओपी का उपयोग करें।

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

4

यह भी कोड रन तेजी से कर सकते हैं, जब विशिष्ट प्रोसेसर या आर्किटेक्चर के लिए अनुकूलन: एक लंबे समय के लिए

प्रोसेसर कई पाइपलाइनों कि समानांतर में मोटे तौर पर काम को रोजगार, इसलिए दो स्वतंत्र अनुदेश एक ही समय में exceuted जा सकता है। दो पाइपलाइनों के साथ एक साधारण प्रोसेसर पर, पहला सभी निर्देशों का समर्थन कर सकता है, जबकि दूसरा केवल एक सबसेट का समर्थन करता है। इसके अलावा, पाइपलाइनों के बीच कुछ स्टालों हैं जब किसी को पिछले निर्देश के परिणाम के लिए इंतजार करना पड़ता है जो अभी तक समाप्त नहीं हुआ है।

इन परिस्थितियों में

, एक समर्पित nop (प्रथम, या पहले नहीं) एक विशिष्ट पाइप लाइन में अगले निर्देश मजबूर हो सकता है, और निर्देशों का पालन की जोड़ी को बेहतर बनाने के लिए इतना है कि nop की लागत अधिक है अमूर्त से

3

बफर ओवरफ़्लो शोषण के पेलोड में एनओपी आवश्यक है।

3

जैसा कि ddaa ने कहा था, nops आपको स्टैक में भिन्नता के लिए खाते हैं, ताकि जब आप रिटर्न एड्रेस को ओवरराइट करते हैं तो यह nop sled (पंक्ति में बहुत सारी नप्स) पर कूदता है और फिर निष्पादन योग्य कोड को सही तरीके से हिट करता है, बल्कि निर्देश में कुछ बाइट कूदने से पहले जो शुरुआत नहीं है।

9

यहाँ कैसे nops डिबगिंग द्वारा उपयोग किया जाता है:

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

DebuggingModes.IgnoreSymbolStoreSequencePoints पर रिक बायर की ब्लॉग प्रविष्टि, कुछ विवरण बताती है।

सी # कॉल निर्देशों के बाद नोप्स भी रखता है ताकि कॉल के बाद लाइन के बजाय स्रोत में वापसी साइट स्थान कॉल हो।

1

मैंने एनओपी का उपयोग आईएसआर दर्ज करने के बाद संचित विलंबता को स्वचालित रूप से समायोजित करने के लिए किया था। समय पर नाखून समय के लिए बहुत आसान है।

2

कुछ हद तक अपरंपरागत उपयोग NOP-Slides है, जो बफर ओवरफ़्लो शोषण में उपयोग किया जाता है।

+0

इस के लिए देख रहा था :) –

+0

अपना लिंक सही करें, यह काम नहीं कर रहा है, कृपया हमेशा सुनिश्चित करें कि आपने वेब संग्रह लिंक सबमिट किया है, क्योंकि वे 404 नहीं देते हैं। –

3

50 साल बहुत देर हो चुकी है लेकिन हे।

यदि आप हाथ से असेंबली कोड टाइप कर रहे हैं तो नोप उपयोगी हैं। यदि आपको कोड को हटाना पड़ा, तो आप पुराने ऑपकोड को रोक सकते थे।

समान, आप कुछ ऑपोड ओवरराइट करके और कहीं और कूदकर नया कोड डाल सकते हैं। वहां आप ओवरराइट किए गए ऑपोड्स डालते हैं, और अपना नया कोड डालें। तैयार होने पर आप वापस कूदें।

कभी-कभी आपको उपलब्ध टूल्स का उपयोग करना पड़ता था। कुछ मामलों में यह सिर्फ एक बहुत ही बुनियादी मशीनकोड संपादक था।

आजकल compilers के साथ तकनीक जो भी अब कोई अर्थ नहीं।

2

एक प्रोसेसर मैं के लिए हाल ही में काम (चार साल के लिए) में एनओपी यकीन है कि पिछले आपरेशन समाप्त होने से पहले अगले आपरेशन शुरू किया गया था बनाने के लिए इस्तेमाल किया गया था। उदाहरण के लिए: पंजीकृत करने के लिए

लोड मूल्य (8 चक्र लेता है) nop 8

यह सुनिश्चित रजिस्टर ऐड ऑपरेशन से पहले सही मान था बनाया रजिस्टर करने के लिए 1 जोड़ें।

एक और उपयोग निष्पादन इकाइयों को भरना था, जैसे इंटरप्ट वैक्टर जो एक निश्चित आकार (32 बाइट्स) होना था क्योंकि सदिश 0 02020 के लिए वेक्टर 0 के लिए पता था, इसलिए कंपाइलर डाल दिया गया था यदि आवश्यक हो तो वहां एनओपी।

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