2009-05-29 29 views
6

मैं देख रहा हूँ की तरह कोड: पहला तरीकामूव निर्देश में दो सेगमेंट रजिस्टरों की बजाय कुल्हाड़ी का उपयोग क्यों किया जाता है?

mov ds, cs 
mov es, cs 

है तेजी से अपने का उपयोग कर के बाद से संचायक रजिस्टर:

mov ax, cs 
mov ds, ax 
mov es, ax 

क्यों मैं सिर्फ यह करने के लिए सेक नहीं कर सकते? लेकिन यह सहज नहीं लगेगा क्योंकि सीएस और डीएस सेगमेंट रजिस्ट्रार हैं। या क्या कुछ प्रतिबंध है कि मुझे अनजान है?

मैं रास्ते से नस्ल का उपयोग कर रहा हूं।

उत्तर

9

आप सेगमेंट रजिस्टर में सेगमेंट रजिस्टर नहीं चला सकते - इसके लिए कोई निर्देश नहीं है।

+0

जब मैं। पहले अपनी प्रतिक्रिया पढ़ें मैंने बेकार नहीं किया था यानी आप, लेकिन NASM के दस्तावेज़ में, निश्चित रूप से पर्याप्त, कोई mov reg_dseg, reg_cseg निर्देश। – samoz

+0

यह कारण नहीं है, यह परिणाम है। –

+1

क्या? मुझे समझ में नहीं आता कि आप नील का क्या मतलब है। – samoz

1

माइक्रोकोड के सभी निर्देशों के लिए प्रोसेसर में केवल इतना ही कमरा है। इसलिए दुर्लभ रूप से उपयोग किए जाने वाले संचालन झील बदलते सेगमेंट रजिस्टरों के लिए कई सामान्य प्रयोजनों पर अक्सर एक सामान्य निर्देश पसंद किया जाता है। इसके अलावा, कुछ प्रोसेसर के लिए निर्देशों की संख्या पूरी तरह से आर्किटेक्चर द्वारा सीमित है - उदाहरण के लिए, मूल 8080 प्रोसेसर 256 निर्देशों तक सीमित था क्योंकि उन्हें सभी को एक बाइट में एप कोड एन्कोड किया गया था।

+0

+1 – dss539

1

यह वास्तव में असेंबली भाषा नहीं है लेकिन अंतर्निहित मशीन भाषा है जो इन परिचालनों को रोकती है।

जबकि विधानसभा शब्द या निमोनिक्स पढ़ने में आसान है, वे वास्तव में मशीन कोड के 1s और 0s का प्रतिनिधित्व करते हैं। X86 CPUs पर प्रत्येक निर्देश आम तौर पर बाइट्स के अनुक्रम से बना होता है जिसमें व्यक्तिगत बाइट्स या अर्थात् बाइट्स के भीतर बिट्स भी होते हैं। कुछ बिट्स निर्देश का प्रतिनिधित्व करते हैं, अन्य addressing mode का प्रतिनिधित्व करते हैं। अपने उदाहरणों जैसे मोड को संबोधित करने वाले रजिस्टर में कुछ बिट्स दर्शाते हैं कि mov निर्देश के स्रोत और गंतव्य के रूप में कौन से विशिष्ट रजिस्टरों का उपयोग किया जाना है।

अब प्रोसेसर का x86 परिवार 1 9 70 के दशक तक लंबा सफर तय करता है जब सीपीयू आर्किटेक्चर सरल था। उन दिनों की अवधारणा महत्वपूर्ण महत्व थी - ax 16-बिट x86 संचयक है। इस गणना में सभी गणनाएं बनाई गई थीं या "संचित" थीं, इसलिए यह सभी निर्देशों के लिए उपलब्ध थी। अन्य सामान्य प्रयोजन रजिस्टर में उपयोग की एक और प्रतिबंधित सीमा थी।

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

अधिक आधुनिक CPUs जैसे मोटोरोला 680x0 अधिक सामान्य प्रयोजन रजिस्टरों में अधिक क्षमताएं होती हैं जो पहले संचयक का डोमेन थीं। आरआईएससी सीपीयू पर सभी रजिस्टरों accumulators के रूप में लचीला हैं। मैंने सुना है कि 64-बिट मोड में वर्तमान x86/amd64 निर्देश सेट अब बहुत कम प्रतिबंधित है।

+0

कारण के पीछे कारण बताए जाने के लिए +1 x86_64 तक कि रजिस्टरों का उपयोग इस तरह किया जा सकता है। चूंकि 32-बिट x86 अधिकांश रजिस्ट्रार सामान्य उद्देश्य के रूप में कम या ज्यादा काम कर सकते हैं –

+0

ऐसा लगता है कि मुझे पता नहीं था कि प्रश्न सेगमेंट रजिस्टरों के साथ-साथ संचयक के बारे में सवाल था। मैं कभी भी x86 असेंबली में नहीं आया क्योंकि भयानक तरीके से स्मृति काम करता था लेकिन फिर सेगमेंट रजिस्टरों और सामान के साथ। मेरा मानना ​​है कि अब काम करना बहुत अच्छा है कि एक अच्छा फ्लैट मेमोरी मॉडल है। – hippietrail

+0

मैं x86 असेंबली के बावजूद ज्यादा नहीं जाता हूं। लेकिन अभी भी x86 पर सेगमेंट निर्देश हैं। x86 का पता स्थान फ्लैट नहीं है –

1

Intel Manual Volume 2 Instruction Set Reference - 325383-056US September 2015 "MOV Move" कॉलम "निर्देश" को देखें।

mov r/m16, Sreg 

और "3.1.1:

रजिस्टर करने के लिए केवल 16-बिट mov में एन्कोड किया गया है।Opcode सारांश तालिका "में 3 निर्देश स्तंभ बताते हैं:

  • आर/M16 - एक शब्द सामान्य प्रयोजन रजिस्टर या स्मृति निर्देश जिसका संकार्य आकार विशेषता 16 बिट है के लिए इस्तेमाल किया संकार्य शब्द सामान्य प्रयोजन रजिस्टरों हैं। :।। कुल्हाड़ी, CX, DX, BX, सपा, रक्तचाप, एसआई, डि
  • Sreg - एक खंड रजिस्टर

इस प्रकार mov ds, cs नहीं encodable, क्योंकि वहां कोई mov Sreg, Sreg संस्करण है