4

我有这个项目:使用现代编译器将 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,然后进行一些系统调用转换……但这有点作弊,而且仍然相当耗时。

我怎样才能达到我的目标?提前致谢。任何建议表示赞赏:-)

4

1 回答 1

1

我怎样才能达到我的目标?

如果你有工作C编译器,那么我认为llvm-cbe就是你要找的。这是 clang-llvm(以及我认为的任何 llvm 编译器)的后端,它采用 llvm 中间表示(IR)并将其转换为C. 所以你可以为任何有c编译器的机器编译你的 c++17 代码。

关于

int main()
{
    return 0;
}

在 linux 上,此代码将调用open/ close(和其他文件相关的东西),因为libcstdout/ stderr/一起工作stdin,它也会调用exit_group,我不确定 ms-dos,但它至少应该以某种方式向系统报告退出代码。

于 2017-07-19T12:17:43.830 回答