2010-11-08 10 views
5

जब मैं कोड के इस टुकड़े को संकलितजीसीसी हॉटपैचिंग?

unsigned char A[] = {1, 2, 3, 4}; 

unsigned int 
f (unsigned int x) 
{ 
    return A[x]; 
} 

जीसीसी आउटपुट

mov edi, edi 
movzx eax, BYTE PTR A[rdi] 
ret 

एक x86_64 मशीन पर।

सवाल यह है कि: एक एनओपी निर्देश (mov edi, edi) क्यों है?

मैं जीसीसी-4.4.4 का उपयोग कर रहा हूं।

+0

स्वाभाविक रूप से यह कोड को खराब करने के लिए है! –

उत्तर

3

64-बिट मोड में, mov edi, edi नो-ऑप नहीं है। यह क्या करता है rdi के शीर्ष 32 बिट्स 0

यह सामान्य तथ्य का एक विशेष मामला है कि सभी 32-बिट ऑपरेशंस 64-बिट मोड में गंतव्य रजिस्टर के शीर्ष 32 बिट्स को साफ़ करते हैं। (यह उन्हें एक अपरिवर्तित छोड़ने से अधिक कुशल CPU की अनुमति देता है और शायद यह भी अधिक उपयोगी है।)

+0

ओह .. क्या आप इसके लिए किसी भी स्रोत का हवाला दे सकते हैं? – osgx

+0

उत्तर दिखता है। – osgx

+1

ठीक है। मुझे लगता है कि आप इसके बारे में सही हैं। आरडीआई के शीर्ष को साफ़ करने के लिए यह सिर्फ एक शानदार तरीका है। प्रश्न को दोबारा पढ़ने के बाद मैं समझता हूं कि ओपी यह नहीं पूछ रहा है "यह हॉटपैच करने योग्य फ़ंक्शन 'mov edi, edi'' के साथ क्यों शुरू होता है, लेकिन ऐसा कुछ" यह x86-64 असेंबली कोड क्यों हॉटस्पैच करने योग्य फ़ंक्शन की तरह दिखता है। " इसके अलावा कोड 'ms_hook_prologue' attriubte भी निर्दिष्ट नहीं करता है, जीसीसी की नवीनतम रिलीज x86-64 के लिए ms_hook_prologue का समर्थन नहीं करती है और ऐसा लगता है कि x86-64 पर यह 'leaq [% rsp + 0],% 'mov edi, edi' (http://tinyurl.com/39fye3w) के बजाय आरएसपी' प्रस्तावना। मैं अपना उत्तर –