मैं कंपाइलर्स मशीन कोड कैसे उत्पन्न करता है, और अधिक विशेष रूप से जीसीसी स्टैक के साथ कैसे व्यवहार करता है, इसकी गहरी समझ हासिल करने का प्रयास कर रहा हूं। ऐसा करने में मैं सरल सी प्रोग्राम लिख रहा हूं, उन्हें असेंबली में संकलित कर रहा हूं और परिणाम को समझने के लिए अपनी पूरी कोशिश कर रहा हूं। यहाँ एक सरल कार्यक्रम है और आउटपुट उत्पन्न:स्टैक आवंटन, पैडिंग और संरेखण
asmtest.c
:
void main() {
char buffer[5];
}
asmtest.s
:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
leave
ret
क्या मुझे puzzling है यही कारण है कि 24 बाइट्स ढेर के लिए आवंटित किया जा रहा है। मुझे पता है कि कैसे प्रोसेसर स्मृति को संबोधित करता है, स्टैक को 4 की वृद्धि में आवंटित किया जाना चाहिए, लेकिन यदि यह मामला था, तो हमें केवल स्टैक पॉइंटर को 8 बाइट्स तक ले जाना चाहिए, 24 नहीं। संदर्भ के लिए, 17 का बफर बाइट्स एक स्टैक पॉइंटर 40 बाइट्स ले जाते हैं और स्टैक पॉइंटर 8 की सभी चालों पर कोई बफर नहीं होता है। 1 और 16 बाइट्स के बीच एक बफर समावेशी चाल ESP
24 बाइट्स।
अब मानते हुए कि 8 बाइट एक आवश्यक स्थिर है (इसके लिए क्या आवश्यक है?), इसका मतलब है कि हम 16 बाइट्स के टुकड़ों में आवंटित कर रहे हैं। संकलक इस तरह से संरेखित क्यों होगा? मैं एक x86_64 प्रोसेसर का उपयोग कर रहा हूं, लेकिन 64 बिट शब्द को केवल 8 बाइट संरेखण की आवश्यकता होनी चाहिए। विसंगति क्यों?
संदर्भ के लिए मैं इसे मैक 4.0.1 के साथ चल रहे मैक पर संकलित कर रहा हूं और कोई ऑप्टिमाइज़ेशन सक्षम नहीं है।
ने "बाइट% ebp" बनाया था एएसपी 8 बाइट से कम किया? प्लस रेट 8 बाइट्स, पहले से ही 16-बाइट के साथ गठबंधन किया जाना चाहिए। खुराक संकलक को इस अतिरिक्त 8 बाइट की आवश्यकता क्यों है? –
ओह, मुझे मिल गया। यह एक 32-बिट machince है। माफ़ कीजिये।यह 4 बाइट + ईबीपी 4 बाइट + गठबंधन 8 बाइट + बफर 16 –
होना चाहिए i386 और x86-64 सिस्टम वी एबीआई के वर्तमान संस्करणों में 16 बी स्टैक संरेखण ('कॉल' निर्देश से पहले) की आवश्यकता होती है, इसलिए कार्यों को मानने की अनुमति है उस। ऐतिहासिक रूप से, i386 एबीआई को केवल 4 बी संरेखण की आवश्यकता थी। (एबीआई दस्तावेज़ों के लिंक के लिए https://stackoverflow.com/tags/x86/info देखें)। जीसीसी भी पत्ती कार्यों में भी '% esp' गठबंधन रखता है (जो अन्य कार्यों को कॉल नहीं करता है), जब इसे किसी भी स्थान को आरक्षित करना होता है, और यही वह हो रहा है। –