當(dāng)我第一次開(kāi)始使用 DOS 時(shí),我喜歡 DOS 自帶的 BASIC 來(lái)編寫(xiě)游戲和其它一些有趣的程序。很長(zhǎng)時(shí)間后,我才學(xué)習(xí) C 編程語(yǔ)言。
我馬上愛(ài)上了使用 C 語(yǔ)言做開(kāi)發(fā)!它是一種簡(jiǎn)單易懂的編程語(yǔ)言,在編寫(xiě)有用的程序時(shí),這給予我很大的靈活性。實(shí)際上,很多 FreeDOS 的核心實(shí)用程序都是使用 C 語(yǔ)言和匯編語(yǔ)言編寫(xiě)的。
因此,F(xiàn)reeDOS 的 1.3 RC4 包含一個(gè) C 語(yǔ)言可能并不出人意料,此外還有其它編程語(yǔ)言的編譯器。FreeDOS 的 1.3 RC4 LiveCD 包含兩個(gè) C 編譯器:Bruce's C 編譯器(一個(gè)簡(jiǎn)單的 C 編譯器)和 OpenWatcom C 編譯器 。在 Bonus CD 上,你也可以找到 DJGPP(一款基于 GNU 的 GCC 的 32 位 C 編譯器)和 GCC 的 IA-16 移植(需要 386 或更好的 CPU 來(lái)編譯,但是,生成的程序可以在低端系統(tǒng)上運(yùn)行)。
在 FreeDOS 上使用 C 語(yǔ)言編程與在 linux 上使用 C 語(yǔ)言編程非常類似,但是有兩個(gè)例外:
- 你需要知道你使用了多少內(nèi)存。 Linux 允許程序使用很多內(nèi)存,但是 FreeDOS 有很多限制。DOS 程序只使用四種 ??內(nèi)存模式??(大、中、緊湊和小)中的其中一種,具體取決于它們需要多少內(nèi)存。
- 你可以直接訪問(wèn)控制臺(tái)終端。 在 Linux 上,你可以創(chuàng)建 文本模式 的程序,使用一個(gè)諸如 ncurses 之類的庫(kù)來(lái)繪制終端屏幕。但是,DOS 允許程序訪問(wèn)控制臺(tái)終端和視頻硬件。這為編寫(xiě)更有趣的程序提供了極大的靈活性。
我喜歡在 GCC 的 IA-16 移植或 OpenWatcom 中編寫(xiě)我的 C 程序,具體取決于我正在編寫(xiě)的是哪種程序。OpenWatcom C 編譯器更容易安裝,因?yàn)樗皇莻€(gè)單一的軟件包。這就是為什么我們?cè)?FreeDOS 的 LiveCD 中提供 OpenWatcom 的原因, 在你安裝 FreeDOS 的 1.3 RC4 時(shí),如果你選擇 “完全的安裝(包括安裝應(yīng)用程序和游戲)Full installation including Applications and games”,那么你也自動(dòng)地安裝 OpenWatcom。如果你選擇安裝 “純 DOS 系統(tǒng)Plain DOS system”,那么,你將需要使用 FDIMPLES 軟件包管理器來(lái)安裝 OpenWatcom C 編譯器。
在 FreeDOS 1.3 RC4 上安裝 OpenWatcom
在 DOS 上使用 C 語(yǔ)言編程
你可以在 ??OpenWatcom 項(xiàng)目網(wǎng)站?? 找到文檔和庫(kù)指南,以學(xué)習(xí) OpenWatcom C 編譯器所提供的獨(dú)特的關(guān)于 DOS 的 C 語(yǔ)言編程庫(kù)。簡(jiǎn)單描述幾個(gè)最有用的函數(shù):
來(lái)自 ??conio.h?
? 頭文件:
- ?
?int getch(void)?
?:從鍵盤(pán)上獲取一個(gè)按下的單個(gè)按鍵 - ?
?int getche(void)?
?:從鍵盤(pán)上獲取一個(gè)按下的單個(gè)按鍵,并回顯該按鍵
來(lái)自 ??graph.h?
? 頭文件:
- ?
?_settextcolor(short color)?
?:設(shè)置打印文本時(shí)的顏色 - ?
?_setbkcolor(short color)?
?:設(shè)置打印文本時(shí)的背景顏色 - ?
?_settextposition(short y, short x)?
?:移動(dòng)光標(biāo)到行 ??y?
? 和 列 ??x?
? - ?
?_outtext(char _FAR *string)?
?:從當(dāng)前光標(biāo)位置開(kāi)始,直接將一串字符打印到屏幕
DOS 只支持 ??16 種文本顏色?? 和 8 種背景顏色。你可以使用值 0(黑色)到 15(亮白色)來(lái)具體指定文本顏色,以及使用值 0(黑色)到 7(白色)來(lái)具體指定背景顏色:
- ?
?0?
?:黑色 - ?
?1?
?:藍(lán)色 - ?
?2?
?:綠色 - ?
?3?
?:品藍(lán)色 - ?
?4?
?:紅色 - ?
?5?
?:品紅色 - ?
?6?
?:棕色 - ?
?7?
?:白色 - ?
?8?
?:亮黑色 - ?
?9?
?:亮藍(lán)色 - ?
?10?
?:亮綠色 - ?
?11?
?:亮品藍(lán)色 - ?
?12?
?:亮紅色 - ?
?13?
?:亮品紅色 - ?
?14?
?:黃色 - ?
?15?
?:亮白色
一個(gè)花哨的 “Hello world” 程序
很多新開(kāi)發(fā)者學(xué)習(xí)編寫(xiě)的第一個(gè)程序是為用戶打印 “Hello world” 。我們可以使用 DOS 的 ??conio?
? 和 ??graphics?
? 庫(kù)來(lái)制作一個(gè)更有趣的程序,并使用彩虹般的顏色打印 “Hello world” 。
在這個(gè)實(shí)例中,我們將遍歷每種文本顏色,從 0(黑色)到 15(亮白色)。隨著我們打印每一行,我們都將為下一行縮進(jìn)一個(gè)空格。在我們完成后,我們將等待用戶按下任意按鍵,然后,我們將重置屏幕并退出。
你可以使用任何文本編輯器來(lái)編寫(xiě)你的 C 源文件代碼。我喜歡使用一些與眾不同的編輯器,如 ??FreeDOS Edit?? 和 ??Freemacs??,但是,我最近一直在使用 ??FED editor?? ,因?yàn)樗峁?nbsp;語(yǔ)法高亮 功能,使其很容易在我的程序源文件代碼中看到關(guān)鍵字、字符串(LCCT 譯注:C 語(yǔ)言中沒(méi)有字符串)、變量。
使用 C 語(yǔ)言編寫(xiě)一個(gè)簡(jiǎn)單的測(cè)試程序
在你使用 OpenWatcom 編譯前,你將需要設(shè)置 DOS 的 ??環(huán)境變量??,以便 OpenWatcom 可以找到它的支持文件。OpenWatcom C 編譯器軟件包中包含了一個(gè)為你做這件事的設(shè)置 ??批處理文件??:??DEVELOWOWSETENV.BAT?
?。運(yùn)行這個(gè)批處理文件可以自動(dòng)為你的 OpenWatcom 設(shè)置環(huán)境變量。
在你的開(kāi)發(fā)環(huán)境準(zhǔn)備好后,你可以使用 OpenWatcom 編譯器來(lái)編譯這個(gè) “Hello world” 程序。我已經(jīng)將我的 C 源文件文件保存為 ??TEST.C?
? ,因此,我可以輸入 ??WCL TEST.C?
? 來(lái)編譯和連接該程序?yàn)橐粋€(gè)名稱為 ??TEST.EXE?
? 的 DOS 可執(zhí)行文件。在 OpenWatcom 的輸出信息中,你將看到 ??WCL?
? 實(shí)際上調(diào)用 OpenWatcom C 編譯器(??WCC?
?)來(lái)編譯,并調(diào)用 OpenWatcom 鏈接器(??WLINK?
?)來(lái)執(zhí)行 對(duì)象/目標(biāo)object
使用 OpenWatcom 編譯測(cè)試文件
OpenWatcom 會(huì)打印一些無(wú)關(guān)的輸出信息,這可能會(huì)使發(fā)現(xiàn)錯(cuò)誤和警告變得困難。為了告訴編譯器來(lái)抑制這些大量的額外信息,請(qǐng)?jiān)诰幾g時(shí)使用 ??/Q?
?(“Quiet”)選項(xiàng):
使用 OpenWatcom 編譯
在編譯 C 源文件文件時(shí),如果你沒(méi)有看到任何錯(cuò)誤信息,那么你現(xiàn)在就可以運(yùn)行你的 DOS 程序了。這個(gè) “Hello World” 示例的程序名稱是 ??TEST.EXE?
? 。在 DOS 命令行中輸入 ??TEST?
? 來(lái)運(yùn)行新的程序,你應(yīng)該會(huì)看到這個(gè)非常漂亮的輸出:
運(yùn)行測(cè)試程序
C 語(yǔ)言是一種非常高效的編程語(yǔ)言,在像 DOS 之類的資源有限的系統(tǒng)上進(jìn)行編程也可以很好的工作。在 DOS 上,你可以使用 C 語(yǔ)言來(lái)做更多的事。如果你是 C 語(yǔ)言的初學(xué)者,那么,你可以跟隨我們?cè)?FreeDOS 網(wǎng)站上的 《??使用 C 語(yǔ)言編寫(xiě) FreeDOS 程序??》 的自學(xué)電子書(shū),以及在 ??FreeDOS YouTube 頻道?? 上的配套的 入門(mén)指南how-to
(題圖:MJ:Legacy sci-fi computer programming::1.7 celestial::1 edison bulb::1 satellite imagery::1 wooden::1 in high resolution, very detailed, 8k)