2012-03-11 6 views
5

निम्न साइट "Writing Boot Sector Code" कोड के नमूने प्रदान करता है जो सिस्टम बूट होने पर स्क्रीन पर 'ए' प्रिंट करता है। जो मैंने पढ़ा है, उससे आपको कुछ चीजों को करने के लिए BIOS प्राप्त करने के लिए INT opcode का उपयोग नहीं करना है? इंटरप्ट्स के बिना काम के ऊपर संदर्भित साइट से नीचे दिया गया कोड कैसा है? कोड का कौन सा हिस्सा वास्तव में हार्डवेयर को स्क्रीन पर 'ए' प्रिंट करने के लिए कहता है? सवाल मेंरियल मोड असेंबली: बूट पर छंटनी के बिना स्क्रीन पर प्रिंट करें

कोड:

.code16 
.section .text 
.globl _start 
_start: 
    mov $0xb800, %ax 
    mov %ax, %ds 
    movb $'A', 0 
    movb $0x1e, 1 
idle: 
    jmp idle 

जोड़कर मूल प्रश्न

अगर मैं का उपयोग निम्न कोड करता है मेरे लिए पाठ बफर करने के लिए BIOS कॉल लिखने? बफर 0xb800 पता से शुरू हो रहा है?

# Author: Matthew Hoggan 
    # Date Created: Tuesday, Mar 6, 2012 
    .code16      # Tell assembler to work in 16 bit mode (directive) 
    .section .text 
    .globl _start     # Help linker find start of program 
    _start: 
     movb $0x0e,  %ah  # Function to print a character to the screen     
     movb $0x00,  %bh  # Indicate the page number 
     movb $0x07,  %bl  # Text attribute 
     mov $'A',  %al  # Move data into low nibble     
     int $0x10     # Video Service Request to Bios        
    _hang:       
     jmp _hang     
     .end 
+0

यह करता है। हालांकि, बफर स्थान वास्तव में ग्राफिक्स चिप पर निर्भर करता है। मोनोक्रोम एडेप्टर पर आप 0xb800 के बजाय सेगमेंट 0xb000 का उपयोग करेंगे। –

उत्तर

7

आपके प्रश्न का सीधा जवाब: पंक्ति "movb $ 'ए', 0" स्क्रीन पर प्रिंट को प्रभावी ढंग से पूरा करती है (और निम्न पंक्ति, "movb $ 0x1e, 1" निर्दिष्ट करता है कि यह किस रंग का होना चाहिए)।

लंबा उत्तर: वीडियो हार्डवेयर स्मृति की सामग्री के आधार पर स्क्रीन खींचता है। जब टेक्स्ट मोड में, वीडियो हार्डवेयर मेमोरी सेगमेंट 0xB800 के आधार पर ड्राइंग शुरू करता है। बाइट 0 पर जो कुछ भी है, वह स्क्रीन पर पहले टेक्स्ट सेल पर खींचे जाने वाले चरित्र को परिभाषित करता है। अगला बाइट विशेषताएँ (अग्रभूमि रंग, पृष्ठभूमि रंग, और झपकी स्थिति) को परिभाषित करता है। यह पैटर्न पूरी स्क्रीन पर दोहराता है (char - attr - char - attr)।

तो, तकनीकी रूप से, मेरा सीधा जवाब सच नहीं था। 2 'movb' कथन मुद्रित करने के लिए अक्षर 'ए' को बस चरणबद्ध करते हैं। 'ए' मुद्रित नहीं किया जाता है जब तक अगली बार हार्डवेयर स्मृति के आधार पर प्रदर्शन को रीफ्रेश नहीं करता है।

+0

दो सवाल, हार्डवेयर अपनी खुद की ताज़ा दर पर ताज़ा करेगा? क्या यह सीपीयू चक्रों पर आधारित है? अगर मैं इस पर और अधिक पढ़ना चाहता हूं तो क्या आपके पास कोई अच्छा संदर्भ है? –

+0

