2012-11-01 9 views
7

मैं .code16 के जीएएस के व्यवहार को समझने की कोशिश कर रहा हूं। मैनुअल से, यह 32-बिट ऑपरेशंस या निर्देशों के लिए 16-बिट खंड में प्रतीत होता है, निर्देश एन्कोडिंग के लिए 66 एच ऑपरेंड ओवरराइड उपसर्ग का उत्पादन किया जाएगा। क्या इसका मतलब है16-बिट मोड में ऑपरेंड आकार उपसर्ग

.code16 
movw %eax, %ebx 

ऐसे मोड में कानूनी है? फिर कोड 16-बिट प्रोसेसर पर नहीं चल सकता है?

+0

यह कानूनी नहीं है क्योंकि 'डब्ल्यू' प्रत्यय 2 बाइट चाल इंगित करता है। 'movl% eax,% eax' हालांकि कानूनी है। – fuz

उत्तर

10

ये 80386+ के लिए कानूनी निर्देश हैं। 80386 से शुरू करने से हम ऑपरेटिंग का उपयोग कर सकते हैं- और एड्रेससाइज- उपसर्ग को ओवरराइड कर सकते हैं। उन उपसर्गों का उपयोग 16 बिट एड्रेस मोड और 32 बिट एड्रेस मोड के साथ संयोजन में किया जा सकता है। अतिरिक्त इसे वास्तविक एड्रेसमोड और संरक्षित मोड और वर्चुअल 86 मोड के साथ उपयोग किया जा सकता है। उन उपसर्गों को कोडडिजमेंट में एक निर्देश के लिए डिफ़ॉल्ट ऑपरेंडिज़ और/या पता लगाने को उलट देता है। डिफॉल्ट ऑपरेशंस और एड्रेससाइज को कोड-सेगमेंट डिस्क्रिप्टर में डी फ्लैग द्वारा निर्दिष्ट किया गया है (या यदि कोई जीडीटी/एलडीटी नहीं है, तो बायोस की पोस्ट-प्रोसेस के बाद हम 16 बिट एड्रेसमोड बन जाते हैं।)

16 बिट एड्रेसमोड के साथ हमें उन उपसर्गों को जोड़ना होगा, अगर हम 32 बिट ऑपरेंड और/या 32 बिट पते का उपयोग करना चाहते हैं। उन उपसर्गों के बिना हम 16 बिट एड्रेसमोड में केवल 16 बिट पते/ऑपरेंड का उपयोग कर सकते हैं।

32 बिट एड्रेसमोड के साथ हमें 32 बिट ऑपरेंड और/या 32 बिट पते का उपयोग करना चाहते हैं, तो हमें अपने कोड से उन उपसर्गों को छोड़ना होगा। और यदि हम उन उपसर्गों को हमारे कोड में जोड़ते हैं, तो हम 32 बिट एड्रेसमोड में 16 बिट पते/ऑपरेंड का उपयोग कर सकते हैं।

Blockquote इंटेल:

निर्देश उपसर्गों एक कोड खंड के डिफ़ॉल्ट संकार्य आकार और पते के आकार को ओवरराइड करने के लिए इस्तेमाल किया जा सकता है। इन उपसर्गों का उपयोग रीयल-एड्रेस मोड के साथ-साथ संरक्षित मोड और आभासी -8086 मोड में भी किया जा सकता है। एक ऑपरेंड आकार या पता-आकार उपसर्ग केवल निर्देश की अवधि के लिए आकार बदलता है। (66H) • पते आकार उपसर्ग (67H)

इन उपसर्गों • संकार्य आकार उपसर्ग :

