2015-10-06 24 views
7

在C中,我如何寫入特定的內存位置,例如視頻內存b800,在DOS(真正的DOS,MS DOS 6.22)在C中,如何寫入特定的內存位置,例如視頻內存b800,在DOS(真正的DOS,MS DOS 6.22)

我明白C沒有內置任何東西來做到這一點,但可能有一些特定的平臺,例如, DOS特定的API函數可以。

一個小的演示程序,它會很好。

我的Turbo C(TCC.EXE - 不是微小的C編譯器,渦輪C編譯器)

我知道調試可以做到這一點(例如,一些調試的點點,我知道的)-f b800:0 FA0 21 CE(寫入一些感嘆號到命令行)。但我想要一個C程序寫入b800:0

+3

可能那些投票關閉,狀態一個原因? – barlop

+0

您的系統有分段或分頁內存嗎?你需要做遠近指針嗎? – dawg

+0

@dawg ** DOS **表示分段 – fjardon

回答

7

地址b800:0000使用段0xb800和偏移量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是對的。您可能想添加一個「帶顏色的字符串寫入」功能的示例。 OP可能不知道字符和屬性數據的交錯。 – usr2564301

+0

我相信我在Windows 7命令提示符下工作。 codeblocks IDE啓動一個命令控制檯來運行程序。但現在我嘗試一下,我得到這些錯誤http://i.imgur.com/7jtfbca.png gcc給出了相同的錯誤。 http://pastebin.com/raw.php?i=AtscYUJW當然win7 32bit有debug.exe讓你'-f b800:0 FA0 21 CE'所以我不明白爲什麼它不能在Win7中編譯?我敢肯定它確實 – barlop

3

你可以試試這個(未經測試,因爲我沒有我的舊電腦)

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

只需創建一個指向該基地地址,然後像訪問數組一樣訪問內存。回想一下,在文本模式下,屏幕上顯示的每個字符都有兩個字節。第一個,持有角色本身。第二個保存屬性。高4位是背景屬性,低4位是前景。在前景屬性中設置最高位使其成爲高亮度顏色,而在背景屬性中設置高位則會使前景閃爍。這意味着有8種顏色可用於背景,16種可用於前景,最後可以使文本閃爍。

例如,對於模式0×13的東西: char far *graphScreen = (char far*) 0xA0000000;

而對於文本模式下的東西, char far *textScreen = (char far*) 0xB8000000;

要寫入屏幕內存是如此的簡單 textScreen[ someIndex ] = someChar; textScreen[ someIndex+1 ] = someAttrib;