दिलचस्प पोस्ट
डबल कोट्स को "" के अंदर कैसे मुद्रित करें? जावा एंड्रॉइड से बाह्य आईपी को कैसे पिंग करें फिल स्टर्जन की कोडिग्निटर रिसेटर्स और बैकबोन.जेएस में HTTP विकल्प त्रुटि सी में मुख्य करने के लिए तर्क क्या करता है -> पायथन फ़ंक्शन परिभाषाओं में क्या मतलब है? jquery nth child वर्तमान में दिखाई दे रहा है कैसे एक बाइट से MimeType निकालें घुमाव पूर्णांक विभाजन (छंटनी के बजाय) क्या मतलब है? (जावास्क्रिप्ट) टेम्पलेट कैशे कैसे साफ़ करें क्या मैं अपने आवेदन में 'होम' बटन को ओवरराइड कर सकता हूं? जावा में एकत्रीकरण और संरचना के बीच कार्यान्वयन अंतर सी स्ट्रिंग की तुलना में, सी # जावास्क्रिप्ट में 302 फाउंडिंग को पकड़ना क्या ब्राउज़रों 'एफ 5' और 'Ctrl + F5' रिफ्रेश उत्पन्न करते हैं?

वास्तव में आधार सूचक और स्टैक पॉइंटर क्या है? वे क्या इंगित करते हैं?

विकिपीडिया से आने वाले इस उदाहरण का उपयोग करते हुए, जिसमें DrawSquare () DrawLine () कॉल करता है,

वैकल्पिक शब्द

(ध्यान दें कि इस आरेख में शीर्ष पर नीचे और कम पते पर उच्च पते हैं।)

क्या कोई मुझे समझा सकता है कि इस संदर्भ में ebp और esp क्या है?

मैं जो देखता हूं, मैं कहूंगा कि स्टैक पॉइंटर हमेशा स्टैक के शीर्ष पर, और वर्तमान फ़ंक्शन की शुरुआत करने के लिए आधार सूचक? और क्या?


संपादित करें: मेरा मतलब है यह विंडोज़ कार्यक्रमों के संदर्भ में है

eip करें 2: और eip कैसे काम करती है, भी?

edit3: मेरे पास MSVC ++ से निम्न कोड है:

 var_C= dword ptr -0Ch var_8= dword ptr -8 var_4= dword ptr -4 hInstance= dword ptr 8 hPrevInstance= dword ptr 0Ch lpCmdLine= dword ptr 10h nShowCmd= dword ptr 14h 

उनमें से सभी को पासवर्ड लगता है, इस प्रकार प्रत्येक 4 बाइट्स लेते हैं। इसलिए मैं देख सकता हूं कि एचएएनएस्टेंस से लेकर 4 बाइट्स तक 4 बाइट्स का अंतर है। वे क्या हैं? मुझे लगता है कि यह वापसी का पता है, जैसा कि विकिपीडिया की तस्वीर में देखा जा सकता है?


(संपादक का नोट: माइकल के जवाब से एक लंबी बोली हटाई गई, जो सवाल में शामिल नहीं है, लेकिन एक फॉलो-अप प्रश्न संपादित किया गया था):

इसका कारण यह है कि फ़ंक्शन कॉल का प्रवाह है:

 * Push parameters (hInstance, etc.) * Call function, which pushes return address * Push ebp * Allocate space for locals 

मेरा प्रश्न (आखिरी, मुझे आशा है!) अब यह है कि, तत्पश्चात से क्या होता है मैं फ़ंक्शन के तर्कों को पॉप कर देता हूं, जो मुझे कार्यक्रम के अंत तक कॉल करना चाहता हूं? मैं जानना चाहता हूं कि उन क्षणों के दौरान ईबीपी, एएसपी विकसित होता है (मुझे पहले से ही पता था कि प्रोलॉग कैसे काम करता है, मैं सिर्फ यह जानना चाहता हूं कि मैं स्टैक पर तर्कों को आगे बढ़ाए जाने के बाद क्या हो रहा है और प्रायोगी होने से पहले)।

