2015-10-06 12 views
7

सी में, मैं किसी विशेष मेमोरी लोकेशन को कैसे लिखूं उदा। वीडियो मेमोरी बी 800, डॉस में (असली डॉस, एमएस डॉस 6.22)सी में, मैं किसी विशेष स्मृति स्थान को कैसे लिखूं उदा। वीडियो मेमोरी बी 800, डॉस में (असली डॉस, एमएस डॉस 6.22)

मैं समझता हूं कि सी में ऐसा करने के लिए कुछ भी नहीं बनाया गया है, लेकिन कुछ प्लेटफार्म विशिष्ट हो सकते हैं उदा। डॉस विशिष्ट एपीआई फ़ंक्शन जो कर सकते हैं।

यह एक छोटा डेमो प्रोग्राम है जो यह बहुत अच्छा होगा।

मैं जानता हूँ कि डिबग यह कर सकते हैं (उदाहरण के लिए डिबग का छोटा सा है कि मैं जानता हूँ कि से कुछ) -f b800:0 FA0 21 CE (है कि कुछ लिखते हैं -

मैं टर्बो सी (छोटे सी संकलक नहीं, टर्बो सी संकलक TCC.EXE) है कमांड लाइन के लिए विस्मयादिबोधक चिह्न)। लेकिन मुझे एक सी प्रोग्राम बी 800: 0

+3

सकता है बंद करने के लिए मतदान के उन, राज्य के रूप में कारण? – barlop

+0

क्या आपके सिस्टम ने सेगमेंट किया है या स्मृति को पर्ज किया है? क्या आपको दूर और नज़दीकी पॉइंटर्स करने की ज़रूरत है? – dawg

+0

@dawg ** डॉस ** का अर्थ विभाजन – fjardon

उत्तर

7

पता b800:00000xb800 का एक सेगमेंट और 0x0000 का ऑफसेट का उपयोग करता है। यह रैखिक पता 0xb8000 से संबंधित है (अतिरिक्त 0 पर ध्यान दें, क्योंकि सेगमेंट को 4 बिट्स द्वारा छोड़ा गया है)।

protected mode में इस पते पर एक सूचक बनाने के लिए, आप

char *p = (char *)0xb8000; 

प्रयोग करेंगे लेकिन, आप real mode में सबसे अधिक संभावना है, ताकि आप एक far pointer का निर्माण करने की जरूरत है:

char far *p = (char far *)0xb8000000; 

32 बिट मान दो 16 बिट मानों में विभाजित है, जो सेगमेंट और ऑफसेट को सौंपा गया है।

आप इस सूचक सामान्य रूप से तो उपयोग कर सकते हैं,:

*p = '!'; 
+2

निश्चित होना वास्तव में * कुछ * देखने के लिए, चरित्र विशेषता सेट करना बेहतर है। – fjardon

+0

@fjardon सही है। आप "रंग के साथ स्ट्रिंग लिखने" फ़ंक्शन के लिए एक उदाहरण जोड़ना चाह सकते हैं। ओपी चरित्र और विशेषता डेटा के अंतःकरण से अनजान हो सकता है। – usr2564301

+0

मुझे यकीन है कि मैंने यह विंडोज 7 कमांड प्रॉम्प्ट में काम किया था। कोडब्लॉक्स आईडीई प्रोग्राम चलाने के लिए कमांड कंसोल लॉन्च करता है। लेकिन अब मैं इसे आज़माता हूं, मुझे ये त्रुटियां मिलती हैं http://i.imgur.com/7jtfbca.png जीसीसी एक ही त्रुटि देता है। http://pastebin.com/raw.php?i=AtscYUJW निश्चित रूप से win7 32bit में debug.exe था जो आपको '-8 बी 800: 0 FA0 21 CE' देता है, इसलिए मैं नहीं देख सकता कि यह Win7 में क्यों संकलित नहीं होता है? मुझे यकीन है कि यह – barlop

3

तुम कोशिश कर सकते हैं इस (अपरीक्षित मैं अपने पुराने पीसी की जरूरत नहीं है के रूप में)

char far* video = 0xb8000000L; 
*(video++) = '!'; 
*(video++) = 0x0A; 
0

बस आधार के लिए एक सूचक बनाने पता करें और फिर स्मृति को एक्सेस करें जैसे कि यह एक सरणी है। याद रखें कि पाठ मोड में, स्क्रीन पर दिखाए गए प्रत्येक वर्ण के लिए दो बाइट्स हैं। पहला, चरित्र खुद ही रखता है। दूसरे में विशेषता है। उच्च-आदेश 4 बिट पृष्ठभूमि विशेषता हैं और निम्न 4 अग्रभूमि हैं। अग्रभूमि विशेषता में उच्चतम बिट सेट करना इसे उच्च तीव्रता रंग बनाता है, जबकि पृष्ठभूमि विशेषता में उच्च ऑर्डर बिट सेट करने से अग्रभूमि फ़्लैश हो जाता है। इसका मतलब है कि पृष्ठभूमि के लिए 8 रंग उपलब्ध हैं, 16 अग्रभूमि के लिए उपलब्ध हैं और आखिरकार टेक्स्ट ब्लिंक बनाने की क्षमता है।

मोड 0x13 सामान के लिए उदाहरण के लिए: char far *graphScreen = (char far*) 0xA0000000;

और पाठ मोड सामान के लिए, char far *textScreen = (char far*) 0xB8000000;

स्क्रीन स्मृति को लिखने के लिए तो के रूप में सरल है textScreen[ someIndex ] = someChar; textScreen[ someIndex+1 ] = someAttrib;

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