2011-07-11 9 views
5

** ध्यान दें कि जब मैं बूट प्रोग्राम कहता हूं, तो मेरा मतलब यह नहीं है कि एक ओएस बूट हो। मेरा मतलब है, एक साधारण प्रोग्राम जो तब चलता है जब आप कंप्यूटर शुरू करते हैं और कुछ करते हैं।सरल NASM "बूट प्रोग्राम" स्मृति को सही तरीके से एक्सेस नहीं कर रहा है?

ठीक है, तो मैं कर रहा हूँ नहीं अत्यंत विधानसभा/एनएएसएम में अच्छी तरह से वाकिफ है, लेकिन मुझे लगता है कि मैं इस पर एक बहुत अच्छी समझ सरल बूट कार्यक्रमों लिखने के लिए की है।

ठीक है, मैं सोचा मुझे काफी अच्छा समझ था। जाहिरा तौर पर नहीं।

मैंने ऑनलाइन एक साधारण बूट प्रोग्राम की कोशिश की। यह ठीक चला गया (पत्र 'ए' प्रिंट करता है)। मैंने फिर स्मृति में संग्रहीत एक पत्र मुद्रित करने के लिए इसे संशोधित किया। यह विफल हुआ; 'ए' प्रिंट करने के बजाय, यह एक स्माइली चेहरे को प्रिंट करता है। (मैं अभी कसम, कंप्यूटर के हँस मुझ पर।)

इस स्रोत फ़ाइल से कोड है: 'चाल के साथ

[BITS 16] ; We start up in 16-bit real mode 
[ORG 0x7C00] ; We're booted into memory at this address. (Or so I'm told) 

mov ah, 0x0E  ; Teletype command 
mov bh, 0x00  ; Page number 
mov bl, 0x07  ; Attributes (7 == white foreground, black background) 
mov al, [testChar] ; Character to print; load it from the memory referenced by testChar. 

int 0x10 ; Tell the BIOS to execute the teletype command. 

jmp $ ; Infinite loop prevents us from going off and executing the other junk in memory 

testChar db 65 ; This is the character we want to print. 'A'. 

; The following code pads the rest of the outputted binary file 
; and concludes it with the bootloader signature so I don't have 
; to do so manually. 
times 510-($-$$) db 0 
dw 0xAA55 

अगर मैं की जगह' अल ले जाने , [testChar] ' अल, 65 ', पत्र' ए 'सही ढंग से मुद्रित है। मैंने मेमोरी घोषणा को चारों ओर ले जाने की कोशिश की है, मैंने ब्रेट्स के हर संयोजन या बीआईटीएस और ओआरजी के आसपास कोई ब्रैकेट करने की कोशिश नहीं की है, और मैंने testChar को बढ़ाने और घटाने की कोशिश की है (यानी [testChar + 1])। हर बार, यह या तो एक स्माइली प्रिंट करता है, एक व्यस्त स्माइली (जब मैं testChar बढ़ाता हूं), या कुछ भी नहीं (जब मैं कोड से पहले स्मृति घोषणा करता हूं, शायद इसलिए कि कोई कोड निष्पादित नहीं किया जा रहा है = पी)। मुझे काम करने के लिए लापरवाह चीज़ नहीं मिल सकती है।

अब, विनिर्देशों के लिए (क्योंकि वे शायद प्रासंगिक हैं):

  • मैं एक इंटेल पेंटियम द्वितीय प्रोसेसर के साथ एक Dell अक्षांश भाकपा चल रहा हूँ, क्योंकि वह हर मैं के साथ परीक्षण करने के लिए आपके पास यह है (मैं अपने सामान्य कंप्यूटर के साथ असेंबलर का परीक्षण नहीं कर रहा हूं। नर्क संख्या।)। मुझे यकीन है कि प्रोसेसर x86 है, क्योंकि मैंने विंडोज एक्सपी, उबंटू और आर्क लिनक्स को चलाया है।

  • मैं वर्तमान में NASM का उपयोग कर आर्क लिनक्स पर प्रोग्राम लिख रहा हूं और संकलित कर रहा हूं।

  • बूट कार्यक्रम एक फ्लॉपी डिस्क

  • मैं 'एनएएसएम -f बिन FILENAME' का उपयोग कोड को संकलित करने से चलाया जाता है।

  • मैं तो अल के माध्यम से एक फ्लॉपी डिस्क को संकलित बूट कार्यक्रम को हस्तांतरण करने के लिए 'mtools' पैकेज से 'mformat' आदेश का उपयोग करें 'mformat -f 1440 -B BOOTPROGRAM एक:'।

तो, मैंने इस बार क्या पेंच किया? या यह मेरे प्रोसेसर/BIOS के साथ एक समस्या है?

+0

स्माइली चेहरे का अर्थ है कि यह असीसी चरित्र 1 प्रिंट कर रहा है, जिसका अर्थ है कि आप '[testChar]' का उपयोग नहीं कर रहे हैं। मैं अपने एएसएम पर बहुत कठोर हूं कि यह ठीक से कैसे करें ... –