वेब के समाधान से एकत्रित समाधान "वास्तव में आधार सूचक और स्टैक पॉइंटर क्या है? वे क्या इंगित करते हैं?"

esp है जैसा कि आप कहते हैं, ढेर के ऊपर।

ebp आमतौर पर समारोह की शुरुआत में esp करने के लिए सेट है फ़ंक्शन पैरामीटर और स्थानीय वेरिएबल्स को क्रमशः जोड़ने और घटाकर, ebp से एक ऑफसेट ऑफसेट द्वारा एक्सेस किया जाता है। सभी x86 कॉलिंग सम्मेलनों ebp को फ़ंक्शन कॉल्स में संरक्षित होने के रूप में परिभाषित करते हैं। ebp वास्तव में पिछले फ्रेम के बेस पॉइंटर को इंगित करता है, जो डिबगर में चलने वाले स्टैक को सक्षम बनाता है और स्थानीय फ्रेम काम करने के लिए अन्य फ्रेम को देखता है।

अधिकांश फ़ंक्शंस प्रोलोज़ज़ कुछ ऐसा दिखते हैं:

 push ebp ; Preserve current frame pointer mov ebp, esp ; Create new frame pointer pointing to current stack top sub esp, 20 ; allocate 20 bytes worth of locals on stack. 

फिर बाद में फ़ंक्शन में आपके पास कोड हो सकता है (दोनों स्थानीय चर को मानते हुए 4 बाइट्स हैं)

 mov [ebp-4], eax ; Store eax in first local mov ebx, [ebp - 8] ; Load ebx from second local 

एफपीओ या फ़्रेम पॉइंटर चूक अनुकूलन जो आप सक्षम कर सकते हैं वास्तव में इसे खत्म कर देंगे और ebp उपयोग अन्य रजिस्टर के रूप में करें और स्थानीय लोगों को esp सीधे बंद करें, लेकिन यह डीबगिंग को थोड़ा अधिक मुश्किल बना देता है क्योंकि डीबगर अब पहले फ़ंक्शन के स्टैक फ़्रेमों तक सीधे पहुंच नहीं सकता है कहता है।

संपादित करें:

आपके अद्यतित प्रश्न के लिए, स्टैक में दो प्रविष्टियों को याद किया गया है:

 var_C = dword ptr -0Ch var_8 = dword ptr -8 var_4 = dword ptr -4 *savedFramePointer = dword ptr 0* *return address = dword ptr 4* hInstance = dword ptr 8h PrevInstance = dword ptr 0C hlpCmdLine = dword ptr 10h nShowCmd = dword ptr 14h 

इसका कारण यह है कि फ़ंक्शन कॉल का प्रवाह है:

  • पुश पैरामीटर ( hInstance , आदि)
  • कॉल फ़ंक्शन, जो रिटर्न पता धक्का देता है
  • ebp
  • स्थानीय लोगों के लिए स्थान आवंटित करें

ईएसपी वर्तमान स्टैक पॉइंटर है, जो किसी शब्द या पते को धक्का देकर या स्टैक पर बंद / बंद करने पर किसी भी समय बदलेगा। ईबीपी एक अधिक सुविधाजनक तरीके से संकलक के लिए एक फ़ंक्शन के मापदंडों और ईएसपी सीधा उपयोग से स्थानीय चर का ट्रैक रखने के लिए है।

आम तौर पर (और यह संकलक से कंपाइलर के लिए भिन्न हो सकता है), सभी कार्यों को बुलाया जाने वाले फ़ंक्शन को स्टैक पर धकेल दिया जाता है (आमतौर पर रिवर्स ऑर्डर में वे फ़ंक्शन प्रोटोटाइप में घोषित किए जाते हैं, लेकिन यह भिन्न होता है)। फिर फ़ंक्शन को बुलाया जाता है, जो स्टैक पर रिटर्न एड्रेस (ईआईपी) धक्का देता है।

