2013-03-22 12 views
5

द्वारा हटा दिया एक खाली कार्यक्रमसमारोह प्रस्तावना और उपसंहार जीसीसी अनुकूलन

//demo.c 

int main(void) 
{ 

} 

डिफ़ॉल्ट अनुकूलन पर कार्यक्रम संकलन ले रहा है।

gcc -S demo.c -o dasm.asm 

मैं अब -O2 अनुकूलन पर कार्यक्रम संकलन के रूप में

//Removed labels and directive which are not relevant 

main: 

pushl %ebp     // prologue of main 
movl %esp, %ebp   // prologue of main 
popl %ebp     // epilogue of main 
ret 

विधानसभा उत्पादन मिलता है।

gcc -O2 -S demo.c -o dasm.asm 

मैं अनुकूलित विधानसभा

main: 

rep 
ret 

मिल मेरी प्रारंभिक खोज में, मैंने पाया है कि अनुकूलन झंडा -fomit फ्रेम-सूचक प्रस्तावना और उपसंहार को हटाने के लिए जिम्मेदार था।

मुझे gcc compiler manual में ध्वज के बारे में अधिक जानकारी मिली, लेकिन प्रस्तावना और उपहास को हटाने के लिए मैन्युअल द्वारा दिए गए इस कारण को नीचे नहीं समझा जा सका।

फ़्रेम पॉइंटर को उन कार्यों के लिए रजिस्टर में न रखें जो की आवश्यकता नहीं है।

क्या उपरोक्त कारण डालने का कोई अन्य तरीका है?

"rep" निर्देश का कारण क्या है, -02 अनुकूलन पर दिख रहा है?

मुख्य कार्य क्यों करता है, स्टैक फ्रेम प्रारंभिकता की आवश्यकता नहीं होती है?

यदि फ्रेम सूचक की स्थापना मुख्य कार्य के भीतर से नहीं की जाती है, तो यह काम कौन करता है?

क्या यह ओएस द्वारा किया जाता है या यह हार्डवेयर की कार्यक्षमता है?

+5

'प्रतिनिधि ret' एक उपसर्ग है कि अर्थ विज्ञान में परिवर्तन नहीं करता के साथ एक' ret' है, यह कुछ एएमडी प्रोसेसर खुश (उनमें से कुछ के लिए सीधे कूद के लिए एक दंड है रहता है एक 'ret')। – harold

+0

[जीसीसी फ़ंक्शन प्रस्तावना ओवरहेड से बचें] का संभावित डुप्लिकेट? (Http://stackoverflow.com/questions/5477673/avoiding-gcc-function-prologue-overhead) – mlt

उत्तर

5

कंपाइलर्स स्मार्ट हो रहे हैं, यह पता था कि आपको किसी रजिस्टर में संग्रहीत स्टैक फ्रेम पॉइंटर की आवश्यकता नहीं है क्योंकि जो भी आपने अपने मुख्य() फ़ंक्शन में डाला है, वह स्टैक का उपयोग नहीं करता था।

प्रतिनिधि सेवानिवृत्त के लिए के रूप में:

यहाँ सिद्धांत है। प्रोसेसर अगले कुछ निष्पादित करने के निर्देशों को लाने की कोशिश करता है, ताकि यह डीकोडिंग और उन्हें निष्पादित करने की प्रक्रिया शुरू कर सके। यह कूदने के साथ भी करता है और निर्देशों को वापस करता है, यह अनुमान लगाता है कि कार्यक्रम कहां जाएगा।

क्या एएमडी कहता है कि यदि एक दूरस्थ निर्देश तुरंत सशर्त कूद निर्देश का पालन करता है, तो उनके पूर्वानुमानकर्ता यह नहीं समझ सकते कि अनुदेश निर्देश जारी है। प्री-फ़ेचिंग को वास्तव में निष्पादित होने तक रोकना है, और केवल तभी यह आगे बढ़ने में सक्षम हो जाएगा।

"प्रतिनिधि पुनः" चाल स्पष्ट रूप से समस्या के आसपास काम करती है, और भविष्यवाणियों को अपना काम करने देता है। "प्रतिनिधि" का निर्देश पर कोई प्रभाव नहीं पड़ता है।

स्रोत: कुछ फ़ोरम, इसे खोजने के लिए एक वाक्य google। नोट करने के लिए

एक बात यह है कि कोई प्रस्तावना है सिर्फ इसलिए कि वहाँ यह मतलब नहीं है कोई ढेर है, तो आप अभी भी धक्का और आसानी के साथ पॉप यह है कि अभी जटिल ढेर हेरफेर मुश्किल हो जाएगा है कर सकते हैं।

जिन कार्यों में प्रस्तावना/उपन्यास नहीं है, उन्हें आम तौर पर नग्न कहा जाता है। हैकर्स उन्हें बहुत उपयोग करना पसंद करते हैं क्योंकि जब आप उन्हें jmp करते हैं तो वे ढेर को दूषित नहीं करते हैं, मुझे कबूल करना चाहिए कि मुझे ऑप्टिमाइज़ेशन के बाहर उनके लिए कोई अन्य उपयोग नहीं है। दृश्य स्टूडियो में यह के माध्यम से किया जाता है:

__declspec(naked) 
+0

अब मैंने कोशिश की, मुख्य के अंदर एक चर घोषित किया, और कुछ बयान लिखा जो इसे छेड़छाड़ करता है और प्रिंटफ का उपयोग करता है, अब मुझे प्रस्तावना मिलती है, लेकिन कोई एपिलॉग नहीं (कोई पॉप निर्देश नहीं) –

+0

मुझे लगता है कि मुख्य() फ़ंक्शन को केवल एक की आवश्यकता नहीं है क्योंकि यह सड़क का अंत है। एक समारोह बनाने का प्रयास करें और printf() वहाँ करें। –

+0

ने ऐसा किया, और अभी भी एक पॉपल निर्देश खोजने में असमर्थ, एएसएम डंप –

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