2010-04-06 17 views
11

मुझे यह जानने के लिए आया है कि आप इंटेल पेंटियम के ढेर पर सीधे बाइट नहीं दबा सकते हैं, क्या कोई मुझे यह समझा सकता है?पेंटियम आईए -32 पर एक बाइट पर बाइट को धक्का देना क्यों संभव नहीं है?

कारण मुझे दिया गया कारण यह है कि esp रजिस्टर शब्द-पता योग्य (या, यह हमारे मॉडल में धारणा है) और यह एक "यहां तक ​​कि पता" होना चाहिए। मुझे लगता है कि कुछ 32-बिट बाइनरी संख्या के मूल्य को कम करने के लिए रजिस्टर के संरेखण के साथ गड़बड़ नहीं होगी, लेकिन स्पष्ट रूप से मैं पर्याप्त समझ में नहीं आता।

मैंने कुछ NASM परीक्षणों की कोशिश की है और आते हैं कि यदि मैं एक चर (काइट डीबी 123) घोषित करता हूं और इसे स्टैक पर दबाता हूं, तो एएसपी 4 से घट जाती है (यह दर्शाती है कि यह 32-बिट्स को धक्का दे रहा है?)।

test.asm:: 10: त्रुटि: असमर्थित गैर 32-बिट ELF स्थानांतरण

किसी के शब्दों लेकिन, "धक्का बाइट काटने" (चर नाम की मेरी पसंद के लिए खेद है) एक प्रकार त्रुटि में परिणाम होगा इस परेशान समय के दौरान ज्ञान की सराहना की जाएगी। मैं पहले साल के स्नातक हूं इसलिए इनमें से किसी भी में मेरी नैतिकता के लिए खेद है।

उत्तर

4

इसका कैसे ढेर बनाया गया था के आधार पर:

The address-size attribute of the stack segment determines the stack pointer size (16, 32 or 64 bits). The operand-size attribute of the current code segment determines the amount the stack pointer is decremented (2, 4 or 8 bytes).

In non-64-bit modes: if the address-size and operand-size attributes are 32, the 32-bit ESP register (stack pointer) is decremented by 4. If both attributes are 16, the 16-bit SP register (stack pointer) is decremented by 2.

स्रोत: http://www.intel.com/Assets/PDF/manual/253667.pdf

स्नातकोत्तर। 4-320 वॉल्यूम 2 बी

संपादित

बस भी है कि एक दिलचस्प पढ़ने के मैनुअल में ढेर पर अनुभाग है बाहर बिंदु करना चाहता था, यह आगे एक ढेर सेगमेंट का निर्माण की व्याख्या करेगा।

http://www.intel.com/Assets/PDF/manual/253665.pdf

अध्याय 6.2

+0

बहुत जानकारीपूर्ण, लेकिन दुर्भाग्यवश अभी भी ऊपर है जो मैं अपने वर्तमान ज्ञान के साथ समझ सकता हूं। –

+0

@ टिम - समझने योग्य। शायद अभी भी एक त्वरित पढ़ने लायक है। –

+0

रुको, रुको। प्रत्येक मेमोरी लोकेशन 32-बिट चौड़ा है, इसलिए यदि आप कोई मान दबाते हैं, तो यह 4 बाइट्स द्वारा स्टैक को कम करेगा, क्योंकि 4 * 8 32-बिट्स है, और यदि यह 2 से कम हो जाता है, तो यह कोशिश करेगा और एक असाइनमेंट करेगा पढ़ें, ब्रह्मांड को imploding? क्या यह सही है? यदि ऐसा है, तो आप अंक प्राप्त करते हैं, कि पीडीएफ भयानक था (दूसरा एक)। –

0

स्टैक पॉइंटर होना चाहिए (कुछ इष्टतम कारणों के लिए) 4 बी संरेखित -> इसे चार से विभाजित किया जाना चाहिए (और इसलिए, अंतिम 2 बिट शून्य है)।

+0

इस मतलब करता है, Yully का जवाब नीचे से ऊपर यह बताते हैं। वैसे भी धन्यवाद :) –

8

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

+0

बिल्कुल सही, धन्यवाद :) –

0

जो आप करना चाहते हैं वह प्रत्येक 32-बिट मेमोरी लोकेशन के माध्यम से घूमने के लिए बिट रोटेशन ऑपोड का उपयोग करता है, जब तक कि आप शुरुआती बिट पोजिशन पर वापस घुमाएंगे, तब तक 8 बिट्स को रजिस्टर में रखें। अब आपके 32 बिट रजिस्टर में आपके पास 4 8-बिट मात्राएं होंगी। अब उस ढेर पर धक्का दें और आप कर चुके हैं।

+0

क्षमा करें, यह मेरे लिए बहुत समझ में नहीं आता है। –

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