c - एनसीसी के साथ जीसीसी पैड क्यों काम करता है?




gcc assembly (2)

मैं थोड़ी देर के लिए सी के साथ काम कर रहा हूं और हाल ही में एएसएम में प्रवेश करना शुरू कर दिया है। जब मैं एक प्रोग्राम संकलित करता हूं:

int main(void)
  {
  int a = 0;
  a += 1;
  return 0;
  }

Objdump disassembly कोड है, लेकिन पीछे के बाद nops:

...
08048394 <main>:
 8048394:       55                      push   %ebp
 8048395:       89 e5                   mov    %esp,%ebp
 8048397:       83 ec 10                sub    $0x10,%esp
 804839a:       c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%ebp)
 80483a1:       83 45 fc 01             addl   $0x1,-0x4(%ebp)
 80483a5:       b8 00 00 00 00          mov    $0x0,%eax
 80483aa:       c9                      leave  
 80483ab:       c3                      ret    
 80483ac:       90                      nop
 80483ad:       90                      nop
 80483ae:       90                      nop
 80483af:       90                      nop
...

जो मैंने सीखा है, उससे कुछ भी नहीं करता है, और चूंकि पीछे के बाद भी निष्पादित नहीं किया जाएगा।

मेरा सवाल है: परेशान क्यों? ईएलएफ (linux-x86) किसी भी आकार के .text सेक्शन (+ मुख्य) के साथ काम नहीं कर सका?

मैं सीखने की कोशिश कर रहा हूं, किसी भी मदद की सराहना करता हूं।


जहां तक ​​मुझे याद है, निर्देश सीपीयू और विभिन्न सीपीयू ब्लॉक (लोडर, डिकोडर और इस तरह) प्रक्रिया के बाद के निर्देशों में पाइपलाइन किए गए हैं। जब RET निर्देश निष्पादित किए जा रहे हैं, तो कुछ अगले निर्देश पहले ही सीपीयू पाइपलाइन में लोड हो चुके हैं। यह एक अनुमान है, लेकिन आप यहां खुदाई शुरू कर सकते हैं और यदि आपको पता चलता है (शायद NOP एस की विशिष्ट संख्या जो सुरक्षित हैं, तो कृपया अपने निष्कर्ष साझा करें।


यह अगले कार्य को 8, 16 या 32-बाइट सीमा से संरेखित करने के लिए किया जाता है।

एफोग द्वारा "असेंबली भाषा में सबराउटिन अनुकूलित करना" से:

11.5 कोड का संरेखण

अधिकांश माइक्रोप्रोसेसर 16-बाइट या 32-बाइट ब्लॉक गठबंधन में कोड लाते हैं। यदि एक आयातकब्रूटाइन एंट्री या जंप लेबल 16-बाइट ब्लॉक के अंत के पास होता है तो कोड के उस ब्लॉक को प्राप्त करते समय थीमकप्रोसेसर को केवल कोड के कुछ उपयोगी बाइट मिलेगा। लेबल के बाद पहले निर्देशों को डीकोड करने से पहले इसे अगले 16 बाइट्स भी प्राप्त करना होगा। 16 द्वारा महत्वपूर्ण सबराउटिन प्रविष्टियों और लूप प्रविष्टियों को संरेखित करके इसे टाला जा सकता है।

[...]

एक सबराउटिन एंट्री को संरेखित करना उतना सरल है जितना कि एनओपी को जितना आवश्यक हो उतना एनएसओपी डालने के लिए 8, 16, 32 या 64 तक वांछित पता लगाने के लिए आवश्यक है।







assembly