寻找16位x86编译器

时间:2008-10-22 22:29:04

标签: c++ compiler-construction embedded x86-16

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

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

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

我的问题是:

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

是否还有其他C ++编译器可以执行此操作?

10 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:7)

This google search显示了一系列用于将gcc设置为交叉编译器的链接。为了使它能够定位除标准ELF二进制文件以外的其他东西,您可以对输出进行frig。 This link讨论了排除标准库和自定义输出格式。你可能不得不做一些摆弄工作。

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

答案 3 :(得分:4)

GCC 4.3有一个补丁: New back end ia16: 16-bit Intel x86

here's an update for it。请注意,它可能不能很好地工作,例如,更新的帖子说:“现在支持构造函数和析构函数,但由于某种原因,   只适用于麋鹿配置。“

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

我还没有设法制作DOS二进制文件:How do I assemble GAS assembly and link it with the Open Watcom C library?

答案 4 :(得分:4)

2014年的最新信息是 Dev86

答案 5 :(得分:3)

查看bcc,它是一个16位x86 C编译器。例如,还有Debian packages for it

答案 6 :(得分:3)

我目前正在使用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 :(得分:1)

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

答案 8 :(得分:0)

自从我看过Paradigm的东西已经很久了(它们还在吗?) - 你确定它们没有编译器的命令行等价物吗?我的回忆是它们是建立在Borland的编译器工具链之上的......所以也许Borland编译器的旧版本可以解决这个问题?

- 啊,看起来更进一步,我发现Paradigm仍在(www.devtools.com)销售X86工具。 (必须是摇钱树!)

他们的专业产品包括脚本......根据您计划的工作量,可能值得咬紧牙关并购买他们的全部产品......

祝你好运。

答案 9 :(得分:0)