寻找16位x86编译器

Pau*_*han 12 c++ compiler-construction embedded x86-16

我正在研究一个嵌入式系统项目,并遇到了编译器的问题,该编译器以编程方式嵌入到Paradigm C++ IDE中.我希望能够自动化建设.

处理器是AMD186ES.我没有使用操作系统 - 只是裸机的东西.我需要从C++生成实模式16位8086机器代码.

我的谷歌搜索表明G ++可以构建这样的代码.

我的问题是:

可以配置g ++来构建这个机器代码吗?

还有其他C++编译器可以做到吗?

Sim*_*ard 10

你最好的选择可能是OpenWatcom,其中包括一个C++编译器.早在90年代中期,我相信这是最好的C/C++编译器.几年前它是开源的.


Mic*_*urr 7

您的芯片供应商(AMD,我猜)是否对芯片的编译器有任何指示?

如果没有,你可能可以使用一些16位DOS编译器 - 但你会遇到几个潜在的大问题:

  1. 获取不依赖于BIOS或MS-DOS的编译器库
  2. 调试
  3. 嵌入式系统的链接器通常具有在特定内存区域中定位代码的特定支持.这通常不包含在DOS的编译器中,但是您可以找到某种类型的链接器/定位器,它们可以帮助您.

一些仍然受支持并生成16位代码的编译器是:


Con*_*lls 7

这个谷歌搜索显示了一系列链接,用于将gcc设置为交叉编译器.为了使它能够定位除标准ELF二进制文件以外的其他东西,您可以对输出进行frig. 此链接讨论排除标准库和自定义输出格式.您可能需要做一些摆弄才能让它发挥作用.

作为替代方案,openwatcom.org有一个Watcom C编译器的开源版本,它也可以做你想要的.


Haw*_*ken 7

我目前正在使用 gnu as(binutils 的一部分和用于 gcc 的汇编程序)并且我已经成功地使用以下内容组装了 16 位汇编代码:

as <file>
ld --oformat binary -Ttext 0x0 -e start <file>
Run Code Online (Sandbox Code Playgroud)

我的汇编文件开始于:

.code16
.globl start
.text
start:
Run Code Online (Sandbox Code Playgroud)

因为它是简单的二进制文件,省略了这些行,

.globl start
start:
Run Code Online (Sandbox Code Playgroud)

即使平面二进制文件不需要入口点,也只会产生警告。


我通过艰难的方式学到的东西;

-Ttext 0x0
Run Code Online (Sandbox Code Playgroud)

很关键,否则该.text段会被推到 16 位寻址范围之外(不要问我为什么)

我个人还在学习汇编,所以这只是我的方式,不一定是最好的方式。


编辑: 如果您正在编写引导代码,则应该更改

-Ttext 0x0
Run Code Online (Sandbox Code Playgroud)

-Ttext 0x7c00
Run Code Online (Sandbox Code Playgroud)

这将抵消您的内存地址,0x7c00因为引导代码通常0x7c00由 BIOS加载。


Dav*_*itt 5

看看bcc,它是一个 16 位 x86 C 编译器。例如,它也有Debian 软件包


Jan*_*sen 5

GCC 4.3 有一个补丁:新后端 ia16:16 位 Intel x86

是它的更新。请注意,它可能无法很好地工作,例如,更新后的帖子说:“现在支持构造函数和析构函数,但出于某种原因,它们仅适用于 elks 配置。”

这个 Docker 容器有一个构建:https : //registry.hub.docker.com/u/ysangkok/ia16-gcc-rask

我还没有设法制作 DOS 二进制文件:如何组装 GAS 程序集并将其与 Open Watcom C 库链接?