+0

मैंने सोचा कि शायद यह हो सकता है। समस्या यह है कि, मुझे ऐसा करने का कोई और तरीका नहीं दिख रहा है। NASM मैनुअल ने कहा कि अगर मैं किसी पते से स्मृति प्राप्त करना चाहता था (जो वास्तव में testChar है), मुझे इसे ब्रैकेट में रखना था। जब मैंने वास्तविक बाइनरी को देखा, तो testChar प्रोग्राम की शुरुआत के सापेक्ष 0x0e जैसा कुछ होना चाहिए था। इसलिए, यदि मैं 'testChar' टाइप करता हूं, तो यह 0x0e को AL रजिस्टर में डाल देगा। लेकिन अगर मैं '[testChar] 'टाइप करता हूं, तो यह _should_ पते 0x0e पर संग्रहीत मान डालता है। लेकिन, इसके बजाय, ऐसा लगता है कि स्मृति में जाने के बजाए 1 (या जो भी स्माइली चेहरे के लिए ASCII कुंजी है) रखना पसंद करते हैं। – AnonymousJohn

+1

आपके "बूट प्रोग्राम" के लिए शब्द बूटलोडर है। –

उत्तर

3

डी एस शायद कुछ कचरा मूल्य से भर जाता है, तो बस कार्य करें:

push cs 
pop ds 

या

mov ax, cs 
mov ds, ax 
mov es, ax 

अभी तक बेहतर, सीएस पर भरोसा नहीं करते और कार्य करें:

xor ax, ax 
mov ds, ax 

this discussion देखें: कुछ BIOS पारंपरिक 0000: 7c00 के बजाय 07c0: 0000 का उपयोग कर सकते हैं, विशेष रूप से जब सीडी-रोम से बूटिंग हो ElTorito का उपयोग कर।

+0

मैंने इसके दोनों संस्करणों की कोशिश की। जब मैं इसे बूट करता हूं, तो यह स्क्रीन पर कुछ भी प्रदर्शित नहीं करता है। कोई मजाक नहीं। – AnonymousJohn

+0

ठीक है, यह कहना है कि, जब मैं इसे कुछ और करने से पहले कोड के उन टुकड़ों में से किसी एक के साथ बूट करता हूं, तो यह कुछ भी प्रदर्शित नहीं करता है। मानव संसाधन विकास मंत्री। मैं एएल रजिस्टर में 65 जोड़ने की कोशिश कर रहा हूं। यदि स्माइली चेहरे के लिए एएससीआईआईआई कोड वास्तव में 1 है, तो उसे बी – AnonymousJohn

+0

प्रदर्शित करना चाहिए परीक्षण लोड करने के बाद AL रजिस्टर में 65 जोड़ना स्क्रीन स्क्रीन को खाली भी बनाता है। मुझे यकीन नहीं है कि और क्या करना है। – AnonymousJohn

0

यह निम्न कोड का उत्पादन कर रहा है (बस अपने संकलित कोड पर objdump चलाएं)।

00000000 B40E    mov ah,0xe 
00000002 B700    mov bh,0x0 
00000004 B307    mov bl,0x7 
00000006 A00D7C   mov al,[0x7c0d] 
00000009 CD10    int 0x10 
0000000B EBFE    jmp short 0xb 
0000000D 41    inc cx ; this is actually your testChar 
            ; ignore the opcode translation 

अब अगर आप 0x7C00 में स्थित हैं, तो [0x7c0d] कि में अंतिम बाइट (अर्थात 0x41 या 65, या ASCII 'ए') हो जाएगा। लेकिन अगर अन्य योगदानकर्ताओं में से एक (निंजलज) ने उल्लेख किया है कि आपके पास कुछ अजीब बायोस बग है जिसका मतलब है कि आप 0x7C00 पर स्थित नहीं हैं तो [0x7c0d] किसी का अनुमान है।

0

जब मैंने पहली बार भाग लिया तो यह ठीक हो गया! यह 'ए' प्रिंट करता है। कमांड nasm [filename.asm] -o [filename.com] -l [filename.lst]

मैंने nasm OSbad.asm -o OSbad.com का उपयोग किया। एक बूट करने योग्य छवि फ़ाइल OSbad.iso बनाने के लिए प्रयुक्त MagicISO और इसे एक डीवीडी/आरडब्ल्यू में जलाने के लिए विंडोज डिस्क बर्नर का उपयोग किया जाता है। लोड ओरेकल वीएम और 256 एमबी रैम, सीडी/डीवीडी, 2 जीबी की हार्ड डिस्क के साथ एक नई वर्चुअल मशीन बनाई। डीवीडी के साथ बूट किया गया और यह स्क्रीन पर 'ए' प्रिंट करता है।

तो मुझे लगता है कि आप प्रोग्राम काम कर रहे हैं। यह अन्य चीजें होनी चाहिए जो आप कर रहे हैं जो इसे काम नहीं करती है।

+0

पर भरोसा न करें QEMU पर भी काम करता है । –

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