2014-04-16 45 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,但它应该至少以某种方式将退出代码报告给系统。