lea ecx,[esp+0x4] ; I assume this is for getting the adress of the first argument of the main...why ?
and esp,0xfffffff0 ; ??? is the compiler trying to align the stack pointer on 16 bytes ???
push DWORD PTR [ecx-0x4] ; I understand the assembler is pushing the return adress....why ?
push ebp
mov ebp,esp
push ecx ;why is ecx pushed too ??
यहां तक कि यदि हर निर्देश मनमाने ढंग से गठित ऑपरेंड के बावजूद गति गति के साथ पूरी तरह से काम करता है, तो संरेखण अभी भी प्रदर्शन में वृद्धि करेगा। एक 16-बाइट मात्रा का संदर्भ देने वाले लूप की कल्पना करें जो केवल दो कैश लाइनों को ओवरलैप करता है।अब, कैश में उस छोटे wchar को लोड करने के लिए, दो पूरी कैश लाइनों को बेदखल कर दिया जाना चाहिए, और यदि आपको उसी लूप में उनकी आवश्यकता है तो क्या होगा? कैश रैम की तुलना में बहुत तेज़ है कि कैश प्रदर्शन हमेशा महत्वपूर्ण होता है।
इसके अलावा, आमतौर पर रजिस्टरों में misaligned ऑपरेंड को स्थानांतरित करने के लिए एक गति दंड है। यह देखते हुए कि स्टैक को वास्तविकता दी जा रही है, हम स्वाभाविक रूप से पैरामीटर के लिए स्टैक फ्रेम को पार करने और लौटने के लिए पुरानी संरेखण को सहेजना चाहते हैं।
ecx एक अस्थायी रजिस्टर है इसलिए इसे सहेजा जाना है। इसके अलावा, ऑप्टिमाइज़ेशन स्तर के आधार पर, कुछ फ्रेम लिंकेज ऑप्स जो प्रोग्राम चलाने के लिए कड़ाई से जरूरी नहीं लगते हैं, वे फ्रेम की ट्रेस-तैयार श्रृंखला सेट अप करने के लिए महत्वपूर्ण हो सकते हैं।
आप किस कंपाइलर का उपयोग कर रहे हैं, और क्या आप पूरी तरह से पृथक मुख्य सबराउटिन प्रदान कर सकते हैं? – Inshallah