2011-12-02 13 views
16

मैं वर्तमान में इंटेल प्रोसेसर के लिए असेंबली सीख रहा हूं। के बाद से ढेर 'नीचे बढ़ता है', हम क्यों किसी विशिष्ट तत्वअसेंबली रजिस्ट्रार एएसपी और ईबीपी

[ebp + 8] ;; This will access the first param 

मैं जानता हम पुराने ईबीपी मूल्य और वापसी पता छोड़ करने के लिए है तक पहुँचने के लिए जोड़ने के लिए करते हैं और यही कारण है कि हम 8 का उपयोग करें (है क्योंकि प्रत्येक 4 बाइट लंबा है)। यह थोड़े अजीब है।

_start: 

;; what's ebp value here ? 

push eax 
push ebx 
call someFunction ;; this will create a stack frame 

+-----------+ 
| param1 | 
+-----------+ 
| param0 | <--- this is [ebp + 8] (assuming mov ebp, esp) 
+-----------+ 
|ret_address| 
+-----------+ 
| ebp | 
+-----------+ <--- esp 

और यह भी जब हम स्थानीय लोगों के लिए स्मृति को आबंटित, हम घटाना करने के लिए है:

इसके अलावा, अगर ईबीपी के लिए esp एक बैकअप प्रतिलिपि है, मुख्य कार्य पूर्व में ईबीपी के मूल्य क्या है ईबीपी से ... कृपया एक गैर-संदिग्ध उत्तर दें। धन्यवाद!

+1

एक मुख्य() फ़ंक्शन नियमित फ़ंक्शन से अलग नहीं है, इसका प्रस्ताव भी है। आपने अपने असेंबली स्निपेट में एक नहीं दिखाया, यकीन नहीं कि क्यों। स्थानीय लोगों के लिए स्थान esp समायोजित करके बनाया गया है, ebp नहीं। –

+0

वही प्रश्न हैं: http://stackoverflow.com/questions/1395591/what-is-exactly-the-base-pointer-and-stack-pointer-to-what-do-theypoint, और अन्य से जुड़े यह – Abyx

उत्तर

2

जैसा कि आपने कहा था, ढेर बढ़ता है। तो, आप स्थानीय लोगों के लिए ढेर को बढ़ाने के लिए घटाते हैं। आप वहां संग्रहीत तत्वों के लिए ढेर में वापस देखने के लिए जोड़ते हैं।

13

%ebp के लिए प्रारंभिक मूल्य आमतौर पर 0 है। यह डिबगर्स को पता है कि बैकट्रैस में लिंक श्रृंखला के बाद कब समाप्त करना है।

आपको संदर्भ बिंदु के रूप में %ebp के बारे में सोचना चाहिए। सुविधा के लिए, यह फ़ंक्शन तर्क और स्थानीय चर के बीच रखा गया है। इस तरह, आप सकारात्मक ऑफसेट के साथ तर्कों का उपयोग करते हैं, और ऋणात्मक ऑफ़सेट वाले चर, इसलिए यह बताना आसान है कि आप चर या तर्क का उपयोग कर रहे हैं या नहीं।

+0

क्यों 0? प्रारंभिक जब सीपीयू चालू है? – Abyx

+0

'% ebp' आमतौर पर लोडर या रनटाइम लाइब्रेरी द्वारा 0 तक प्रारंभ किया जाता है। कभी-कभी औपचारिकता औपचारिक दस्तावेज में निर्दिष्ट होती है (उदाहरण: आईआईआरसी ईएलएफ x86 psaBI इसे निर्दिष्ट करता है)। – ninjalj

+0

क्या लोडर या क्या रनटाइम? यदि आप विशिष्ट ओएस के बारे में बात कर रहे हैं, तो कृपया इसे स्पष्ट रूप से बताएं। मेरे ओएस 'ebp' पर कम से कम उपयोगकर्ता-मोड में 0 तक प्रारंभ नहीं किया गया है। साथ ही, सटीक होने के लिए, नाम 'ebp' है, न कि '% ebp'। '%' रजिस्टर नाम के लिए एक उपसर्ग है। – Abyx

संबंधित मुद्दे