Enter
एक स्टैक फ्रेम बनाता है, और leave
एक स्टैक फ्रेम को नष्ट कर देता है। enter
पर 0,0
मानकों के साथ, वे मूल रूप से के बराबर कर रहे हैं:
; enter
push ebp
mov ebp, esp
; leave
mov esp, ebp
pop ebp
हालांकि यह कोड आप पोस्ट में इस्तेमाल नहीं कर रहा है, enter
थोड़ा सरल धक्का/mov ऊपर दिखाए गए संयोजन की तुलना में अधिक कर का समर्थन करता है। enter
का पहला पैरामीटर स्थानीय चर के लिए आवंटित करने के लिए पर्याप्त मात्रा निर्दिष्ट करता है।
push ebp
mov ebp, esp
sub esp, 5
Enter
भी पास्कल जैसी भाषाओं नेस्टेड कार्य/प्रक्रियाओं का उपयोग कर सकते है कि समर्थन करता है: उदाहरण के लिए, enter 5, 0
मोटे तौर पर के बराबर है
procedure X;
procedure Y;
begin
{ ... }
end
begin
{ ... }
end
इस तरह के मामले में, Y
न केवल की पहुंच है इसके अपने स्थानीय चर, लेकिन सभी चर के लिए स्थानीय X
पर भी। इन्हें मनमानी गहराई के लिए घोंसला दिया जा सकता है, इसलिए आपके पास Z
Y
के अंदर हो सकता है जिसके पास अपने स्थानीय चर, और Y
के चर और X
के चर शामिल थे। enter
को दूसरा पैरामीटर नेस्टिंग गहराई निर्दिष्ट करता है, तो X
का उपयोग enter Sx, 0
, Y
enter Sy, 1
का प्रयोग करेंगे होगा और Z
enter Sz, 2
का प्रयोग करेंगे (जहां Sx
, Sy
और Sz
क्रमशः X
, Y
और Z
को स्थानीय चर के आकार को दर्शाता है)।
यह Z
Y
और X
पर स्थानीय चर के उपयोग के लिए स्टैक फ्रेम की एक श्रृंखला बनाएगा, और इसी तरह। यदि कार्य रिकर्सिव हैं, तो यह काफी गैर-तुच्छ हो जाता है, इसलिए Z
का आविष्कार केवल दो सबसे हालिया ढेर फ्रेमों तक ढेर नहीं चला सकता है - इसे अपने पिछले इनवॉशंस से स्टैक फ्रेम में छोड़ने की ज़रूरत है, और सीधे जाएं वापस लेक्सिकल पैरेंट फ़ंक्शन/प्रक्रिया के लिए फ़्रेम ढेर करने के लिए, जो रिकर्सन के मामले में अपने कॉलर से अलग है।
यह जटिलता भी है क्योंकि सी और सी ++ नेस्टेड कार्यों को प्रतिबंधित करते हैं। प्रवेश/छुट्टी की उपस्थिति को देखते हुए, वे इंटेल प्रोसेसर पर समर्थन करने के लिए काफी आसान हैं, लेकिन ऐसे कई प्रोसेसर पर काफी कठिन हो सकते हैं जिनमें ऐसे प्रत्यक्ष समर्थन की कमी है।
यह कम से कम एक दूसरे को समझाने में मदद करता है ...enter
की सुविधा - यहां उपयोग किए जाने वाले मामूली मामले के लिए (यानी, enter 0, 0
) यह push
/mov
का उपयोग कर समतुल्य से थोड़ा धीमा है।
नहीं hla ...; ( – BlackBear
[यह] (http://x86.renejeschke.de/html/file_module_x86_id_154.html) और [यह] (http://x86.renejeschke.de/html/file_module_x86_id_78.html) और अधिक सही हो सकता है। – lzutao