我正在研究一个嵌入式系统项目,并且遇到了编译器的问题,该编译器以编程方式嵌入到Paradigm C ++ IDE中。我希望能够自动化建设。
处理器是AMD186ES。我没有使用操作系统 - 只是裸机的东西。 我需要从C ++生成实模式16位8086机器代码。
我的谷歌搜索表明G ++可以构建这样的代码。
我的问题是:
可以配置g ++来构建这个机器代码吗?
是否还有其他C ++编译器可以执行此操作?
答案 0 :(得分:10)
你最好的选择可能是OpenWatcom,其中包括一个C ++编译器。早在90年代中期,我相信这是最好的C / C ++编译器。几年前它是开源的。
答案 1 :(得分:7)
你的芯片厂商(AMD,我猜)是否对芯片的编译器有任何指示?
如果没有,你可能可以使用一些16位DOS编译器 - 但你会遇到几个潜在的大问题:
仍然支持并生成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)