assembly "प्रतिनिधि क्या करता है nop; "x86 असेंबली में मतलब है? क्या यह "रोकें" निर्देश के समान है?




cpu x86-64 (2)

rep; nop rep; nop वास्तव में pause निर्देश ( F390 ) के समान है। इसका उपयोग उन असेंबलरों के लिए किया जा सकता है जो अभी तक pause निर्देश का समर्थन नहीं करते हैं। पिछले प्रोसेसर पर, यह बस कुछ भी नहीं था, बस दो बाइट्स में। हाइपरथ्रेडिंग का समर्थन करने वाले नए प्रोसेसर पर, इसे प्रोसेसर के संकेत के रूप में उपयोग किया जाता है कि आप प्रदर्शन बढ़ाने के लिए स्पिनलोप निष्पादित कर रहे हैं। इंटेल के निर्देश संदर्भ से :

स्पिन-प्रतीक्षा लूप के प्रदर्शन में सुधार करता है। "स्पिन-वेट लूप" निष्पादित करते समय, एक पेंटियम 4 या इंटेल ज़ीऑन प्रोसेसर को लूप से बाहर निकलने पर गंभीर प्रदर्शन दंड का सामना करना पड़ता है क्योंकि यह संभावित मेमोरी ऑर्डर उल्लंघन का पता लगाता है। PAUSE निर्देश प्रोसेसर को एक संकेत प्रदान करता है कि कोड अनुक्रम एक स्पिन-प्रतीक्षा लूप है। प्रोसेसर अधिकांश स्थितियों में मेमोरी ऑर्डर उल्लंघन से बचने के लिए इस संकेत का उपयोग करता है, जो प्रोसेसर प्रदर्शन में काफी सुधार करता है। इस कारण से, यह अनुशंसा की जाती है कि सभी स्पिन-प्रतीक्षा लूप में एक PAUSE निर्देश रखा जाए।

  • rep; nop क्या करता है rep; nop मतलब मतलब है?
  • क्या यह pause निर्देश के समान है?
  • क्या यह rep nop (सेमी-कोलन के बिना) जैसा ही है?
  • सरल nop निर्देश में क्या अंतर है?
  • क्या यह एएमडी और इंटेल प्रोसेसर पर अलग-अलग व्यवहार करता है?
  • (बोनस) इन निर्देशों के लिए आधिकारिक दस्तावेज कहां है?

इस सवाल के लिए प्रेरणा

किसी अन्य प्रश्न की टिप्पणियों में कुछ चर्चा के बाद, मुझे एहसास हुआ कि मुझे नहीं पता कि rep; nop; क्या है rep; nop; rep; nop; x86 (या x86-64) असेंबली में मतलब है। और मुझे वेब पर भी एक अच्छा स्पष्टीकरण नहीं मिला।

मुझे पता है कि rep एक उपसर्ग है जिसका अर्थ है "अगले निर्देश cx टाइम्स दोहराएं" (या कम से कम यह पुराने 16-बिट x86 असेंबली में था)। विकिपीडिया में इस सारांश तालिका के अनुसार, ऐसा लगता है कि rep केवल movs , cmps , cmps , lods , scas साथ उपयोग किया जा सकता है (लेकिन हो सकता है कि यह सीमा नए प्रोसेसर पर हटा दी गई हो)। इस प्रकार, मुझे लगता है कि rep nop (सेमी-कोलन के बिना) एक nop ऑपरेशन cx टाइम्स दोहराएगा।

हालांकि, आगे की खोज के बाद, मुझे और भी उलझन में मिला। ऐसा लगता है कि rep; nop मानचित्र को ठीक उसी ओपोड पर pause और pause , और pause सिर्फ nop से थोड़ा अलग व्यवहार है। 2005 से कुछ पुराने मेल ने कहा कि विभिन्न चीजें:

  • "बहुत अधिक शक्ति जलाने की कोशिश न करें"
  • "यह सिर्फ 2 बाइट एन्कोडिंग के साथ 'nop' के बराबर है।"
  • "यह इंटेल पर जादू है। इसकी तरह 'एनओपी है लेकिन अन्य एचटी भाई चलाने दें' '
  • "यह एथलॉन पर इंटेल और फास्ट पैडिंग पर रोक है"

इन अलग-अलग विचारों के साथ, मैं सही अर्थ को समझ नहीं पाया।

इसका उपयोग लिनक्स कर्नेल ( i386 और x86_64 दोनों पर) में किया जा रहा है, साथ ही इस टिप्पणी के साथ: /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ यह भी उसी टिप्पणी के साथ बीआरटीओएस में उपयोग किया जा रहा है


उपसर्ग जो निर्देश पर लागू नहीं होते हैं उन्हें अनदेखा किया जाता है। हालांकि, भविष्य के सीपीयू एक नए निर्देश को एन्कोड करने के लिए उस बाइट अनुक्रम का उपयोग कर सकते हैं। (हाँ, x86 ऑपोड स्पेस इतना सीमित है कि वे इस तरह पागल सामान करते हैं, और हाँ यह डिकोडर्स जटिल बनाता है।)

इस मामले में, इसका मतलब है कि आप पिछली संगत तोड़ने के बिना spinloops में pause का उपयोग कर सकते हैं । पुरानी सीपीयू जो pause बारे में नहीं जानते हैं उन्हें बिना किसी नुकसान के एनओपी के रूप में डीकोड किया जाएगा। नए सीपीयू पर, आपको पावर-सेविंग / एचटी मित्रता का लाभ मिलता है, और मेमोरी ऑर्डरिंग गलत-अटकलें से परहेज करते हैं जब आप जिस मेमोरी पर कताई कर रहे हैं वह बदल जाती है और आप स्पिन लूप छोड़ रहे हैं।

X86 टैग विकी जानकारी पृष्ठ पर इंटेल के मैनुअल और अन्य अच्छी सामग्री के लिंक: https://.com/tags/x86/info

एक अर्थहीन rep उपसर्ग का एक और मामला नए सीपीयू पर एक नया निर्देश बन रहा है: lzcnt F3 0F BD /r । उन CPUs पर जो उस निर्देश का समर्थन नहीं करते हैं (उनके CPUID में LZCNT सुविधा ध्वज को याद करते हैं), यह rep bsr रूप में डीकोड करता है, जो rep bsr के समान होता है। तो पुराने CPUs पर, यह 32 - expected_result result उत्पन्न करता 32 - expected_result , और इनपुट शून्य 32 - expected_result पर अपरिभाषित होता है।

एक अर्थहीन rep उपसर्ग का एक मामला जो शायद कभी अलग-अलग डीकोड नहीं करेगा: "जेनेरिक" सीपीयू को लक्षित करते समय rep ret जीसीसी द्वारा डिफ़ॉल्ट रूप से उपयोग किया जाता है (यानी एक विशिष्ट सीपीयू को -march या -mtune साथ लक्षित नहीं करते हैं, और एएमडी के 8 या के 10 को लक्षित नहीं करते हैं। ) यह दशकों से पहले होगा कि कोई भी सीपीयू बना सकता है जो rep ret के अलावा किसी अन्य चीज के रूप में rep ret को डीकोड करता है, क्योंकि यह अधिकांश लिनक्स डिस्ट्रोज़ में अधिकांश द्विआधारी में मौजूद है। देखें 'रेप रेट' का क्या अर्थ है?





x86-64