निम्न दो अनुदेश उपसर्गों एक खंड के भीतर 32-बिट और 16-बिट आपरेशन के मिश्रण की अनुमति कोड-सेगमेंट डिस्क्रिप्टर में डी ध्वज द्वारा चयनित डिफ़ॉल्ट आकार को उलट दें। उदाहरण के लिए, प्रोसेसर चार तरीकों से (एमओवी मेम, रेग) निर्देश की व्याख्या कर सकता है: • 32-बिट कोड सेगमेंट में: - 32-बिट रजिस्टर से 32 बिट्स को 32-बिट प्रभावी का उपयोग करके मेमोरी में बनाता है पता। - यदि पहले ऑपरेंड-आकार उपसर्ग द्वारा किया गया है, तो 32-बिट प्रभावी पते का उपयोग करके 16-बिट रजिस्टर से 16 बिट्स को मेमोरी में ले जाता है। - अगर किसी पते-आकार उपसर्ग से पहले, 32-बिट रजिस्टर से 32 बिट्स को 16-बिट प्रभावी पते का उपयोग करके स्मृति में ले जाता है। - अगर किसी पते-आकार उपसर्ग और एक ऑपरेंड-आकार उपसर्ग दोनों से पहले, 16-बिट रजिस्टर से 16 बिट्स को 16-बिट प्रभावी पते का उपयोग करके स्मृति में ले जाता है।

• 16-बिट कोड सेगमेंट में: -16-बिट प्रभावी पते का उपयोग करके 16-बिट रजिस्टर से 16 बिट्स मेमोरी में बनाता है। - अगर किसी ऑपरेंड-आकार उपसर्ग से पहले, 32-बिट रजिस्टर से 32 बिट्स को 16-बिट प्रभावी पते का उपयोग करके स्मृति में ले जाता है। - अगर किसी पते-आकार उपसर्ग से पहले, 32-बिट प्रभावी पते का उपयोग करके 16-बिट रजिस्टर से 16 बिट्स को मेमोरी में ले जाता है। - अगर किसी पते-आकार उपसर्ग और एक ऑपरेंड-आकार उपसर्ग दोनों से पहले, 32-बिट रजिस्टर से 32 बिट्स को 32-बिट प्रभावी पते का उपयोग करके स्मृति में ले जाता है।

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

कोड-सेगमेंट डिस्क्रिप्टर में डी ध्वज कोड सेगमेंट के निर्देशों के लिए डिफ़ॉल्ट ऑपरेंड-आकार और पता-आकार निर्धारित करता है। (रीयल-एड्रेस मोड और आभासी -8086 मोड में, जो सेगमेंट डिस्क्रिप्टर का उपयोग नहीं करते हैं, डिफ़ॉल्ट 16 बिट्स है।) इसके डी फ्लैग सेट वाला कोड सेगमेंट 32-बिट सेगमेंट है; इसके डी फ्लैग स्पष्ट वाला कोड सेगमेंट 16-बिट सेगमेंट है।

निष्पादन योग्य कोड सेगमेंट। ध्वज को डी ध्वज कहा जाता है और यह सेगमेंट में निर्देशों द्वारा संदर्भित प्रभावी पतों और संचालन के लिए डिफ़ॉल्ट लंबाई इंगित करता है। अगर ध्वज सेट किया गया है, तो 32-बिट पते और 32-बिट या 8-बिट ऑपरेंड ग्रहण किए जाते हैं; यदि यह स्पष्ट है, तो 16-बिट पते और 16-बिट या 8-बिट ऑपरेंड ग्रहण किए जाते हैं। निर्देश उपसर्ग 66 एच डिफ़ॉल्ट के अलावा एक ऑपरेंड आकार का चयन करने के लिए उपयोग किया जा सकता है, और उपसर्ग 67 एच का उपयोग डिफ़ॉल्ट के अलावा किसी अन्य पते का चयन किया जा सकता है।

32-बिट ऑपरेंड उपसर्ग का उपयोग 32-बिट निर्देशों को निष्पादित करने के लिए वास्तविक-पता मोड प्रोग्राम में किया जा सकता है। यह उपसर्ग रीयल-एड्रेस मोड प्रोग्राम प्रोसेसर के 32-बिट सामान्य-प्रयोजन रजिस्टरों का उपयोग करने की अनुमति देता है। 32-बिट एड्रेस प्रीफिक्स का उपयोग रीयल-एड्रेस मोड प्रोग्राम्स में किया जा सकता है, जो 32-बिट ऑफ़सेट की इजाजत देता है।

