2013-06-10 4 views
11

एक x86 निष्पादन योग्य में nopl निर्देश एक ऑपरेंड क्यों लेता है? मत करो बस, ठीक है, कुछ भी नहीं?x86 nopl निर्देश एक ऑपरेंड क्यों लेता है?

nopl 0x0(%rax)

+2

http://stackoverflow.com/questions/12559475/what-does-nopl-do-in-x86-system – Hazzit

+0

का संभावित डुप्लिकेट आप तर्क के साथ "कुछ भी नहीं कर सकते", है ना? '9 0 एनओपी 'में भी तर्क हैं, यह वास्तव में' xchg eax, eax' है। – harold

+1

मैं पूछता हूं क्योंकि मैं उपयोग कर रहा एक डीकंपलर इसे शाखा निर्देश के रूप में वर्गीकृत कर रहा है। ऐसा कोई कारण क्यों हो रहा है? – RouteMapper

उत्तर

6

कई प्रोसेसर 'द्विआधारी निर्देश सेट कार्यात्मक समान निर्देश का प्रतिनिधित्व करने के कई तरीके हैं। उदाहरण के लिए, मूल एआरएम अनुदेश सेट प्रपत्र b << n के किसी भी मूल्य जहां b से 0 से 255 और n 0 से 24 के लिए यदि एक मूल्य 256 के साथ R0 लोड करने के लिए चाहता था सम संख्या है एक मूल्य है साथ R0 लोड करने के लिए निर्देश शामिल हैं , एक अनुदेश जो यह 1<<8 से लोड हो लोड सकता है, या एक 4<<6, 16<<4, या 64<<2 के लिए अनुदेश इस्तेमाल कर सकते हैं। उन अलग-अलग मूल्यों को लोड करने के निर्देशों में सभी में अलग-अलग बाइनरी एन्कोडिंग हैं, भले ही सभी चार निर्देशों का एक ही प्रभाव हो।

कुछ compilers के लिए अस्सेम्ब्लेर्स अपने रास्ते से हट जाने के जो उचित रूप में समान निर्देश के कोड का एक टुकड़ा का उपयोग करना चाहिए अनुरोध के साधन उपलब्ध कराने के। हालांकि यह सामान्य रूप से महत्वपूर्ण नहीं है, ऐसे समय होते हैं जब कोड के एक टुकड़े के भीतर कुछ बाइट मानों का उपयोग करने से बचने के लिए वांछनीय हो सकता है, या ऐसे समय हो सकते हैं जब कोड के एक टुकड़े के भीतर कुछ बाइट्स में संशोधन का विशेष प्रभाव होना चाहिए। उदाहरण के लिए, उपरोक्त एआरएम निर्देशों में आठ बिट्स का उपयोग b के मान को निर्दिष्ट करने के लिए किया जाता है। यदि कोड 1212 के साथ उपरोक्त निर्देशों में से एक के b भाग को ओवरराइट करना था, तो R0 में लोड किया गया मान इस बात पर निर्भर करेगा कि मूल चार निर्देशों का उपयोग किस प्रकार किया गया था; यह 0x0C00, 0x0300, 0x00C0, या 0x0030 हो सकता है।

हालांकि 8x86 के लिए असेंबलर आम तौर पर सभी संभावित निर्देश कोडिंग के बीच स्पष्ट रूप से अंतर करना संभव नहीं करते हैं, ऐसे कुछ संदर्भ हो सकते हैं जहां निर्दिष्ट करने में सक्षम होना निर्देशों के भीतर बाइट मानों को शामिल किया जाना उपयोगी हो सकता है। उदाहरण के लिए, अपवादों को संभालने के लिए एक दृष्टिकोण एक नियमित जांच होगी, जब कोई अपवाद होता है, चाहे वापसी पते पर निर्देश एनओपी का कुछ विशेष रूप है और यदि यह है, तो अपने ऑपरेंड को डेटा संरचना के पते के रूप में समझें अपवाद से संबंधित जानकारी धारण करना। व्यावहारिक रूप से, अपवादों का समर्थन करने वाली अधिकांश 8x86 भाषाएं उन्हें संभालने के अन्य साधनों का उपयोग करती हैं, लेकिन उपर्युक्त विधि लंबे एनओपी लाने और निष्पादित करने के लिए आवश्यक समय तक सामान्य फ़ंक्शन रिटर्न को धीमा कर देगी, लेकिन अपेक्षाकृत कुशलता से असाधारण निकास को संभालने में सक्षम होगी (अधिकतर गैर-अपवाद मामले में एनओपी निष्पादित करने की लागत से बचने के हित में बाधाओं को संभालने के लिए भाषाएं धीमी गति से उपयोग करती हैं, लेकिन अन्य भाषाएं अलग-अलग चीजों को करने का विकल्प चुन सकती हैं)।

+1

सच है, इस मामले में यह अधिक उपयोगी है कि ऑपरेंड निर्देश की लंबाई को बदलता है, जैसा कि [nrz के उत्तर] (http://stackoverflow.com/a/12564044/) द्वारा दिखाए गए टिप्पणियों में डुप्लिकेट लिंक में दिखाया गया है । – ughoavgfhw

+0

@ughoavgfhw: अगर किसी को केवल उचित लंबाई के मनमाने ढंग से एनओपी की आवश्यकता होती है, तो कोई भी 'nop', 'nop2',' nop3', आदि को परिभाषित कर सकता है या अन्यथा "सबसे तेज़ एन-बाइट एनओपी अनुक्रम उत्पन्न करने" के लिए एक निमोनिक है। जिसका तर्क आवश्यक आकार था। अगर किसी को केवल जरूरी है उदा। एक 7-बाइट एनओपी उन बाइट्स में से चार में जाने के लिए मूल्य निर्दिष्ट करने की आवश्यकता नहीं होगी। – supercat

2

कभी कभी मैं nops का उपयोग करते डिबगिंग। अगर मुझे पता है कि कुछ गलत कैसे होता है लेकिन इसके लिए हजारों ब्रेकपॉइंट ब्रेक की आवश्यकता होती है, तो मैं उस कोड को लिखता हूं जो इसके लिए परीक्षण करता है।

if (condition_occurred) 
{ 
    asm("nop"); 
} 

जब मैं "ASM" लाइन डीबगर एक DRX रैखिक (शारीरिक) पते के साथ रजिस्टर स्थापित करेगा पर एक ब्रेकपाइंट सेट (करने के लिए इसी: यह इस (सी-शैली कोड) की तरह कुछ लग सकता है आभासी पता) एनओपी के। जब यह स्थान किसी ब्रेकपॉइंट इंटरप्ट पर पहुंच जाता है और आप डीबगर दर्ज करते हैं। यदि आप डीबगर के बिना निष्पादित कर रहे हैं तो एनओपी संसाधित हो जाएगा (कुछ भी नहीं होता है)। तो यहां मैं एक निर्देश चाहता हूं जो बिल्कुल कुछ भी नहीं करता है और यह समझ में आता है कि यह करता है (नहीं)।


यहां एक उदाहरण है जहां "कुछ भी नहीं" एनओपी निर्देश वास्तव में कुछ करता है ... हालांकि अप्रत्यक्ष रूप से।

पेज देखें 8 this paper में और नोटिस उदाहरण 3 में पाश (उदाहरण के 2 के एक विकास है) के पहले (ऊपर) अनुदेश।पृष्ठ के निचले दाएं भाग में फुटनोट भी।

लेखक संकेत देता है कि अतिरिक्त नॉप प्रक्रिया को आगे बढ़ा सकते हैं।

तो nops निश्चित रूप से उनके उपयोग है।

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