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

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

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

我的问题是:

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

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

有帮助吗?

解决方案

我目前正在使用gnu 作为(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 0x7c00

<*>

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

其他提示

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

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

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

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

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

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

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

2014年的最新信息是 Dev86

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

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

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

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

查看密送,这是一个16位x86 C编译器。例如,还有 Debian软件包

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

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

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

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

祝你好运。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top