2013-01-11 14 views
13

gets() पर कॉल करने से पहले यह फ़ंक्शन अधिक स्टैक स्पेस आवंटित क्यों करता है?बेकार आवंटित स्टैकस्पेस?

echo: 
    pushl %ebp 
    movl %esp, %ebp 
    pushl %ebx 
    leal -8(%ebp), %ebx 
    subl $20, %esp  <-- Why so much space? 
    movl %ebx, (%esp) 
    call gets 
    ... 

इसी सी कोड:

void echo() 
{ 
    char buf[4]; 
    gets(buf); 
    puts(buf); 
} 

क्यों बफर और तर्क के लिए हो जाता है के बीच तीन शब्दों का एक अतिरिक्त अतिरिक्त जगह है?

stack http://s8.postimage.org/h2niz1kut/stack.png

+7

संरेखण। संरेखण हर जगह! –

+1

@ एच 2CO3 स्टैक फ्रेम के लिए संरेखण सम्मेलन क्या है, लिनक्स पर जीसीसी मानते हैं? – phant0m

+0

@ phant0m यह विशिष्ट प्रोसेसर पर निर्भर करता है। i386 8 बाइट्स (निश्चित नहीं) हो सकता है जबकि AVX2 32 हो सकता है (फिर से सुनिश्चित नहीं)। बाइनरी में जुड़े स्थिर पुस्तकालयों को मिलान करने की आवश्यकता है। – Potatoswatter

उत्तर

11

पुस्तक कंप्यूटर सिस्टम्स में दो वाक्य हैं। "जीसीसी एक x86 प्रोग्रामिंग दिशानिर्देश का पालन करता है कि फ़ंक्शन द्वारा उपयोग की जाने वाली कुल स्टैक स्पेस 16 बाइट्स के एकाधिक होनी चाहिए।" और "सहेजे गए% ebp के लिए 4 बाइट्स और रिटर्न पते के लिए 4 बाइट्स सहित,"

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