वहाँ बाहर है कि यह समझाने संसाधनों की बहुत सारी हैं:
कुछ नाम हैं।
मूल रूप से, के रूप में आप कुछ हद तक वर्णन किया, "ढेर" कई उद्देश्यों के लिए एक कार्यक्रम के क्रियान्वयन में कार्य करता है:
- जहां पर लौटने के लिए का ट्रैक रखते हुए, जब एक समारोह
- स्थानीय चर का भंडारण बुला फ़ंक्शन कॉल के संदर्भ में
- कॉलिंग फ़ंक्शन से कॉलली तक तर्क पास करना।
प्रोजेज एक समारोह की शुरुआत में होता है। इसकी ज़िम्मेदारी बुलाए गए फ़ंक्शन के स्टैक फ्रेम सेट अप करना है। Epilog सटीक विपरीत है: यह एक समारोह में आखिरी होता है, और इसका उद्देश्य कॉलिंग (पैरेंट) फ़ंक्शन के ढेर फ्रेम को पुनर्स्थापित करना है।
आईए -32 (x86) cdecl में, ebp
रजिस्टर फ़ंक्शन के स्टैक फ्रेम को ट्रैक रखने के लिए भाषा द्वारा उपयोग किया जाता है। esp
रजिस्टर प्रोसेसर द्वारा स्टैक पर सबसे हालिया जोड़े (शीर्ष मूल्य) को इंगित करने के लिए उपयोग किया जाता है।
call
निर्देश दो चीजें करता है: सबसे पहले यह वापसी पते को ढेर पर धक्का देता है, फिर यह फ़ंक्शन पर जा रहा है। call
के बाद तुरंत, esp
स्टैक पर वापसी पते पर इंगित करता है।
तो प्रस्तावना निष्पादित होने
push ebp ; Save the stack-frame base pointer (of the calling function).
mov ebp, esp ; Set the stack-frame base pointer to be the current
; location on the stack.
sub esp, N ; Grow the stack by N bytes to reserve space for local variables
इस बिंदु पर, हमने:
...
ebp + 4: Return address
ebp + 0: Calling function's old ebp value
ebp - 4: (local variables)
...
उपसंहार:
mov esp, ebp ; Put the stack pointer back where it was when this function
; was called.
pop ebp ; Restore the calling function's stack frame.
ret ; Return to the calling function.
स्रोत
2013-02-08 03:56:31
आप कंपेलरों और कोड पीढ़ी पर सामग्री की खोज कर सकते हैं। –