समारोह में प्रवेश के बाद, पुरानी ईबीपी मान स्टैक पर धकेल दिया जाता है और ईबीपी ईएसपी के मूल्य पर सेट है। फिर ईएसपी कम हो गया है (क्योंकि स्टैक स्मृति में नीचे की ओर बढ़ता है) फ़ंक्शन के स्थानीय चर और अस्थायी के लिए स्थान आवंटित करने के लिए। उस बिंदु से, फ़ंक्शन के निष्पादन के दौरान, फ़ंक्शन के तर्क ईबीपी से सकारात्मक ऑफसेट पर स्टैक पर स्थित होते हैं (क्योंकि उन्हें फ़ंक्शन कॉल से पहले धकेल दिया गया था), और स्थानीय चर ईबीपी से नकारात्मक ऑफसेट पर स्थित हैं (क्योंकि वे फ़ंक्शन प्रविष्टि के बाद स्टैक पर आवंटित किए गए थे)। यही कारण है कि ईबीपी को फ्रेम पॉइंटर कहा जाता है, क्योंकि यह फ़ंक्शन कॉल फ़्रेम के केंद्र को इंगित करता है

बाहर निकलने पर, सभी फ़ंक्शन को ईएसपी को ईबीपी के मूल्य पर सेट किया जाता है (जो स्टैक से स्थानीय चर को डीलोकेट करता है, और स्टैक के शीर्ष पर एडीपी प्रविष्टि को उजागर करता है), फिर स्टैक से पुराना ईबीपी मान को पॉप कर दें, और फिर फ़ंक्शन देता है (ईआईपी में वापसी का पता लगाना)।

आपके पास यह सही है स्टैक पॉइंटर स्टैक पर शीर्ष आइटम को इंगित करता है और फ़ंक्शन को कॉल करने से पहले स्टॉक्स के "पिछले" शीर्ष पर बेस पॉइंटर अंक देता है।

जब आप फ़ंक्शन कॉल करते हैं, तो किसी भी स्थानीय चर को स्टैक पर संग्रहीत किया जाएगा और स्टैक पॉइंटर बढ़ेगा। जब आप फ़ंक्शन से वापस आ जाते हैं, तो स्टैक पर सभी स्थानीय वेरिएबल गुंजाइश से बाहर जाते हैं। आप स्टैक पॉइंटर को बेस पॉइंटर पर वापस सेट करते हैं (जो फ़ंक्शन कॉल से पहले "पिछले" शीर्ष था)।

स्मृति आवंटन करना यह तरीका बहुत , बहुत तेज और कुशल है

सबसे पहले, स्टैक पॉइंटर स्टैक के निचले भाग को इंगित करता है क्योंकि x86 स्टैक उच्च पता मानों से निचले पते के मानों से निर्मित होता है। स्टैक पॉइंटर एक ऐसा बिंदु है, जहां अगले कॉल को पुश (या कॉल) अगले मूल्य को स्थान देगा। यह ऑपरेशन सी / सी ++ कथन के बराबर है:

  // push eax --*esp = eax // pop eax eax = *esp++; // a function call, in this case, the caller must clean up the function parameters move eax,some value push eax call some address // this pushes the next value of the instruction pointer onto the // stack and changes the instruction pointer to "some address" add esp,4 // remove eax from the stack // a function push ebp // save the old stack frame move ebp, esp ... // do stuff pop ebp // restore the old stack frame ret 

आधार सूचक वर्तमान फ्रेम के ऊपर है ईबीपी आमतौर पर आपके रिटर्न पते को इंगित करता है। ईबप + 4 अंक आपके फ़ंक्शन के पहले पैरामीटर (या एक क्लास विधि का यह मान)। आपके फ़ंक्शन के पहले स्थानीय वैरिएबल के लिए ईबीपी -4 अंक, आमतौर पर ईबीपी का पुराना मूल्य ताकि आप पहले फ्रेम पॉइंटर को पुनर्स्थापित कर सकें।

संपादित करें: एक बेहतर वर्णन के लिए, x86 विस्मयादिबोधक के बारे में एक्स 86 विधानसभा के बारे में एक्सएस्साइजैक्शन / फ़ंक्शंस और स्टैक फ़्रेम देखें । मैं कुछ जानकारी जोड़ने की कोशिश करता हूं जो आपको विज़ुअल स्टूडियो का उपयोग करने में दिलचस्पी ले सकती है।

