2013-04-06 6 views
5

हाय मैं वर्जीनिया विश्वविद्यालय द्वारा x86 पर एक गाइड पढ़ रहा हूं और यह कहता है कि स्टैक को धक्का देना और पॉप करना या तो 4-बाइट डेटा तत्व को ढेर में हटा देता है या जोड़ता है।x86 पुश/पॉप 4 बाइट से कम हो सकता है?

यह सेट 4 बाइट्स क्यों है? क्या यह बदला जा सकता है, क्या आप छोटे डेटा तत्वों को दबाकर स्टैक पर स्मृति को सहेज सकते हैं?

गाइड

यहां पाया जा सकता किसी को भी इसे देखने के लिए चाहता है: http://www.cs.virginia.edu/~evans/cs216/guides/x86.html

+1

वह कथन केवल 32 बिट मोड में लागू होता है, और आप 2-बाइट भी पुश/पॉप कर सकते हैं तत्वों। – harold

उत्तर

7

लघु जवाब: हाँ, 16 या 32 बिट्स। और, x86-64, 64 बिट्स के लिए।

स्टैक के प्राथमिक कारणों को नेस्टेड फ़ंक्शन कॉल से वापस लौटना और रजिस्टर मानों को सहेजना/पुनर्स्थापित करना है। यह आमतौर पर पैरामीटर पास करने और फ़ंक्शन परिणामों को वापस करने के लिए भी उपयोग किया जाता है। सबसे छोटे मानकों को छोड़कर, इन वस्तुओं में आमतौर पर प्रोसेसर के डिजाइन, अर्थात्, निर्देश सूचक रजिस्टर का आकार होता है। 8088/8086 के लिए, यह 16-बिट्स है। 80386 और उत्तराधिकारी के लिए, यह 32-बिट्स है। इसलिए, अन्य आकारों पर चलने वाले स्टैक निर्देशों में बहुत कम मूल्य है।

मेमोरी बस पर डेटा के आकार पर भी विचार किया जाता है। एक शब्द को पुनर्प्राप्त या संग्रहीत करने में उतना ही समय लगता है क्योंकि यह बाइट करता है। (8088 के अलावा जिसमें 16-बिट रजिस्ट्रार हैं लेकिन 8-बिट डेटा बस है।) संरेखण भी खेल में आता है। स्टैक को शब्द सीमाओं पर गठबंधन किया जाना चाहिए ताकि प्रत्येक मान को एक मेमोरी ऑपरेशन के रूप में पुनर्प्राप्त किया जा सके। व्यापार-बंद आमतौर पर स्मृति को बचाने के लिए समय बचाने के लिए लिया जाता है। पैरामीटर के रूप में एक बाइट पास करने के लिए, आमतौर पर एक शब्द का उपयोग किया जाता है। (या, कंपाइलर के लिए उपलब्ध अनुकूलन के आधार पर, एक शब्द-आकार का रजिस्टर का उपयोग किया जाएगा, स्टैक को पूरी तरह से टालना होगा।)

+9

x86-64 में आप स्मृति में संग्रहीत 32-बिट रजिस्टरों या मानों को धक्का नहीं दे सकते, केवल 16- या 64-बिट रजिस्ट्रार और स्मृति में संग्रहीत मान। 'पुश अक्ष', 'पुश रैक्स', 'पुश शब्द [रैक्स]' और 'पुश क्वॉवर्ड [रैक्स]' सभी मान्य x86-64 निर्देश हैं, लेकिन 'पुश ईएक्स' और' पुश डवर्ड [रैक्स] 'मान्य नहीं हैं x86-64। – nrz

+0

ऐतिहासिक नोट, (बहुत ही कम इस्तेमाल किया गया) 80188 (16-बिट शब्द, 8-बिट डेटा बस) और (कुछ समय के लिए कुछ लोकप्रिय) 386 एसएक्स (32-बिट शब्द, 16-बिट डेटा बस) एक ही नाव में थे डेटा बस आकार मिलान के बारे में 8088। –

+0

"स्टैक को शब्द सीमाओं पर गठबंधन किया जाना चाहिए ताकि प्रत्येक मान को एक मेमोरी ऑपरेशन के रूप में पुनर्प्राप्त किया जा सके।", क्या यह फ़ंक्शन के अंदर स्थानीय चर पर लागू होता है? – Thomson

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