2010-07-12 15 views
9

मैं कोड के इस टुकड़े समझ में नहीं आता:ढेर खंड

mov ax, 07C0h ; Set up 4K of stack space above buffer 
add ax, 544  ; 8k buffer = 512 paragraphs + 32 paragraphs (loader) 
cli    ; Disable interrupts while changing stack 
mov ss, ax 
mov sp, 4096 
sti    ; Restore interrupts 
  • mov कुल्हाड़ी, 07C0h - यहाँ BIOS हमारे कोड लोड करता है। लेकिन '4 के' क्या है? किलोबाइट? मैं इसे प्राप्त नहीं किया :)
  • कुल्हाड़ी जोड़ें, 544 - फिर क्यों '8 के'? और हम 544 क्यों जोड़ते हैं? 512 क्यों नहीं?
  • mov sp, 4096 - यहां हम स्टैक पॉइंटर सेट करते हैं।

स्टैक पॉइंटर सेट करने से पहले, हम इन सभी कुशलताओं के लिए क्या करते हैं?

+0

क्या आपके पास बूट लोडर के बाकी स्रोत हैं? –

+1

हां। यह यहां उपलब्ध है http://mikeos.berlios.de/#downloads या मैंने इसे यहां साझा किया है http://snipt.org/Tmon –

+0

थोड़ा स्पर्शक: मैं इस पर गलत हो सकता हूं, और मेरे पास इंटेल मैनुअल नहीं है जांच करने के लिए आसान है, लेकिन मुझे लगता है कि 'सीएलआई' और 'एसटीआई' निर्देश यहां अनावश्यक हैं। आईआईआरसी, यह गारंटी है कि यदि 'एसएस' के लिए कदम तुरंत 'एसपी' के कदम से पीछा किया जाता है, तो दो कदम निर्देशों के बीच कोई हस्तक्षेप नहीं होगा। – bcat

उत्तर

9

मुझे लगता है कि अंतिम पंक्ति पर टिप्पणी यह ​​रकम को:

buffer:    ; Disk buffer begins (8k after this, stack starts) 

स्मृति लेआउट इस तरह दिखता है:

+-------------------+ <-- 07C0:0000, where the BIOS loads the boot sector 
| 512 bytes of code | 
+-------------------+ 
| 8KB set aside for | 
| a disk buffer | 
+-------------------+ <-- SS:0000 
| 4KB of stack | 
+-------------------+ <-- SS:1000 = SS:SP 

पैराग्राफ के बारे में टिप्पणी से थोड़ा सुस्त है, मुझे बाइट्स में सोचना आसान लगता है, जहां 16 बाइट एक अनुच्छेद बनाता है।

इन जादू संख्या के लिए कारण:

  • प्रारंभ खंड 07C0, जहां BIOS कोड
  • (= 512 बाइट्स 32 पैराग्राफ), पिछले 512 बाइट्स जाएं कोड में ही के लिए खाते
  • लोड करता है पर
  • एक 4KB ब्लॉक के शुरू में (8,192 बाइट्स = 512 पैराग्राफ)
  • रखें एसएस अतीत 8KB जाएं, डिस्क बफर के लिए जगह निर्धारित करने के लिए। 512 + 8192 = 8,704 बाइट्स = 544 पैराग्राफ
  • उस ब्लॉक के अंत में एसपी रखें। इसे अंत में रखें क्योंकि ढेर को स्मृति में ऊपर की ओर बढ़ने की जरूरत है।

ध्यान दें कि कोड में 4096 = 4 केबी सामान्य के रूप में दिखाई देता है, क्योंकि एसपी रजिस्टर को बाइट्स में एक मान की आवश्यकता होती है। अन्य सभी मूल्य पैराग्राफ में हैं क्योंकि वे एसएस से संबंधित हैं, जो एक सेगमेंट रजिस्टर है।

+1

धन्यवाद हो सकता है। आपने मुझे बहुत मदद की है :) –

+0

क्या मैं पूछ सकता हूं, प्रोग्रामर कैसे जानता है कि उन्हें यह सब करना है? इसके लिए मैनुअल कहां है, मुझे यह भी नहीं पता कि मुझे कौन सा मैनुअल देखना चाहिए? (मेरा मतलब है कि मैनुअल कहां है जहां 07C0h कहता है कि BIOS कोड लोड करता है) – gideon

+0

@gideon इस प्रकार की जानकारी मूल आईबीएम पीसी पर वापस आती है, इसलिए इसे आईबीएम द्वारा दस्तावेज किया गया था, और पीसी क्लोन के निर्माताओं द्वारा पुन: उत्पन्न किया गया था। बाद में 80 के दशक और 9 0 के दशक में हमारे पास [पीसी इंटरनेशनल] जैसी किताबें थीं (http://www.amazon.com/PC-Intern-Encyclopedia- प्रोग्रामिंग- डेवलपर/डीपी/1557553041/ref=sr_1_1?ie=UTF8&qid=1381938577&sr=8 -1 और कीवर्ड = पीसी + प्रशिक्षु)। और अब इस प्रकार का अस्पष्ट ज्ञान http://wiki.osdev.org जैसी साइटों पर और निश्चित रूप से स्टैक ओवरफ़्लो पर प्रसारित होता है। –