2014-04-16 54 views
3

我有這個項目:用現代編譯器將C/C++程序編譯爲CP/M-86可執行文件(CMD文件)。目標架構是16位x86。你可能會認爲我很瘋狂,但我爲了好玩而學習了CP/M-86和低級x86編程。我該如何編譯C/C++到CP/M-86可執行文件(CMD)

我對x86彙編程序編程知之甚少,但我做了一個「Hello World」示例,可以使用ASM86和GENCMD生成CMD文件。它的工作原理。 ASM86是CP/M-86的彙編程序,它將生成一個H86文件,也就是(據我所知)Intel Hex Code。 GENCMD讀取這個HEX文件並創建CMD可執行文件。 CMD是從DOS和Windows獲知的EXE可執行文件的CP/M-86等效文件。

我有一個「現代」工具,它將編譯和鏈接16位x86 NASM代碼並輸出一個可在我的CP/M-86機器上運行的工作CMD--完全在我的Linux機器上構建。但是,我需要一個C/C++編譯器來創建這個兼容的NASM代碼。或者,也許某種平坦的二進制文件很容易轉換成CMD。

第二件事是系統調用。我可以使用內聯彙編和測試來製作一個類似打印的功能。現在我只想編譯這個程序,這並不做任何事情(希望沒有做任何系統調用):

int main() 
{ 
    return 0; 
} 

C編譯器確實存在CP/M-86,但這些都是非常,非常舊的和幾乎不可用的。特別是如果我想要做C++,就像我真正想要的那樣。所以,它必須用像gcc或llvm-clang之類的現代編譯器或類似的東西來完成。

最後的手段可能是編譯一個16位DOS兼容EXE,然後做一些系統調用翻譯......但這將是一種作弊,仍然相當耗時。

我該如何達到目標?提前致謝。任何建議表示讚賞:-)

+2

[Watcom](http://www.openwatcom.org/index.php/Main_Page)仍然保留並支持生成16位可執行文件,可能需要檢查它。 –

+0

有C子集編譯成非常小的處理器。麻省理工學院的媒體實驗室使用了其中一些。 – Jiminion

+1

你真的是指CP/M x86還是DOS? CP/M已經死了很多年了。 –

回答

1

我怎樣才能達到我的目標?

如果你有工作C編譯器,那麼我認爲llvm-cbe是你在找什麼。這是clang-llvm(以及我認爲的任何llvm編譯器)的後端,它採用llvm中間表示(IR)並將其轉換爲C。因此,您可以編譯任何具有c編譯器的機器的C++ 17代碼。

關於

int main() 
{ 
    return 0; 
} 

在Linux上的代碼將調用open/close(以及其他文件相關的東西),因爲與stdout/stderr/stdinlibc工作還調用它exit_group,我不知道MS-DOS,但它應該至少以某種方式將退出代碼報告給系統。