Pau*_*han 12 c++ compiler-construction embedded x86-16
我正在研究一个嵌入式系统项目,并遇到了编译器的问题,该编译器以编程方式嵌入到Paradigm C++ IDE中.我希望能够自动化建设.
处理器是AMD186ES.我没有使用操作系统 - 只是裸机的东西.我需要从C++生成实模式16位8086机器代码.
我的谷歌搜索表明G ++可以构建这样的代码.
我的问题是:
可以配置g ++来构建这个机器代码吗?
还有其他C++编译器可以做到吗?
这个谷歌搜索显示了一系列链接,用于将gcc设置为交叉编译器.为了使它能够定位除标准ELF二进制文件以外的其他东西,您可以对输出进行frig. 此链接讨论排除标准库和自定义输出格式.您可能需要做一些摆弄才能让它发挥作用.
作为替代方案,openwatcom.org有一个Watcom C编译器的开源版本,它也可以做你想要的.
我目前正在使用 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加载。
GCC 4.3 有一个补丁:新后端 ia16:16 位 Intel x86
这是它的更新。请注意,它可能无法很好地工作,例如,更新后的帖子说:“现在支持构造函数和析构函数,但出于某种原因,它们仅适用于 elks 配置。”
这个 Docker 容器有一个构建:https : //registry.hub.docker.com/u/ysangkok/ia16-gcc-rask
我还没有设法制作 DOS 二进制文件:如何组装 GAS 程序集并将其与 Open Watcom C 库链接?