इस संकलक उत्पादन में, मैं समझने के लिए nopw
शिक्षा का मशीन कोड एन्कोडिंग काम करता है कोशिश कर रहा हूँ:AMD64 - nopw असेंबली निर्देश?
00000000004004d0 <main>:
4004d0: eb fe jmp 4004d0 <main>
4004d2: 66 66 66 66 66 2e 0f nopw %cs:0x0(%rax,%rax,1)
4004d9: 1f 84 00 00 00 00 00
वहाँ http://john.freml.in/amd64-nopl पर "nopw" के बारे में कुछ चर्चा है। क्या कोई 4004d2-4004e0 के अर्थ की व्याख्या कर सकता है? ओपोड सूची को देखने से, ऐसा लगता है कि 66 ..
कोड बहु-बाइट विस्तार हैं। मुझे लगता है कि जब तक मैंने कुछ घंटों तक ऑपोड सूची को ग्रोक करने की कोशिश नहीं की, तब तक मैं शायद इससे बेहतर जवाब प्राप्त कर सकता हूं।
एएसएम उत्पादन सी में निम्नलिखित (पागल) कोड है, जो एक सरल अनंत लूप करने के लिए नीचे का अनुकूलन से है:
long i = 0;
main() {
recurse();
}
recurse() {
i++;
recurse();
}
जब gcc -O2
साथ संकलित, संकलक अनंत प्रत्यावर्तन और बारी-बारी से पहचानता है यह एक अनंत लूप में; यह वास्तव में ऐसा करता है, वास्तव में, यह वास्तव में में recurse()
फ़ंक्शन को कॉल किए बिना लूप करता है।
संपादक का नोट: एनओपी के साथ पैडिंग फ़ंक्शन अनंत लूप के लिए विशिष्ट नहीं है। यहां एनओपी की लंबाई की एक श्रृंखला है, on the Godbolt compiler explorer.
क्या हम यहां यादृच्छिक जंक पैडिंग देख रहे हैं? –
शायद! मैं वास्तव में नहीं जानता! यह सब की सुंदरता है! WHEEE। असल में, हालांकि, मैं लिंक से मिलता हूं कि प्रोसेसर स्पीड ऑप्टिमाइज़ेशन के लिए एक निर्देश के रूप में एक ब्लॉक लोड कर रहा है, हालांकि 'jmp' के लिए धन्यवाद, यह नहीं है। मुझे बस इसका अर्थ मिलता है। मुझे पता है कि 0x90 क्या है, लेकिन मुझे नहीं पता कि '66 .. ..' के साथ क्या चल रहा है, या यह 72 बिट लंबा क्यों है। –
यह कारण नहीं है, लेकिन आप पाते हैं [मेरा, आपके पास क्या अजीब एनओपी है! - ओल्ड न्यू थिंग] (http://blogs.msdn.com/b/oldnewthing/archive/2011/01/12/10114521.aspx) एक दिलचस्प पढ़ा। – ephemient