इंटेल 386 प्रोसेसर से शुरू होने वाले आईए -32 प्रोसेसर एक पते ओवरराइड उपसर्ग का उपयोग कर 32-बिट ऑफसेट उत्पन्न कर सकते हैं; हालांकि, रीयल-एड्रेस मोड में, 32-बिट ऑफसेट का मान अपवाद के बिना एफएफएफएफएच से अधिक नहीं हो सकता है।

असेंबलर उपयोग: यदि वास्तविक कोड मोड में चलाने वाला कोड सेगमेंट परिभाषित किया गया है, तो इसे एक यूएसई 16 विशेषता पर सेट किया जाना चाहिए। यदि इस कोड सेगमेंट में एक 32-बिट ऑपरेंड का उपयोग किया जाता है (उदाहरण के लिए, एमओवी ईएक्स, ईबीएक्स), असेंबलर स्वचालित रूप से निर्देश के लिए एक ऑपरेंड उपसर्ग उत्पन्न करता है जो प्रोसेसर को 32-बिट ऑपरेशन निष्पादित करने के लिए मजबूर करता है, भले ही इसके डिफ़ॉल्ट कोड-सेगमेंट विशेषता 16-बिट है।

32-बिट ऑपरेंड उपसर्ग 32-बिट सामान्य प्रयोजन रजिस्टरों (ईएक्स, ईबीएक्स, ईसीएक्स, ईडीएक्स, ईएसपी, ईबीपी, ईएसआई, और ईडीआई) का उपयोग करने के लिए एक वास्तविक पता मोड प्रोग्राम की अनुमति देता है।

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

Blockquote एएमडी:

3.3.2। 32-बिट बनाम 16-बिट पता और ऑपरेंड आकार प्रोसेसर 32-बिट या 16-बिट पते और ऑपरेंड आकार के लिए कॉन्फ़िगर किया जा सकता है। 32-बिट पता और ऑपरेंड आकार के साथ, अधिकतम रैखिक पता या सेगमेंट ऑफ़सेट FFFFFFFFH (2^32-1) है, और ऑपरेंड आकार आमतौर पर 8 बिट्स या 32 बिट्स होते हैं। 16-बिट पते और ऑपरेंड आकार के साथ, अधिकतम रैखिक पता या सेगमेंट ऑफसेट एफएफएफएफएच (2^16-1) है, और ऑपरेंड आकार आमतौर पर 8 बिट्स या 16 बिट्स होते हैं। 32-बिट एड्रेसिंग का उपयोग करते समय, एक लॉजिकल एड्रेस (या दूर पॉइंटर) में 16-बिट सेगमेंट चयनकर्ता और 32-बिट ऑफसेट होता है; 16-बिट एड्रेसिंग का उपयोग करते समय, इसमें 16-बिट सेगमेंट चयनकर्ता और 16-बिट ऑफ़सेट शामिल होता है। निर्देश उपसर्ग एक प्रोग्राम के भीतर से डिफ़ॉल्ट पते और/या ऑपरेंड आकार के अस्थायी ओवरराइड की अनुमति देता है। संरक्षित मोड में परिचालन करते समय, वर्तमान में निष्पादन कोड सेगमेंट के लिए सेगमेंट डिस्क्रिप्टर डिफ़ॉल्ट पता और ऑपरेंड आकार को परिभाषित करता है। एक सेगमेंट डिस्क्रिप्टर एक सिस्टम डेटा संरचना सामान्य रूप से एप्लिकेशन कोड के लिए दृश्यमान नहीं है। असेंबलर निर्देश किसी प्रोग्राम के लिए डिफ़ॉल्ट एड्रेसिंग और ऑपरेंड आकार को चुनने की अनुमति देते हैं। असेंबलर और अन्य टूल्स ने कोड सेगमेंट के लिए सेगमेंट डिस्क्रिप्टर को उचित रूप से सेट किया है। वास्तविक-पता मोड में परिचालन करते समय, डिफ़ॉल्ट एड्रेसिंग और ऑपरेंड आकार 16 बिट्स होता है। एक 3212 बिट एड्रेसिंग सक्षम करने के लिए पता-आकार ओवरराइड वास्तविक-पता मोड में उपयोग किया जा सकता है; हालांकि, अधिकतम स्वीकार्य 32-बिट रैखिक पता अभी भी 000FFFFFH (2^20-1) है।

