寻找16位x86编译器

问题描述 投票:0回答:10

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

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

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

我的问题是:

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

还有其他 C++ 编译器也可以做到这一点吗?

c++ embedded x86-16
10个回答
11
投票

您最好的选择可能是OpenWatcom,它包含一个 C++ 编译器。 早在 90 年代初到中期,我相信这是最好的 C/C++ 编译器。 它是几年前开源的。


8
投票

我目前正在使用 gnu

as
(binutils 的一部分和用于 gcc 的汇编器),并且我已经成功地使用以下内容组装了 16 位汇编代码:

as <file>
ld --oformat binary -Ttext 0x0 -e start <file>

我的程序集文件开头为:

.code16
.globl start
.text
start:

因为它的纯二进制省略了行,

.globl start
start:

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


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

-Ttext 0x0

很关键,否则

.text
段会被推到16位寻址范围之外(不要问我为什么)

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


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

-Ttext 0x0

-Ttext 0x7c00

这将使您的内存地址偏移

0x7c00
,因为引导代码通常由 BIOS 在
0x7c00
处加载。


7
投票

你的芯片供应商(AMD,我猜)没有任何指向芯片编译器的指针吗?

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

  1. 获取不依赖于 BIOS 或 MS-DOS 的编译器库
  2. 调试
  3. 嵌入式系统的链接器通常对在特定内存区域中定位代码提供特定支持。 这通常不包含在 DOS 编译器中,但您也许可以找到某种链接器/定位器来满足您的需要。

仍然支持并生成 16 位代码的几个编译器是:


7
投票

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

作为替代方案,openwatcom.org 有一个开源版本的 Watcom C 编译器,它也可能能够执行您想要的操作。


6
投票

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


6
投票

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

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

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

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


4
投票

2014 年最新的是 Dev86


2
投票

不确定,但我认为旧版本的 borland c++ 能够做到这一点。 您可以下载 5.5 t 版本:这里 祝你好运



0
投票

自从我查看 Paradigm 的东西以来已经很长一段时间了(它们还在吗?)——你确定它们没有编译器的等效命令行吗? 我记得它们是建立在 Borland 编译器工具链之上的……所以也许旧版的 Borland 编译器可以解决这个问题?

-- 啊,再进一步看,我发现 Paradigm 仍然在(www.devtools.com)销售 X86 工具。 (一定是摇钱树!)

他们的专业产品包括脚本编写...根据您计划要做的工作量,硬着头皮购买他们的全套产品可能是值得的...

祝你好运。

© www.soinside.com 2019 - 2024. All rights reserved.