क्या कुछ एनओपी कोड दूसरों की तुलना में अलग तरह से व्यवहार किए जाते हैं?


12

मैं इस बारे में उत्सुक हूं, मान लें कि मेरे पास है:

00000000001 90                              nop        
00000000002 90                              nop        
00000000003 90                              nop 

क्या इसे ठीक इसी तरह क्रियान्वित किया जाता है?

00000000001 0F1F00                          nop        dword [ds:rax]

पहले के विपरीत दूसरे उदाहरण का क्या प्रभाव होगा?


1
मुझे लगता है कि दूसरे को पहले की तुलना में तेजी से निष्पादित किया जाएगा, क्योंकि यह 3 के बजाय एक निर्देश है। यह संभव है कि आधुनिक पाइपलाइनिंग कि, हालांकि बदल जाएगा।
लोरेन Pechtel

1
यह क्यों टैग किया गया है ?
कीथ थॉम्पसन

Google के लिए multi byte nop, कुछ परिणाम काफी बदल जाते हैं।
प्रेत ० मी ०

1
@KeithThompson - मैंने C और कोडिंग शैली के टैग खींचे; वे नहीं थे।

@ phant0m - क्या आप उस टिप्पणी को एक उत्तर में रखेंगे और कुछ अधिक प्रासंगिक परिणामों को संक्षेप में बताएंगे? हम सभी को यह समझने की पृष्ठभूमि नहीं है कि उस खोज क्वेरी से क्या वापस आ रहा है।

जवाबों:


2

यह मशीन की वास्तुकला पर निर्भर करता है। क्लासिक केए -10 (पीडीपी -10) में बहुत सारे एनओपी कोड थे, शायद इसका परिणाम अत्यधिक नियमित निर्देश सेट है, और तथ्य यह है कि यह सभी अवरोही घटकों द्वारा लागू किया गया था, न कि माइक्रोकोड द्वारा। कुछ एनओपी ने मेमोरी को संदर्भित किया, कुछ ऐसे स्किप टेस्ट थे जो कभी भी नहीं छूटे, लेकिन फिर भी इस स्थिति का परीक्षण किया कि शायद एक स्किप हो सकता है, और इसी तरह। "JFCL 0," को सबसे तेज़ गति के रूप में मैनुअल में विज्ञापित किया गया था।


मैंने एक बार (8085?) असेंबलर पर काम किया था, जिसमें एक ही जेएमपी निर्देश के साथ कई एनओपी को बदलने का विकल्प दिया गया था। आपको उस प्रदर्शन के दंड का भुगतान करने के लिए संरेखण मिला जो आप w / o चाहते थे। हांडी जब आपके पास पीआईसी में तार थे, तो इतना आसान नहीं था यदि आपके पास सीपीयू-आधारित टाइमिंग लूप था (यही कारण है कि यह डिफ़ॉल्ट रूप से बंद था)।
टीएमएन

अधिकांश बार एनओपी निर्देश का उपयोग एक छोटी देरी को सम्मिलित करने के लिए किया जाता है, आमतौर पर कुछ हार्डवेयर निर्भरता या डिवाइस इरेटा काम के परिणामस्वरूप। प्रदर्शन जुर्माना एनओपी का उपयोग करने का कारण है।
uɐɪ

1
नोड्स में बहुत सारे ऐसोटेरिक उपयोग होते हैं। कुछ आर्किटेक्चर के पास छलांग के लिए बाइट-संरेखण की आवश्यकताएं हैं। स्व-संशोधित कोड (भयावह!) ने नोड्स को ब्याह बिंदुओं के रूप में उपयोग किया। बग सिस्टम ने नाकाम सूचनाओं के बारे में जानकारी संग्रहीत करने के लिए नोड्स का उपयोग किया।
20

@ddyer: कुछ प्रोसेसरों में निर्देश होते हैं (कभी-कभी प्रलेखित, कभी-कभी नहीं) जो कि एक मेमोरी बाइट लाएगा और या तो पूरी तरह से प्राप्त किए गए मान को अनदेखा कर देगा, या इसके साथ कुछ भी नहीं करेगा सिवाय सेट झंडे के जो प्रोग्रामर की परवाह नहीं कर सकता है। 6502 पर, "बीआईटी एब्स" निर्देश का उपयोग अगले दो बाइट्स को चकमा देने के साधन के रूप में करना बहुत आम था; कुछ अनिर्दिष्ट ओपकोड भी हैं जो समान रूप से व्यवहार करते हैं सिवाय इसके कि वे किसी भी झंडे को अपडेट नहीं करते हैं। इस तरह की चाल के साथ एक चेतावनी, हालांकि: वे पढ़ने के लिए पता स्थान का एक बाइट का कारण होगा। कुछ 6502 बाह्य उपकरणों को पढ़ने के लिए प्रतिक्रिया हो सकती है।
सुपरकट

0

ऐसा प्रतीत होता है कि दूसरे उदाहरण को पहले की तुलना में तेज चलना चाहिए। पहले उदाहरण में, तीन अलग-अलग निर्देशों को निष्पादित किया जाएगा। दूसरे में, केवल एक निर्देश। बहु-बाइट NOPs का उपयोग CPU "संकेत" के लिए किया जाता है (वास्तव में कैसे और कब स्पष्ट रूप से गोपनीय है )। वे संरेखण प्रयोजनों (कैश लाइन पर एक तंग लूप शुरू करने के लिए) के लिए उपयोगी हो सकते हैं, लेकिन वर्तमान में उनके पास कोई अन्य उपयोग नहीं है। यह स्पष्ट नहीं है कि क्या सीपीयू वास्तव में तर्कों का मूल्यांकन करता है, इसलिए यह कहना संभव नहीं है कि यह निर्देश डिकोडिंग समय को बढ़ाता है या मेमोरी एक्सेस पेनल्टी लगाता है। एक अच्छे ICE वाला कोई भी व्यक्ति इनमें से किसी एक का परीक्षण करना चाहता है और देखना चाहता है कि बस ट्रेस पर कौन से पते पॉप अप होते हैं?


हालाँकि, कई 6502 असेंबलर अनिर्धारित ऑपोड्स के लिए mnemonic "NOP" का उपयोग करते हैं, जो एक मेमोरी लाने का काम करते हैं (जैसे NOP $ 1FF9) एक दो-बाइट अनुदेश होगा जो एड्रेस 0x1FF9 पढ़ता है और वैल्यू रीड को अनदेखा करता है), मुझे चिप निर्माता से उम्मीद नहीं होगी एक निर्देश के लिए "एनओपी" शब्द का उपयोग करें, जो प्रोग्राम काउंटर / इंस्ट्रक्शन पॉइंटर से आगे कुछ भी करता है क्योंकि कोई गारंटी नहीं है कि प्रोसेसर को हार्डवेयर के लिए हुक नहीं दिया जाएगा जो क्रियाओं को ट्रिगर करता है (उदाहरण के लिए कोड 1 पर स्विच करना) जब कुछ पते (जैसे 0x1FF9) ) तक पहुँचा जाता है, और इस तरह के ट्रिगर बिल्कुल "कोई ऑपरेशन नहीं" होता है।
सुपरकैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.