我有这个项目:用现代编译器将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,然后做一些系统调用翻译......但这将是一种作弊,仍然相当耗时。
我该如何达到目标?提前致谢。任何建议表示赞赏:-)
[Watcom](http://www.openwatcom.org/index.php/Main_Page)仍然保留并支持生成16位可执行文件,可能需要检查它。 –
有C子集编译成非常小的处理器。麻省理工学院的媒体实验室使用了其中一些。 – Jiminion
你真的是指CP/M x86还是DOS? CP/M已经死了很多年了。 –