2010-12-20 9 views
5

जब भी मैं ऑप्टिमाइज़ेशन सक्षम करने के साथ सी या सी ++ कोड संकलित करता हूं, डी जीसीसी 16-बाइट सीमा (आईए -32 पर) के कार्यों को संरेखित करता है। समारोह से कम 16 बाइट्स है, जीसीसी पैड यह कुछ बाइट्स, जिस पर सभी यादृच्छिक होने लगते हैं नहीं है के साथ:जीसीसी फ़ंक्शन पैडिंग मान

19: c3      ret 
1a: 8d b6 00 00 00 00  lea 0x0(%esi),%esi 

यह हमेशा या तो 8d b6 00 00 00 00 ... या 8d 74 26 00 हो रहा है।

क्या कार्य पैडिंग बाइट्स का कोई महत्व है?

+0

मेरी समझ यह है कि जीसीसी फ़ंक्शन संरेखण पैडिंग के लिए 0s का उपयोग करता है, लेकिन जैसा कि मैं आपको ऐसे स्रोत पर इंगित नहीं कर सकता जो शायद बहुत उपयोगी नहीं है ... – William

उत्तर

6

पैडिंग असेंबलर द्वारा बनाई गई है, जीसीसी द्वारा नहीं। यह केवल .align निर्देश (या समतुल्य) देखता है और यह नहीं जानता कि पैड किए जाने की जगह फ़ंक्शन के अंदर है (उदा। लूप संरेखण) या फ़ंक्शंस के बीच, इसलिए इसे किसी प्रकार के NOP एस डालना होगा। आधुनिक x86 असेंबलर सबसे बड़े संभावित NOP ऑपकोड का उपयोग करते हैं, यदि पैडिंग लूप संरेखण के लिए संभव है तो कुछ चक्र जितना संभव हो उतना खर्च करने के इरादे से।

व्यक्तिगत रूप से, मैं अनुकूलन तकनीक के रूप में संरेखण की बेहद संदिग्ध हूं। मैंने इसे कभी भी ज्यादा मदद नहीं देखा है, और यह कुल कोड आकार (और कैश उपयोग) को बढ़ाकर निश्चित रूप से चोट पहुंचा सकता है। यदि आप -Os अनुकूलन स्तर का उपयोग करते हैं, तो यह डिफ़ॉल्ट रूप से बंद है, इसलिए चिंता करने की कोई बात नहीं है। अन्यथा आप उचित -f विकल्पों के साथ सभी संरेखण अक्षम कर सकते हैं।

+0

ऐसा लगता है कि यह सही है। '-S' आउटपुट में पैडिंग नो-ऑप्स नहीं हैं। –

2

अनुदेश lea 0x0(%esi),%esi सिर्फ %esi में %esi में मूल्य लोड करता है - यह कोई आपरेशन (या NOP), जिसका अर्थ है कि यह कोई प्रभाव नहीं पड़ेगा अगर यह मार डाला है।

यह सिर्फ एक ही निर्देश, 6-बाइट एनओपी होता है। 8d 74 26 00 एक ही निर्देश के केवल 4-बाइट एन्कोडिंग है।

+0

लेकिन यह एक पहुंच योग्य निर्देश नहीं है ('ret' के बाद) , क्या यह? –

+0

@ एलेक्स बी: यह सीधे पहुंच योग्य नहीं है (लेकिन इसे कूद दिया जा सकता है)। कार्यों के भीतर निष्पादन योग्य पैडिंग का उत्पादन करने का अक्सर कारण होता है, इसलिए यह संभव है कि जीसीसी केवल कार्यों के अंत के लिए एक ही पैडिंग एल्गोरिदम का उपयोग करे। – caf

1

असेंबलर पहले .align निर्देश देखता है। चूंकि यह नहीं जानता कि यह पता फ़ंक्शन बॉडी के भीतर है या नहीं, यह न्यूल 0x00 बाइट्स आउटपुट नहीं कर सकता है, और NOP s (0x90) उत्पन्न करना होगा।

हालांकि:

lea esi,[esi+0x0] ; does nothing, psuedocode: ESI = ESI + 0 

nop 
nop 
nop 
nop 
nop 
nop 

यदि यह कोड (उदाहरण के लिए, पाश संरेखण के लिए) एक समारोह शरीर में आते थे हुआ की तुलना में कम घड़ी चक्र में निष्पादित करता है, lea संस्करण ज्यादा होगा तेज़, जबकि अभी भी "कुछ नहीं कर रहा है।"

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