कॉलर ईबीपी को पहले स्थानीय वैरिएबल के रूप में भंडारित करना एक मानक स्टैक फ्रेम कहा जाता है, और इसका उपयोग विंडोज़ के लगभग सभी कॉलिंग सम्मेलनों के लिए किया जा सकता है। मतभेद मौजूद हैं कि क्या कॉलर या कैली पास किए गए पैरामीटर को डीलोकेट करता है, और कौन से पैरामीटर रजिस्टरों में पास किए जाते हैं, लेकिन ये मानक स्टैक फ्रेम समस्या के लिए ऑर्थोगोनल हैं।

विंडोज प्रोग्राम्स के बारे में बोलते हुए, शायद आप शायद अपने सी + + कोड को संकलित करने के लिए विजुअल स्टूडियो का इस्तेमाल कर सकें। ध्यान रखें कि माइक्रोसॉफ्ट फ़्रैरपॉन्टर ऑप्शन नामक एक अनुकूलन का उपयोग करता है, जो निष्पादन योग्य के लिए डीबीजीएलपी पुस्तकालय और पीडीबी फ़ाइल का इस्तेमाल किए बिना स्टैक पर चलना लगभग असंभव बना देता है।

यह फ़्रेम पॉइंटर रिकमेणिंग का मतलब है कि कंपाइलर पुराने ईबीपी को एक मानक स्थान पर संग्रहीत नहीं करता है और कुछ अन्य के लिए ईबीपी रजिस्टर का उपयोग करता है, इसलिए आपके पास कॉलर ईआईटी को बिना किसी फ़ंक्शन के लिए कितना स्थान की आवश्यकता है, यह जानने के लिए कठिन समय है। बेशक माइक्रोसॉफ्ट एक एपीआई प्रदान करता है जो आपको इस मामले में भी स्टैक-वॉक करने की अनुमति देता है, लेकिन पीडीबी फाइलों में प्रतीक तालिका डेटाबेस की तलाश में कुछ उपयोग मामलों के लिए बहुत अधिक समय लगता है।

अपने संकलन इकाइयों में एफपीओ से बचने के लिए, आपको अपने परियोजनाओं में / O2 का उपयोग करने से बचने या सी + + संकलन झंडे को स्पष्ट रूप से जोड़ने / ओह करने की आवश्यकता है। आप शायद सी या सी + + रनटाइम के खिलाफ लिंक करते हैं, जो कि रिलीज़ कॉन्फ़िगरेशन में एफपीओ का उपयोग करता है, इसलिए आपको डैग्लिप डीएलएल के बिना ढेर चलने के लिए कठिन समय होगा।

लंबे समय से मैंने विधानसभा प्रोग्रामिंग कर ली है, लेकिन यह लिंक उपयोगी हो सकता है …

प्रोसेसर के पास रजिस्टरों का एक संग्रह होता है जो डेटा को स्टोर करने के लिए उपयोग किया जाता है। इनमें से कुछ प्रत्यक्ष मूल्य हैं जबकि अन्य रैम के अंदर एक क्षेत्र की ओर इशारा करते हैं। रजिस्टरों को विशिष्ट विशिष्ट कार्यों के लिए इस्तेमाल किया जाता है और विधानसभा में प्रत्येक ऑपरैंड विशिष्ट रजिस्टरों में कुछ निश्चित डेटा की आवश्यकता होगी।

स्टैक पॉइंटर का ज्यादातर उपयोग तब होता है जब आप अन्य प्रक्रियाओं को कॉल करते हैं आधुनिक कम्पाइलर के साथ, आंकड़ों का एक गुच्छा स्टैक्स पर पहले फेंक दिया जाएगा, इसके बाद रिटर्न पता होगा ताकि सिस्टम को पता चल जाए कि वापसी करने के लिए कहा जाने के बाद कहां लौटाया जाए। स्टैक पॉइंटर अगले स्थान पर इंगित करेगा जहां नए डेटा को ढेर पर धकेल दिया जा सकता है, जहां तक ​​इसे वापस फिर से पॉप नहीं किया जाएगा।

