CIL nop opcode का उद्देश्य क्या है?


82

मैं एमएसआईएल से गुजर रहा हूं और देख रहा हूं कि एमएसआईएल में बहुत सारे एनओपी निर्देश हैं।

MSDN आलेख कहता है कि वे कोई कार्रवाई नहीं करते हैं और यदि ओपकोड को पैच किया जाता है, तो उन्हें भरने के लिए उपयोग किया जाता है। वे डिबग बिल्ड में रिलीज़ बिल्ड की तुलना में बहुत अधिक उपयोग करते हैं।

मुझे पता है कि बाद के निर्देशों को संरेखित करने के लिए विधानसभा भाषाओं में इस प्रकार के बयानों का उपयोग किया जाता है, लेकिन MSIL में MSIL नोड्स की आवश्यकता क्यों है?

(संपादक का ध्यान दें: स्वीकृत उत्तर मशीन-कोड NOPs के बारे में है, MSIL / CIL NOPs के बारे में नहीं, जो मूल रूप से इस बारे में पूछे गए सवाल है।)


19
विधानसभा में भाषा संकलक द्वारा उत्सर्जित एमएसआईएल एनओपी निर्देश और जेआईटी संकलक द्वारा उत्सर्जित x86 एनओपी निर्देश (उस मंच पर) के बीच इन उत्तरों में बड़े पैमाने पर भ्रम होता है। [वास्तव में स्वीकृत उत्तर x86 नोड्स के बारे में है, और इसका MSIL से कोई संबंध नहीं है।] आदर्श रूप से इस प्रश्न को 2 अलग-अलग प्रश्नों में विभाजित किया जाना चाहिए: MSIL का उद्देश्य :: nop? और देशी मंच के उद्देश्य एनओपी?
स्टीव स्टेनर

जवाबों:


107

NOP कई उद्देश्यों की पूर्ति करते हैं:

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

से विकिपीडिया : "एक एनओपी सबसे अधिक समय प्रयोजनों के लिए, बल स्मृति संरेखण के लिए प्रयोग किया जाता है, खतरों को रोकने के एक शाखा देरी स्लॉट पर कब्जा करने, इस तरह के एक कूद के रूप में शून्य एक मौजूदा अनुदेश प्रस्तुत करना, या एक जगह-धारक के रूप में प्रतिस्थापित किया जा करने के लिए कार्यक्रम के विकास में बाद में सक्रिय निर्देशों द्वारा (या हटाए गए निर्देशों को बदलने के लिए जब समस्याग्रस्त या समय लेने वाली होगी)) कुछ मामलों में, एक एनओपी के मामूली दुष्प्रभाव हो सकते हैं, उदाहरण के लिए, प्रोसेसर के मोटोरोला 68000 श्रृंखला पर, एनओपी। opcode पाइपलाइन के सिंक्रनाइज़ेशन का कारण बनता है। ”
mbomb007

10

यहां बताया गया है कि कैसे MSIL / CIL नोड्स ( x86 मशीन कोड नहींnop ) का उपयोग डिबगिंग द्वारा किया जाता है:

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

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

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


C # कॉल निर्देशों के बाद भी Nops देता है ताकि कॉल के बाद लाइन के बजाय स्रोत में रिटर्न साइट स्थान कॉल आउट हो। यकीन नहीं होता कि मुझे यह मिल रहा है। क्या आपके पास कोई संदर्भ उपलब्ध है?
user492238

8

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


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

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

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

1
आप एक स्रोत के रूप में blogs.msdn.com/oldnewthing/archive/2007/08/17/4422794.aspx का संदर्भ जोड़ना चाह सकते हैं ।
ग्रेग डी

1
खैर, एक वास्तविक जवाब में इसे बनाने के लिए ग्रेग और जिमी का धन्यवाद।
harpo

6

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

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

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


5

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


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

MSIL केवल JIT वाले सिस्टम पर JITed है - MSIL JIT की मांग नहीं करता है।
कुर्सी

5

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

रजिस्टर करने के लिए लोड मान (8 चक्र लेता है) nop 8 रजिस्टर करने के लिए 1 जोड़ें

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

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


4

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


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

4

कुछ हद तक अपरंपरागत उपयोग एनओपी-स्लाइड्स हैं , जिनका उपयोग बफर ओवरफ्लो शोषण में किया जाता है।


यह देख रहा था :)
सूरज जैन

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

वर्तमान में शेलकोड पर काम कर रहा है और एनओपी पर अधिक संदर्भ चाहता है। थोड़ा पीछे जाना था, लेकिन यहाँ एक संग्रह है: web.archive.org/web/20110124015428/http://www.phreedom.org:80/…
saniboy

4

50 साल बहुत देर से लेकिन हे।

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

similary, आप कुछ ओपकोड को ओवरराइट करके और कहीं और कूद कर नया कोड डाल सकते हैं। वहां आप ओवरराइट लिखित ओपकोड डालते हैं, और अपना नया कोड डालते हैं। तैयार होने पर आप वापस कूद जाते हैं।

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

आजकल कंपाइलरों के साथ तकनीकें कोई मायने नहीं रखती हैं।


3

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


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

3

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


5
मुझे पूरा यकीन है कि लोगों को समुद्री डाकू सॉफ्टवेयर की मदद करने के लिए नो-ऑप के निर्देशों का आविष्कार नहीं किया गया था :-)
साइमन हॉवर्ड

3

मैंने NOP को उस कोड में भी देखा है जो खुद को एक प्लेसहोल्डर के रूप में क्या करता है इसे संशोधित करने के लिए संशोधित करता है (veeery पुराने कंप्यूटर निरीक्षण)।


3

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


1

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

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


1

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


1

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


1

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

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


1

मैंने ISR में प्रवेश करने के बाद संचित विलंबता को स्वचालित रूप से समायोजित करने के लिए NOPs का उपयोग किया। बहुत समय पर मृत नाखून काटना।


-1

nopस्मृति भ्रष्टाचार शोषण पेलोड में उपयोगी होगा। बेशक nopसे परिचित हैxchg eax, eax


एक अन्य जवाब में पहले से ही कोड-इंजेक्शन कारनामों के लिए एनओपी स्लाइड का उल्लेख है। तो इसी सवाल पर एक और जवाब दिया। इस उत्तर में उल्लेख नहीं है कि वे कैसे उपयोगी हैं, और यदि आप पहले से ही नहीं जानते हैं तो यह स्पष्ट नहीं है।
पीटर कॉर्ड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.