2008-08-20 10 views
5

के साथ 32 बिट और 16 बिट कोड मिलाकर यह एक निम्न-स्तरीय सिस्टम प्रश्न है।नासम

मुझे 32 बिट और 16 बिट कोड मिश्रण करने की आवश्यकता है क्योंकि मैं संरक्षित मोड से रीयल-मोड पर वापस लौटने की कोशिश कर रहा हूं। पृष्ठभूमि की थोड़ी सी जानकारी के रूप में, मेरा कोड GRUB बूट के बाद ही ऐसा कर रहा है, इसलिए मेरे पास यह बताने के लिए कोई परेशानी ऑपरेटिंग सिस्टम नहीं है कि मैं क्या कर सकता हूं और नहीं कर सकता।

वैसे भी, मैं अपनी असेंबली के साथ [बीआईटीएस 32] और [बीआईटीएस 16] का उपयोग करता हूं ताकि यह कह सके कि किस प्रकार के संचालन का उपयोग करना चाहिए, लेकिन जब मैं अपने कोड उपयोग बोच का परीक्षण करता हूं तो ऐसा लगता है कि कुछ ऑपरेशन बोच नहीं हैं मैंने जो कोड लिखा था उसे निष्पादित करना। ऐसा लगता है कि असेंबलर 0x66 और 0x67 में बोच को भ्रमित करता है।

तो, मैं कोड को सफलतापूर्वक इकट्ठा करने के लिए नस्ल कैसे प्राप्त करूं जहां मैं उसी फ़ाइल में 32 बिट और 16 बिट कोड मिलाता हूं? क्या कोई तरह की चाल है?

उत्तर

0

आप निम्न स्तर के बारे में मजाक नहीं कर रहे थे!

क्या आपने यह सुनिश्चित करने के लिए जेनरेट किए गए ऑपकोड/ऑपरेंड की जांच की है कि नासम आपके बीआईटीएस निर्देशों को सही तरीके से सम्मानित कर रहा है? यह भी सुनिश्चित करने के लिए जांचें कि कूद लक्ष्य सही हैं - शायद नस्ल गलत ऑफसेट का उपयोग कर रहा है।

यदि यह नासम में कोई बग नहीं है, तो शायद बोच में एक बग है। मैं कल्पना नहीं कर सकता कि लोग 32-बिट मोड से 16-बिट मोड पर वापस स्विच करते हैं।

3

0x66 और 0x67 ऑपकोड हैं जिनका उपयोग यह इंगित करने के लिए किया जाता है कि निम्न ऑपोड को गैर-डिफ़ॉल्ट बैथर के रूप में व्याख्या किया जाना चाहिए। अधिक विशेष रूप से, (और this link के अनुसार),

"जब NASM बीआईटीएस 16 मोड में होता है, तो 32-बिट डेटा का उपयोग करने वाले निर्देश 0x66 बाइट के साथ प्रीफ़िक्स किए जाते हैं, और 32-बिट पते का जिक्र करने वाले 0x67 उपसर्ग होते हैं। बीआईटीएस 32 मोड में, रिवर्स सत्य है: 32-बिट निर्देशों के लिए कोई उपसर्ग की आवश्यकता नहीं होती है, जबकि 16-बिट डेटा का उपयोग करने वाले निर्देशों को 0x66 की आवश्यकता होती है और 16-बिट पते पर काम करने वाले लोगों को 0x67 की आवश्यकता होती है। "

इससे पता चलता है कि यह गलती पर बोच है।

0

यदि आप वास्तविक मोड में हैं तो आपका डिफ़ॉल्ट आकार निश्चित रूप से 16 बिट्स है, इसलिए आपको बिट्स 16 मोड का उपयोग करना चाहिए। इस तरह यदि आपको 32-बिट ऑपरेंड आकार की आवश्यकता है तो आप 0x66 उपसर्ग जोड़ते हैं, और 32-बिट पते के आकार के लिए आप 0x67 उपसर्ग जोड़ते हैं।

इंटेल IA-32 सॉफ्टवेयर डेवलपर की मार्गदर्शिका, खंड 3, अध्याय 16 में

देखो (मिश्रण 16-बिट और 32-बिट कोड, अध्याय संख्या पुस्तक के संस्करण के अनुसार बदल सकता है):

रीयल-एड्रेस मोड, आभासी -8086 मोड, और एसएमएम देशी 16-बिट मोड हैं।

बीआईटीएस 32 निर्देश केवल असेंबलर को भ्रमित कर देगा यदि आप इसे संरक्षित मोड या लांग मोड के बाहर उपयोग करते हैं।

6

समस्या यह साबित हुई कि मैं अपनी डिस्क्रिप्टर टेबल को सही तरीके से स्थापित नहीं कर रहा था। मैंने थोड़ा सा गलत फिसल दिया था इसलिए 16-बिट मोड में जाने के बजाय मैं 32-बिट मोड पर जा रहा था (खंडों के साथ जो एक मेग की सीमा थी)।

सुझावों के लिए धन्यवाद!

टेरी

+1

संकेत: ऐसा होने पर अपना उत्तर स्वीकार करें। – Joshua

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