** ध्यान दें कि जब मैं बूट प्रोग्राम कहता हूं, तो मेरा मतलब यह नहीं है कि एक ओएस बूट हो। मेरा मतलब है, एक साधारण प्रोग्राम जो तब चलता है जब आप कंप्यूटर शुरू करते हैं और कुछ करते हैं।सरल 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 के साथ एक समस्या है?
स्माइली चेहरे का अर्थ है कि यह असीसी चरित्र 1 प्रिंट कर रहा है, जिसका अर्थ है कि आप '[testChar]' का उपयोग नहीं कर रहे हैं। मैं अपने एएसएम पर बहुत कठोर हूं कि यह ठीक से कैसे करें ... –
मैंने सोचा कि शायद यह हो सकता है। समस्या यह है कि, मुझे ऐसा करने का कोई और तरीका नहीं दिख रहा है। NASM मैनुअल ने कहा कि अगर मैं किसी पते से स्मृति प्राप्त करना चाहता था (जो वास्तव में testChar है), मुझे इसे ब्रैकेट में रखना था। जब मैंने वास्तविक बाइनरी को देखा, तो testChar प्रोग्राम की शुरुआत के सापेक्ष 0x0e जैसा कुछ होना चाहिए था। इसलिए, यदि मैं 'testChar' टाइप करता हूं, तो यह 0x0e को AL रजिस्टर में डाल देगा। लेकिन अगर मैं '[testChar] 'टाइप करता हूं, तो यह _should_ पते 0x0e पर संग्रहीत मान डालता है। लेकिन, इसके बजाय, ऐसा लगता है कि स्मृति में जाने के बजाए 1 (या जो भी स्माइली चेहरे के लिए ASCII कुंजी है) रखना पसंद करते हैं। – AnonymousJohn
आपके "बूट प्रोग्राम" के लिए शब्द बूटलोडर है। –