वास्तव में विचित्र gcc quirk। के बाद से अपने एक 100 * 4 सरणीजीसीसी किसी बड़े फंक्शन कॉल के साथ बड़ी सरणी आवंटित करते समय स्टैक पॉइंटर को गलत मान क्यों घटाता है?
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 81 ec 18 01 00 00 sub $0x118,%rsp
b: c7 85 70 fe ff ff 01 movl $0x1,-0x190(%rbp)
12: 00 00 00
15: c9 leaveq
16: c3 retq
ढेर के शीर्ष स्पष्ट रूप से 400,: इस की जाँच करें:
main() { int a[100]; a[0]=1; }
इस विधानसभा पैदा करता है। तो जब यह पहली प्रविष्टि को लिखता है, तो यह आरबीपी - 400 (लाइन 'बी') करता है। अच्छा। लेकिन यह स्टैक (लाइन '4') सूचक से 280 घटाता है? क्या यह सरणी के बीच में इंगित नहीं करता है?
हम बाद में एक समारोह कॉल जोड़ते हैं, जीसीसी सही काम करता है:
b() {}
main() { int a[100]; a[0]=1; b(); }
इस विधानसभा का उत्पादन:, यह ठीक से घटा 400
0000000000000000 <b>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: c9 leaveq
5: c3 retq
0000000000000006 <main>:
6: 55 push %rbp
7: 48 89 e5 mov %rsp,%rbp
a: 48 81 ec 90 01 00 00 sub $0x190,%rsp
11: c7 85 70 fe ff ff 01 movl $0x1,-0x190(%rbp)
18: 00 00 00
1b: b8 00 00 00 00 mov $0x0,%eax
20: e8 00 00 00 00 callq 25 <main+0x1f>
25: c9 leaveq
26: c3 retq
यहाँ (लाइन 'एक')।
जब आप फ़ंक्शन कॉल जोड़ते हैं तो परिवर्तन क्यों होता है? क्या जीसीसी सिर्फ आलसी है, और यह सही नहीं करता है क्योंकि इससे कोई फर्क नहीं पड़ता? क्या हो रहा है? जाहिर है यह केवल तब होता है जब x86_64 के लिए संकलन होता है, लेकिन सादा x86 के लिए नहीं। क्या x86_64 के "रेडज़ोन" के साथ ऐसा कुछ अजीब है? क्या हो रहा है ठीक है?
आप कोड के बारे में चिंतित क्यों हैं जिसका कोई प्रभाव नहीं है, जैसा कि कोड से स्पष्ट है !? साथ ही, आपके (दूसरे) उदाहरण को कुछ कॉलिंग सम्मेलन का उपयोग करना चाहिए जहां स्टैक शामिल है, क्योंकि आपके उदाहरण में कोई पैरामीटर शामिल नहीं है (स्टैक पर)। साइड-नोट: मुझे एटी एंड टी असेंबली से नफरत है :) – 0xC0000022L
शायद जिज्ञासा के कारण? या यह आपकी पुस्तक में वैध कारण नहीं है? बीटीडब्लू, मुझे – hirschhornsalz