2011-09-08 13 views
6

असेंबली में les निर्देश का उद्देश्य क्या है?लेस निर्देश उद्देश्य?

क्यों हम es खंड और एक रजिस्टर लोड करने के लिए की जरूरत है?

les bx, p   ; Load p into ES:BX 
mov es:[bx], al  ; Store away AL 

क्यों हम esऔरbx इस मामले में लोड करने के लिए की जरूरत है: पुस्तक निम्नलिखित उदाहरण देता है?

हम es:[bx] का उपयोग क्यों करते हैं? यदि स्मृति में p अंक 100h तक है, तो es और bx 100h = 200h (bx+es) दोनों नहीं है?

उत्तर

9

यह बहुत बुरा है कि आप एक गन्दा वास्तुकला के साथ एक माइक्रोप्रोसेसर के लिए असेंबलर सीख रहे हैं। आपको एलईएस निर्देश जैसे भ्रमित अवधारणाएं मिलती हैं।

परंपरागत माइक्रोप्रोसेसर के पास पूर्ण स्मृति पता रखने के लिए काफी बड़े रजिस्ट्रार हैं। आप बस एक मेमोरी लोकेशन के पते को रजिस्टर में लोड कर सकते हैं, और फिर रजिस्टर के माध्यम से उस स्थान (और आमतौर पर इंडेक्सिंग के साथ पास) तक पहुंच सकते हैं।

कुछ मशीनें (विशेष रूप से इंटेल 286 जो आप प्रोग्रामिंग कर रहे हैं), केवल 16 बिट रजिस्ट्रार थे लेकिन 1 एमबी मेमोरी को संबोधित कर सकते थे। इस मामले में, एक रजिस्टर में पर्याप्त बिट्स नहीं होते हैं: आपको 20 बिट्स की आवश्यकता होती है, लेकिन रजिस्ट्रार केवल 16 बिट होते हैं।

समाधान एक दूसरा रजिस्टर है जिसमें लापता बिट्स शामिल हैं। 32 बिट पते का उत्पादन करने के लिए एक साधारण योजना के लिए 2 रजिस्टरों की आवश्यकता होती थी, जिनमें से एक में 16 बिट्स थे, जिनमें से एक ऊपरी 16 बिट्स था। फिर दो रजिस्ट्रारों का संदर्भ देने वाला निर्देश समझ में आता है: आपको पूर्ण स्मृति पता पाने के लिए दोनों की आवश्यकता है।

इंटेल ने एक मैसियर योजना का चयन किया: इंडेक्स रजिस्टर (आपके मामले में बीएक्स) में कम 16 बिट्स हैं, और अन्य रजिस्टर (ईएस कहा जाता है) में 16 बिट्स हैं जो 4 बिट्स को छोड़ दिया गया है, और इंडेक्स रजिस्टर में जोड़ा गया है परिणामस्वरूप पता पाने के लिए। ईएस को "सेगमेंट" रजिस्टर कहा जाता है, लेकिन जब तक आप Multics operating system लगभग 1 9 68 के बारे में पढ़ते हैं, तो इसका कोई मतलब नहीं होगा।

[सेगमेंट और सेगमेंट रजिस्ट्रार वास्तव में मल्टीक्स तरीके को लागू करते समय एक दिलचस्प विचार हैं। यदि आपको नहीं पता कि यह क्या है, और आपके पास कोई कंप्यूटर और/या सूचना आर्किटेक्चर में रूचि है, तो मल्टीक्स पर इलियट ऑर्गेनिक पुस्तक ढूंढें और इसे कवर करने के लिए कवर पढ़ें। आप 60 के दशक के उत्तरार्ध में जो कुछ भी कर चुके थे, उससे डरेंगे और लगता है कि "प्रगति" के 50 वर्षों में खो गया है।]

x86 में विचार का क्या छोड़ दिया गया है यह बहुत मजाक है, कम से कम जिस तरह से "आधुनिक" ऑपरेटिंग सिस्टम में प्रयोग किया जाता है। आप वास्तव में परवाह नहीं करते हैं; जब कुछ हार्डवेयर डिजाइनर आपको मशीन के साथ प्रस्तुत करते हैं, तो आपको इसके साथ रहना होगा।

इंटेल 286 के लिए, आपको बस एक पूर्ण पता पाने के लिए एक सेगमेंट रजिस्टर और एक इंडेक्स रजिस्टर लोड करना होगा। एक पूर्ण पता बनाने के लिए प्रत्येक मशीन इंस्ट्रुक्शन को एक इंडेक्स रजिस्टर और एक सेगमेंट रजिस्टर का संदर्भ देना होता है। इंटेल 286 के लिए, 4 ऐसे सेगमेंट रीगस्टर हैं: डीएस, एसएस, ईएस, और सीएस। प्रत्येक निर्देश प्रकार स्पष्ट रूप से एक इंडेक्स रजिस्टर को निर्दिष्ट करता है और 4 सेगमेंट रजिस्टरों में से एक को स्पष्ट रूप से चुनता है जब तक कि आप एक स्पष्ट ओवरराइड प्रदान न करें जो कहता है कि किस का उपयोग करना है। जेएमपी निर्देश सीएस का उपयोग करते हैं जबतक कि आप अन्यथा नहीं कहें। एमओवी निर्देश डीएस का उपयोग करते हैं जबतक कि आप अन्यथा नहीं कहें। पुश निर्देश एसएस का उपयोग करते हैं जबतक कि आप अन्यथा नहीं कहें (इस मामले में आप बेहतर नहीं हैं)। ईएस "अतिरिक्त" खंड है; आप इसे केवल निर्देश में स्पष्ट रूप से संदर्भित करके इसका उपयोग कर सकते हैं (ब्लॉक चाल [MOVB} निर्देश को छोड़कर, जो डीएस और ईएस दोनों का उपयोग करता है)।