3.6। OPERAND-SIZE और ADDRESS-SIZE ATTRIBUTES जब प्रोसेसर संरक्षित मोड में निष्पादित हो रहा है, तो प्रत्येक कोड सेगमेंट में डिफ़ॉल्ट ऑपरेंड-आकार विशेषता और पता-आकार विशेषता होती है। कोड गुणों के लिए सेगमेंट डिस्क्रिप्टर में डी (डिफ़ॉल्ट आकार) ध्वज के साथ इन विशेषताओं का चयन किया गया है (इंटेल आर्किटेक्चर सॉफ्टवेयर डेवलपर मैनुअल, वॉल्यूम 3 में अध्याय 3, संरक्षित-मोड मेमोरी प्रबंधन देखें)। जब डी ध्वज सेट किया गया है, तो 32-बिट ऑपरेंड-आकार और पता-आकार विशेषताओं का चयन किया जाता है; जब ध्वज स्पष्ट होता है, 16-बिट आकार विशेषताओं का चयन किया जाता है। जब प्रोसेसर रीयल-एड्रेस मोड में निष्पादित हो रहा है, वर्चुअल -8086 मोड, या एसएमएम (सिस्टम-मैनेजमेंट-मोड), डिफ़ॉल्ट ऑपरेंड-आकार और पता-आकार विशेषताएँ हमेशा 16 बिट्स होती हैं। ऑपरेंड-आकार विशेषता ऑपरेंड के आकार का चयन करती है जो निर्देश संचालित होते हैं। जब 16-बिट ऑपरेंड-आकार विशेषता लागू होती है, तो 32-बिट ऑपरेंड-आकार विशेषता लागू होने पर ऑपरेशंस आमतौर पर 8 बिट्स या 16 बिट्स और हो सकते हैं, आमतौर पर ऑपरेशंस 8 बिट्स या 32 बिट्स हो सकते हैं। पता-आकार विशेषता स्मृति को संबोधित करने के लिए उपयोग किए गए पते के आकार का चयन करती है: 16 बिट्स या 32 बिट्स। जब 16-बिट पता-आकार विशेषता लागू होती है, तो सेगमेंट ऑफ़सेट और विस्थापन 16 बिट्स होते हैं। यह प्रतिबंध उस खंड के आकार को सीमित करता है जिसे 64 KBytes को संबोधित किया जा सकता है। जब 32-बिट पता-आकार विशेषता लागू होती है, तो सेगमेंट ऑफ़सेट और विस्थापन 32 बिट्स होते हैं, जिससे को 4 GBytes तक के सेगमेंट को संबोधित किया जा सकता है। डिफॉल्ट ऑपरेंड-आकार विशेषता और/या पता-आकार विशेषता किसी विशेष निर्देश के लिए एक ऑपरेंड-आकार और/या पता-आकार उपसर्ग को निर्देश द्वारा जोड़कर ओवरराइड किया जा सकता है (देखें "अध्याय उपसर्ग" अध्याय 2 में इंटेल आर्किटेक्चर सॉफ्टवेयर डेवलपर मैनुअल, वॉल्यूम 3)।इस उपसर्ग का प्रभाव केवल उस निर्देश पर लागू होता है जो उससे जुड़ा हुआ है। तालिका 3-1 डी फ्लैग और ऑपरेंड-आकार और पता-आकार उपसर्ग की सेटिंग्स के आधार पर प्रभावी ऑपरेंड आकार और पता आकार (सुरक्षित मोड में निष्पादित करते समय) दिखाता है।

डिर्क

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