हाँ, हार्डवेयर अपनी खुद की चीज करता है। जब मैं इन पाठ मोड के बारे में सोचता हूं, तो मैं 30 साल पहले एमएस-डॉस के बारे में सोच रहा हूं। मॉनीटर 50 या 60 हर्ट्ज पर चल रहे थे (क्रमशः पीएएल या एनटीएससी)। तो यह प्रति सेकेंड 50 या 60 रिफ्रेश था। अधिकतर वीडियो हार्डवेयर सॉफ़्टवेयर को थोड़ा सा मतदान करने की अनुमति देता है ताकि यह जानने के लिए कि एक लंबवत रीफ्रेश हो रहा है या नहीं। यह ग्राफिकल झिलमिलाहट को रोकने के लिए उपयोगी है लेकिन यह आमतौर पर पाठ मोड के लिए एक बड़ी चिंता नहीं है। संदर्भों के लिए, मुझे लगता है कि टेक्स्ट मोड के लिए विकिपीडिया आलेख एक अच्छी शुरुआत होगी: http://en.wikipedia.org/wiki/Text_mode –

1

बूट पर, आप एक डिफ़ॉल्ट स्क्रीन मोड में हैं - इस मामले में एक टेक्स्ट स्क्रीन मोड। आपका उदाहरण प्रोग्राम सीधे चरित्र बफर में लिखा जा रहा है जो उस स्क्रीन स्क्रीन मोड के लिए स्क्रीन पर प्रदर्शित होता है। डेटा सेगमेंट रजिस्टर को 0xb800 पर सेट करना उस बफर पर इंगित करने के लिए चीजें सेट अप कर रहा है। अधिक जानकारी के लिए this tutorial देखें।

+0

उस लिंक में आपने मुझे भेजा है वह आईएनटी का उपयोग कर रहा है। उपर्युक्त कोड में, 0xb800 कुल्हाड़ी को बफर करने के लिए पॉइंटर सेट करता है? उसके पास दो mov लाइनें क्यों हैं? क्यों न केवल 0xb800 mov,% ds? एक और सवाल यह है कि mov $ 'ए' क्या करता है, 0 पूरा करता है? क्या यह 'ए' को रिश्तेदार पते '0' पर ले जाता है? $ 0x1e भी movb, 1 विशेषता को सापेक्ष एड्रेस 1 में ले जाता है? मैं अभी भी थोड़ा उलझन में हूँ। –

+0

क्षमा करें - मेरा मतलब सिर्फ डेटा सेगमेंट भागों का स्पष्टीकरण होना है। आप * स्थिरता को सीधे 'डीएस' में नहीं ले जा सकते हैं, यही कारण है कि यह दो-चरणीय प्रक्रिया है। आपका उदाहरण प्रोग्राम डेटा सेगमेंट को '0xb800' पर सेट करता है, फिर' 0xb800: 0000' में ASCII '' '' डालता है और '0xb800: 0001' में एक शाब्दिक' 0x1e' डालता है। @ मल्टीमीडिया माइक का जवाब एक महान स्पष्टीकरण है, मुझे लगता है। –

+0

यह मेरा एक साइड प्रोजेक्ट है, मुझे उम्मीद है कि आप सभी सवालों पर ध्यान नहीं देंगे। आपकी मदद बहुत ही सराहनिय है। आगे बढ़ने के बारे में बेहतर समझने के लिए मैंने अपने मूल प्रश्न पर संलग्न किया है। क्या आप विषय पर थोड़ा और विस्तार कर सकते हैं? –

0

मूल रूप से जब आप INT 10h कहते हैं, BIOS एक दिनचर्या निष्पादित करेगा जो लगभग एक ही चीज़ करता है, वर्णों और उनके गुणों को वीडियो मेमोरी में लिखकर। यह जानना उपयोगी है कि इन रूटीन को स्वयं कैसे लिखना और निष्पादित करना है ताकि यदि आप सीपीयू को 32-बिट संरक्षित मोड में स्विच करने का निर्णय लेते हैं, तो भी आप स्क्रीन पर वर्णों को प्रिंट कर सकते हैं क्योंकि उस मोड में आप अब सक्षम नहीं होंगे BIOS इंटरप्ट्स को कॉल करने के लिए।

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