आशा है कि मदद करता है।

अधिक आधुनिक माइक्रोप्रोसेसर के साथ काम करने के लिए सबसे अच्छा, जहां सेगमेंट रजिस्टर silliness एक मुद्दा नहीं है।

+0

आपका उत्तर * अधिकतर * सही है। हालांकि, सभी आधुनिक x86 प्रोसेसर सेगमेंट रजिस्टरों का उपयोग करते हैं। यहां तक ​​कि 64-बिट मोड में जो अधिकतर फ्लैट है, आपके पास अभी भी जीएस और एफएस है जो फ्लैट नहीं हैं। यदि कुछ भी हो, तो इस सेगमेंट रजिस्टर में आपकी पोस्ट में वर्णन करने की तुलना में आजकल अधिक जटिलता है। –

+2

हां, वे करते हैं, लेकिन ओपी को इस जटिलता को सुनने की आवश्यकता नहीं थी। न ही वर्तमान उपयोग (x64) कुछ भी है लेकिन असली सेगमेंट रजिस्टरों का सबसे बेस्ट वेस्टिज है। इतनी शर्म की बात है, मल्टीक्स संदर्भ देखें। (एंडी ग्रोव 80 के दशक के मध्य में एक बातचीत में उठ गए और अपने ढेर को उड़ा दिया ... इंटेल ने वास्तव में मल्टीक्स करने के लिए 386 सेगमेंट रजिस्टरों को डिजाइन किया, और उन्हें यूनिक्स वीनीज़ द्वारा अनदेखा कर दिया गया। हम जो स्वीकार करते हैं उसके लायक हैं)। –

+2

बहुत बहुत धन्यवाद! "* आपको 20 बिट्स चाहिए, लेकिन रजिस्ट्रार केवल 16 बिट्स हैं।* "मैं पूरी तरह से मैं के साथ 16 बिट सीपीयू काम कर रहा था भूल गया –

3

पी सेगमेंट और ऑफसेट भाग के साथ 32-बिट एफएआर पॉइंटर पर अंक (निकटतम सूचक के विपरीत, जो केवल ऑफ़सेट भाग है)। एलईएस सेगमेंट लोड होगा: ऑफ़सेट ES:BX में।

अन्यथा, आपको तीन निर्देशों का उपयोग करना होगा। BX लोड करने के लिए एक, और ES लोड करने के लिए दो (सेगमेंट रजिस्ट्रार सीधे मेमोरी से लोड नहीं किए जा सकते हैं लेकिन उन्हें सामान्य प्रयोजन रजिस्टर में लोड किया जाना चाहिए और फिर सेगमेंट रजिस्टर में लोड करना होगा)।

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

एक खंड (पता) इस संदर्भ में भौतिक पता का एक हिस्सा है:
शिफ्ट बाईं ओर 4 बिट्स द्वारा खंड (यानी से गुणा 2^4 = 16) और जोड़ने के भौतिक पाने के लिए ऑफसेट सेगमेंट से पता: ऑफसेट।

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

5

8086 खंड पंजीकृत करता cs, ds, es, और ss मूल व्यवस्था है जिसके द्वारा 16-बिट रजिस्टरों स्मृति से अधिक 64K पता कर सकते हैं कर रहे हैं। 8086/8088 में, उत्पन्न होने के लिए 20 बिट पते (1024 के) थे। X86 प्रोसेसर के बाद के संस्करणों ने और भी संबोधित करने के लिए नई योजनाएं जोड़ दीं, लेकिन 16-बिट मानों की एक जोड़ी से पता के 20+ बिट उत्पन्न करना मूल कारण है।

तथाकथित "वास्तविक मोड" में (8086/8088/80186/80286 के मूल निवासी), एक पते 16 के आधार पर विभाजित रजिस्टर की सामग्री को गुणा (या, समतुल्य रूप, चार स्थानों द्वारा छोड़ा परिवर्तित) द्वारा की जाती है और ऑफसेट जोड़ना

संरक्षित मोड में (80386 और बाद में उपलब्ध) में, सेगमेंट रजिस्टर एक "वर्णक" का चयन करता है जिसमें मूल भौतिक पता होता है। ऑपरेंड es:[bx], उदाहरण के लिए, ऑपरेटिंग पता उत्पन्न करने के लिए उस भौतिक पते पर bx जोड़ता है।

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