2011-11-15 18 views
10

अर्थ मैं इस एनएएसएम का उपयोग कर ट्यूटोरियल x86 के लिए बूटलोडर/ओएस के विकास में एक प्रथम प्रयास के रूप में अनुसरण कर रही हूं:86 एनएएसएम 'org' निर्देश

http://joelgompert.com/OS/TableOfContents.htm

और मैं पाठ 4 पर हूँ, जो कर रहा है मेरी बूटलोडर "हैलो, वर्ल्ड" स्ट्रिंग प्रिंट करें। मैं org निर्देश (निर्देश?) के अर्थ को समझ नहीं रहा हूं।

जैसा कि मैं इसे समझता हूं, org परिभाषित करता है कि प्रोग्राम कहां निष्पादित किया जा रहा है स्मृति में लोड किया गया है। प्रोग्राम में किसी भी प्रकार के लेबल या रिश्तेदार पते का उपयोग करते समय इसकी आवश्यकता होती है।

मान लीजिए मैं एक स्ट्रिंग मेरे कार्यक्रम में इस तरह की एक लेबल के साथ परिभाषित किया गया है:

szHello db 'Hello, world!', 0 

और मैं फिर बाद में संदर्भ है कि इस तरह लेबल करने के लिए प्रयास करें (केवल प्रासंगिक के टुकड़े):

org 0x7c00 
xor ax, ax 
mov ds, 0 
... 
mov si, szHello 
lodsb 
... 
int 0x10 ; Print first character of szHello 

मेरा सवाल है, यह इसके बराबर क्यों नहीं है? :

org 0 
mov ds, 0x7c00 
... 
mov si, szHello 
lodsb 
... 
int 0x10 

जब मैं पहला उदाहरण चलाता हूं, तो मेरी स्ट्रिंग सही ढंग से दिखाई देती है। दूसरा उदाहरण काम नहीं करता है।

प्रासंगिक दस्तावेज के पॉइंटर्स की भी सराहना की जाएगी, अगर यह मुद्दा मेरे हिस्से पर एक वैचारिक समस्या है।

उत्तर

8

0000: 7C00 7C00: 0000 के बराबर नहीं है। खंड भाग पैराग्राफ में गिना जाता है, बाइट्स नहीं। ऐसा करें:

mov ax, 0x7c0 
mov ds, ax 
+0

उत्कृष्ट, यह काम करता है, धन्यवाद। हालांकि, मुझे यकीन नहीं है कि मैं पूरी तरह से समझता हूं। क्या 'org' सेगमेंट एड्रेस या सेगमेंट में ऑफसेट का उपभोग करता है? –

+1

यह वर्तमान सेगमेंट में ऑफसेट है। –

+0

'mov ds, 0x7c0' मान्य निर्देश नहीं है। हो सकता है कि आपका मतलब 'mov ax, 0x7c0'' mov ds, ax' –

13

org को परिभाषित करता है जहां विचाराधीन कार्यक्रम स्मृति में लोड हो जाता है। जहां वास्तव में इसे लोड नहीं किया जाता है - यह जो भी लोडिंग करता है उसे नियंत्रित करता है - लेकिन जहां इसे लोड होने की अपेक्षा की जाती है।

+0

दिलचस्प है। मेरे कार्यक्रम के साथ क्या होता है अगर यह कहीं और लोड हो जाता है? और फिर, 'संगठन' बिल्कुल क्यों मौजूद है? –

+0

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

+1

एक और रूप में कहा: पूर्ण पते गलत होंगे। – ninjalj