【问题标题】:How can I compile C/C++ to a CP/M-86 executable (CMD)如何将 C/C++ 编译为 CP/M-86 可执行文件 (CMD)
【发布时间】: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”的目标完全不兼容。

标签: c++ c nasm 16-bit cpm


【解决方案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,但它至少应该以某种方式向系统报告退出代码。

【讨论】:

    猜你喜欢
    • 2012-08-10
    • 2011-06-13
    • 2016-05-08
    • 2021-12-06
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多