2012-01-14 11 views
7

मैं कुलपति ++ 2010 संकलक के साथ नीचे कोड संकलित:एक पुश/पॉप निर्देश जोड़ी उत्पन्न करने वाला संकलक क्यों है?

__declspec(dllexport) 
unsigned int __cdecl __mm_getcsr(void) { return _mm_getcsr(); } 

और उत्पन्न कोड था:

push ECX 
    stmxcsr [ESP] 
    mov EAX, [ESP] 
pop ECX 
retn 

क्यों दिया गया push ECX/pop ECX अनुदेश जोड़ी है?

उत्तर

10

कंपाइलर एमएक्ससीएसआर को स्टोर करने के लिए स्टैक पर कमरा बना रहा है। यह भी उतना ही अच्छी तरह से इस किया जा सकता है:

sub esp,4 
stmxcsr [ESP] 
mov EAX, [ESP] 
add esp,4 
retn 

लेकिन "धक्का ECX" शायद कम या तेज है।

+0

डी ओह ... पूरी तरह से याद किया गया। :) बहुत बहुत धन्यवाद। – Mehrdad

+0

और यह पॉप को कैसे समझाता है? – CodesInChaos

+0

@CodeInChaos: स्टैक पॉइंटर को पुनर्स्थापित करना? – Mehrdad

3

यहां धक्का अस्थायी स्थान के 4 बाइट आवंटित करने के लिए उपयोग किया जाता है। [ESP] आमतौर पर धक्का वापसी पता इंगित करेगा, जिसे हम ओवरराइट नहीं कर सकते हैं।

ECX यहां अधिलेखित किया जाएगा, हालांकि, ECX संभवतः एबीआई में एक अस्थिर रजिस्टर है जिसे आप लक्षित कर रहे हैं, इसलिए कार्यों को ECX को संरक्षित करने की आवश्यकता नहीं है।

यहां पुश/पॉप का उपयोग करने का कारण एक स्थान (और संभवतः गति) अनुकूलन है।

0

यह एक टॉप-ऑफ-स्टैक एंट्री बनाता है जो ईएसपी अब stmxcsr निर्देश के लिए लक्ष्य के रूप में संदर्भित करता है। फिर परिणाम वापसी के लिए ईएक्स में संग्रहीत किया जाता है।