2012-06-24 14 views
8

मैं स्मृति और ढेर कैसे काम करता है यह समझने के लिए gcc -S के साथ खेल रहा हूं। इन नाटकों के दौरान मुझे कई चीजें अस्पष्ट मिलीं। क्या आप कारणों को समझने में मेरी मदद कर सकते हैं?असेंबलर कोड बनाते समय जीसीसी ऐसा क्यों करता है?

  1. जब फ़ंक्शन को कॉल एक कहा जाता है एक यह mov के बजाय pushesp का उपयोग करता है के लिए बहस करता है। push का उपयोग न करने का क्या फायदा है?

  2. फ़ंक्शन जो अपने स्टैक स्थित तर्कों के साथ काम करता है, उन्हें ebp + (N + offset) (जहां एन रिटर्न पते के लिए आरक्षित आकार है) के रूप में इंगित करता है। मुझे esp - offset देखने की उम्मीद है जो अधिक समझ में आता है। ebp का उपयोग हर जगह मौलिक बिंदु के रूप में करने का कारण क्या है? मुझे पता है कि ये बराबर हैं लेकिन वैसे भी?

  3. main की शुरुआत में यह जादू क्या है? क्यों esp इस तरह से शुरू किया जाना चाहिए?

    and esp,0xfffffff0 
    

धन्यवाद,

+3

यह 3 अलग-अलग प्रश्न हो सकते हैं। वैसे भी, तीसरे बिंदु का जवाब स्टैक संरेखण है। – Mysticial

उत्तर

7

मैं तुम्हें क्योंकि एक 64-बिट वातावरण तर्क रजिस्टरों में पारित कर रहे हैं में एक 32-बिट वातावरण के अंतर्गत काम कर रहे हैं ग्रहण करेगा।

प्रश्न 1

शायद आप एक चल बिन्दु तर्क यहां से गुजर रहे हैं। आप इन्हें सीधे धक्का नहीं दे सकते, क्योंकि 32-बिट रनटाइम में push निर्देश एक समय में 4 बाइट चलाता है ताकि आपको मान तोड़ना पड़े। esp से 8 को घटाना कभी-कभी आसान होता है और वे 8-बाइट क्वाडवर्ड को [esp] में चलाते हैं।

प्रश्न 2

ebp अक्सर 32-बिट कोड में मापदंडों और ढेर फ्रेम में स्थानीय लोगों सूचकांक करने के लिए प्रयोग किया जाता है। यह स्टैक पॉइंटर चाल के रूप में फ्रेम के भीतर ऑफसेट को ठीक करने की अनुमति देता है। उदाहरण के लिए विचार करना

void f(int x) { 
    int a; 
    g(x, 5); 
} 

अब अगर आप केवल esp साथ ढेर फ्रेम सामग्री पहुँचा, तो a[esp] पर है, वापसी पता [esp+4] पर होगा और x[esp+8] पर होगा। अब g पर कॉल करने के लिए कोड उत्पन्न करें। हमें पहले 5 दबाएं और फिर x दबाएं। लेकिन 5 को धक्का देने के बाद, का ऑफसेट esp से बदल गया है! यही कारण है कि ebp का उपयोग किया जाता है। आम तौर पर कार्यों में प्रवेश पर हम इसे बचाने के लिए ebp के पुराने मान को दबाते हैं, फिर espebp पर प्रतिलिपि बनाएँ। अब ebp का उपयोग स्टैक फ्रेम सामग्री तक पहुंचने के लिए किया जा सकता है। जब हम तर्क पारित करने के बीच में होते हैं तो यह हिल नहीं जाएगा।

प्रश्न 3

यह and अनुदेश esp के अंतिम 4 बिट्स बाहर शून्य एक 16-बाइट सीमा के लिए यह संरेखित। चूंकि ढेर नीचे बढ़ता है, यह अच्छा और सुरक्षित है।

+1

क्यू 3: यह पिछले 4 बिट्स – hirschhornsalz

+0

ओरो मेरा धन्यवाद, @drhirsch। बिना सोच के टाइपिंग। भयानक। बहुत बहुत धन्यवाद! संपादित। –

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