बेस रजिस्टरों या सेगमेंट रजिस्टरों की संख्या केवल बड़ी मात्रा में डेटा के पता स्थान पर इंगित करती है। दूसरा रजििज़र के साथ संयुक्त में, बेस पॉइंटर बड़ा ब्लॉकों में स्मृति को विभाजित करेगा, जबकि दूसरे रजिस्टर इस ब्लॉक के भीतर किसी वस्तु पर इंगित करेगा। आंकड़ों के ब्लॉक के आधार के लिए आधार बिंदु

ध्यान रखें कि विधानसभा बहुत सीपीयू विशिष्ट है मैंने जिस पृष्ठ से लिंक किया है, वह विभिन्न प्रकार के सीपीयू के बारे में जानकारी प्रदान करता है I

esp "विस्तारित स्टैक पॉइंटर" ….. "कुछ बेस पॉइंटर" के लिए ईबीपी और "कुछ निर्देश पॉइंटर" के लिए ईपीपी …… स्टैक पॉइंटर स्टैक सेगमेंट के ऑफसेट एड्रेस को इंगित करता है । बेस पॉइंटर अतिरिक्त सेगमेंट के ऑफसेट एड्रेस को इंगित करता है। निर्देश पॉइंटर कोड सेगमेंट के ऑफसेट एड्रेस को इंगित करता है अब, इस सेगमेंट के बारे में … वे प्रोसेसर स्मृति क्षेत्र के छोटे 64KB डिवीजन हैं … इस प्रक्रिया को मेमोरी सेगमेंटेशन के रूप में जाना जाता है। मुझे उम्मीद है कि इस पोस्ट में मददगार थे।

हाँ संपादित करें , यह ज्यादातर गलत है किसी को भी दिलचस्पी है अगर यह पूरी तरह से अलग कुछ का वर्णन करता है 🙂

हां, स्टैक पॉइंटर स्टैक के शीर्ष पर इंगित करता है (चाहे वह पहले खाली स्टैक स्थान या अंतिम पूर्ण एक है जो मुझे अनिश्चित है)। बुनियादी सूचक को निष्पादित किया जा रहा है कि निर्देश के स्मृति स्थान को इंगित करता है। यह opcodes के स्तर पर है – सबसे बुनियादी निर्देश जो आप कंप्यूटर पर प्राप्त कर सकते हैं। प्रत्येक opcode और इसके पैरामीटर स्मृति स्थान में संग्रहीत है। एक सी या सी + + या सी # लाइन एक opcode में अनुवाद किया जा सकता है, या दो या अधिक का अनुक्रम कितना जटिल है, इसके आधार पर। ये कार्यक्रम मेमोरी में क्रमिक रूप से लिखे गए हैं और क्रियान्वित किये गये हैं। सामान्य परिस्थितियों में आधार सूचक एक निर्देश बढ़ता है। प्रोग्राम नियंत्रण (जीओटीओ, आईएफ, आदि) के लिए यह कई गुना वृद्धि हो सकती है या सिर्फ अगले स्मृति पते के साथ बदल दी गई है

इस संदर्भ में, कार्यों को एक निश्चित पते पर प्रोग्राम मेमोरी में संग्रहीत किया जाता है। जब फ़ंक्शन कहा जाता है, तो कुछ जानकारी स्टैक पर धकेलती है जिससे प्रोग्राम को यह पता चलता है कि फ़ंक्शन को फ़ंक्शन के साथ ही फ़ंक्शन के पैरामीटर से कहा गया था, फिर प्रोग्राम मेमोरी में फ़ंक्शन के पते को धक्का दिया जाता है आधार सूचक अगले घड़ी चक्र पर कंप्यूटर उस मेमोरी पते से निर्देशों को निष्पादित करना शुरू करता है। फिर कुछ बिंदु पर यह उस स्थान के बाद मेमोरी स्थान पर लौटाएगा जो फ़ंक्शन को बुलाया और वहां से जारी रहे।