【发布时间】:2014-05-31 22:23:15
【问题描述】:
我有这个项目:使用现代编译器将 C/C++ 程序编译为 CP/M-86 可执行文件(CMD 文件)。目标架构是 16 位 x86。你可能会认为我疯了,但我这样做是为了好玩,并且是为了了解 CP/M-86 和一般的低级 x86 编程。
我对 x86 汇编程序编程知之甚少,但我做了一个“Hello World”示例,我可以使用 ASM86 和 GENCMD 生成 CMD 文件。它有效。 ASM86 是一个用于 CP/M-86 的汇编程序,它将生成一个 H86 文件,即(据我所知)英特尔十六进制代码。 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;
}
确实存在用于 CP/M-86 的 C 编译器,但这些编译器非常非常陈旧且几乎无法使用。特别是如果我想做 C++,就像我真的想做的那样。所以,它必须使用现代编译器,如 gcc 或 llvm-clang 或类似的东西。
最后的手段可能是编译一个 16 位 DOS 兼容的 EXE,然后进行一些系统调用转换......但这有点作弊,而且仍然相当耗时。
我怎样才能达到我的目标?提前致谢。任何建议表示赞赏:-)
【问题讨论】:
-
Watcom 仍在维护中并支持生成 16 位可执行文件,可能需要检查一下。
-
有些 C 子集可以编译到非常小的处理器上。麻省理工学院的媒体实验室使用了其中的一些。
-
您的意思是 CP/M x86 还是 DOS? CP/M 已经死了很多年了。
-
@MarkRansom:凭记忆,但(幸运的是!)被维基百科证实:CMD was for CP/M what EXE is for DOS。有趣的任务——我想知道背景想法是什么。 CP/M太老了,刚开始的时候已经在淘汰了。
-
@Jongware 这让我相信“现代 C++ 编译器”和“CP/M”的目标完全不兼容。