2008-09-24 17 views
6

मैंने खुद को असेंबली भाषा सिखाने का फैसला किया।मैं सेगमेंट रजिस्टर का मूल्य क्यों नहीं बदल सकता? (एमएएसएम)

मुझे एहसास हुआ है कि अगर मैं किसी भी सेगमेंट रजिस्टर के मूल्य को बदलने का प्रयास करता हूं तो मेरा प्रोग्राम संकलित नहीं होगा।

मुझे जो भी लेख मिला है, वह कहता है कि मैं वास्तव में कम से कम 4 सेगमेंट रजिस्टरों के मूल्य को बदल सकता हूं, तो क्या देता है?

मैं वास्तव में इस बिंदु पर क्यों दिलचस्पी लेता हूं, मेरे पास इन पतों को बदलने में कोई वास्तविक उद्देश्य नहीं है।

+2

त्रुटि क्या है? – Blorgbeard

+0

ओएस के तहत, या फ्रीस्टैंडिंग? 16 असली या 32-बिट संरक्षित मोड? क्या कोड संकलित नहीं किया था? अवलोकन प्रभावों के साथ न्यूनतम 16-बिट उदाहरण: https://github.com/cirosantilli/x86-bare-metal-examples/blob/d4aae6183b98564819107b44a77641979c35d2c3/segment_registers.S –

उत्तर

8

रूप प्रोग्रामिंग के रूप में आसान बना देता है आपने कहा कि आप में रुचि रखते थे यही कारण है कि, तो:

वास्तविक मोड में, एक खंड भौतिक स्मृति के लिए एक 64K "विंडो" है और इन खिड़कियों को 16 बाइट अलग रखा गया है। संरक्षित मोड में, एक सेगमेंट भौतिक या वर्चुअल मेमोरी के लिए एक विंडो है, जिसका आकार और स्थान ओएस द्वारा निर्धारित किया जाता है, और इसमें कई अन्य गुण होते हैं, जिसमें किसी विशेषाधिकार स्तर को किसी एक्सेस को एक्सेस करने के लिए होना चाहिए।

यहां से, जो कुछ भी मैं कहता हूं वह संरक्षित मोड को संदर्भित करता है।

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

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

जब कोई अपवाद होता है, तो कर्नेल इसे संभालता है। इस तरह के अपवाद को शायद सेगमेंटेशन गलती के रूप में वर्गीकृत किया जाएगा। तो ओएस आपके कार्यक्रम को मारता है।

एक अंतिम चेतावनी है: x86 निर्देश सेट में, आप सेगमेंट रजिस्टरों में तत्काल मान लोड नहीं कर सकते हैं। आपको सेगमेंट रजिस्टर में इंटरमीडिएट रजिस्टर या मेमोरी ऑपरेंड या पीओपी का उपयोग करना होगा।

 
MOV DS, 160 ;INVALID - won't assemble 

MOV AX, 160 ;VALID - assembles, but will probably result in an 
MOV DS, AX ;exception, and thus the death of your program 

मुझे लगता है कि यह ध्यान दिया जाना चाहिए कि आर्किटेक्चर सेगमेंट के ढेर के लिए अनुमति देता है। लेकिन AFAIK, जब यह मुख्य धारा 86 ऑपरेटिंग सिस्टम के लिए आता है, खंड रजिस्टरों केवल कुछ प्रयोजनों की सेवा: इस तरह के एक दूसरे को या ओएस

  • कई के साथ काम को नुकसान पहुँचाने से उपयोगकर्ता अंतरिक्ष प्रक्रियाओं रखने के रूप में

    • सुरक्षा तंत्र,/बहु-कोर प्रोसेसर
    • थ्रेड-लोकल स्टोरेज: ऑप्टिमाइज़ेशन के रूप में, कुछ ऑपरेटिंग सिस्टम (लिनक्स और विंडोज सहित) थ्रेड-लोकल स्टोरेज (टीएलएस) के लिए सेगमेंट रजिस्ट्रार का उपयोग करते हैं। चूंकि धागे एक ही पता स्थान साझा करते हैं, इसलिए धागे को "पता" करना मुश्किल होता है जहां इसका टीएलएस क्षेत्र सिस्टम कॉल का उपयोग किए बिना या पंजीकरण बर्बाद कर रहा है ... लेकिन चूंकि सेगमेंट रजिस्ट्रार व्यावहारिक रूप से बेकार हैं, इसलिए "बर्बाद करने" में कोई हानि नहीं है उन्हें तेजी से टीएलएस के लिए। ध्यान दें कि इसे सेट करते समय, एक ओएस सेगमेंट रजिस्टरों को छोड़ सकता है और सीधे वर्णक कैश रजिस्टरों को लिख सकता है, जो सेगमेंट रजिस्टरों के संदर्भों से ट्रिगर किए गए जीडीटी/एलडीटी लुकअप को कैश करने के लिए उपयोग किए जाने वाले "छिपा" रजिस्ट्रार हैं, इस मामले में यदि आप कोशिश करते हैं सेगमेंट रजिस्टरों से पढ़ने के लिए आप इसे नहीं देख पाएंगे।

    टीएलएस के लिए प्रति थ्रेड सेगमेंट के अलावा, वास्तव में केवल कुछ हद तक सेगमेंट (प्रोसेसर की संख्या) का उपयोग किया जाता है, और केवल ओएस द्वारा। आवेदन कार्यक्रम पूरी तरह से सेगमेंट रजिस्टरों को अनदेखा कर सकते हैं।

    यह किसी भी तकनीकी सीमाओं के लिए ओएस डिज़ाइन के कारण है। एम्बेडेड ऑपरेटिंग सिस्टम हो सकते हैं जिसके लिए सेगमेंट रजिस्टरों के साथ काम करने के लिए उपयोगकर्ता-स्पेस प्रोग्राम की आवश्यकता होती है, हालांकि मुझे किसी के बारे में पता नहीं है।

  • +1

    क्या आप वाकई x86 पर तत्काल मान के साथ सेगमेंट रजिस्टर लोड नहीं कर सकते हैं? मैं इंटेल आर्किटेक्चर सॉफ्टवेयर डेवलपर मैनुअल (325462, संयुक्त खंड) देख रहा हूं और पेज 1002 पर यह 0x8E के ऑपोड के साथ एक एमओवी निर्देश के बारे में बताता है, जो स्पष्ट रूप से एक सेगमेंट रजिस्टर में 'आर/एम 16' चलाता है। – amn

    2

    क्या आप विंडोज एक्जिक्यूटिव लिख रहे हैं?

    संरक्षित मोड (Win32) में, सेगमेंट रजिस्टरों का अब और उपयोग नहीं किया जाता है।

    Reference:

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

    +3

    यह सादा * गलत * है। थ्रेड स्थानीय स्टोरेज और अपवाद हैंडलिंग के लिए कई सेगमेंट रजिस्टरों का उपयोग किया जाता है। –

    +0

    मैं (स्पष्ट रूप से?) का मतलब था, "उपयोगकर्ता-अंतरिक्ष कार्यक्रमों द्वारा, उनके मूल उद्देश्य के लिए उपयोग किया जाता है"। ओपी तारीख दस्तावेज से बाहर का जिक्र कर रहा था। – Blorgbeard

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