寻找16位x86编译器 我正在研究一个嵌入式系统项目,并且已经遇到了一个编译程序嵌入到C++ C++ IDE中的问题。我希望能够自动化建设
处理器是AMD186ES。我不是在使用操作系统——只是纯金属的东西。 我需要从C++生成实模式16位8086机器代码。p> 我的谷歌搜索表明G++可以构建这样的代码 我的问题是: 是否可以将g++配置为生成此机器代码 <> P>还有其他C++编译器可以做到吗?寻找16位x86编译器 我正在研究一个嵌入式系统项目,并且已经遇到了一个编译程序嵌入到C++ C++ IDE中的问题。我希望能够自动化建设,c++,compiler-construction,embedded,x86-16,C++,Compiler Construction,Embedded,X86 16,处理器是AMD186ES。我不是在使用操作系统——只是纯金属的东西。 我需要从C++生成实模式16位8086机器代码。p> 我的谷歌搜索表明G++可以构建这样的代码 我的问题是: 是否可以将g++配置为生成此机器代码 P>还有其他C++编译器可以做到吗?你最好的办法是,其中包括C++编译器。早在90年代初到中期,我相信这是最好的C/C++编译器。几年前它是开源的。你的芯片供应商(我想是AMD)没有针对该芯片的编译器的指针吗 如果没有,您可能可以使用一些16位DOS编译器,但您将有几个潜在的大问
你最好的办法是,其中包括C++编译器。早在90年代初到中期,我相信这是最好的C/C++编译器。几年前它是开源的。
你的芯片供应商(我想是AMD)没有针对该芯片的编译器的指针吗 如果没有,您可能可以使用一些16位DOS编译器,但您将有几个潜在的大问题:另一种选择是Watcom C编译器的开放源代码版本,它也可以做您想要做的事情。看一看,这是一个16位x86 C编译器。例如,也有。
不确定,但我认为Borland C++的老版本能够做到这一点。 您可以下载5.5 t版:
祝你好运我已经很长时间没有研究范例了(它们还在吗?)——你确定它们没有编译器的命令行等价物吗?我记得它们是建立在Borland编译器工具链之上的。。。那么也许一个旧版本的Borland编译器就可以做到这一点 -- 啊,再进一步看,我发现Paradigm(www.devtools.com)仍然在销售X86工具。(一定是摇钱树!) 他们的专业产品包括脚本。。。根据你计划做的工作量,咬紧牙关购买他们的全部产品可能是值得的 祝你好运。80186免费C编译器:
我目前正在使用gnu
作为
(binutils的一部分和用于gcc的汇编程序),并且我已经成功地将16位汇编代码汇编成以下代码:
as <file>
ld --oformat binary -Ttext 0x0 -e start <file>
因为它的纯二进制省略了行
.globl start
start:
将只产生一个警告,即使平面二进制文件不需要入口点
我通过艰苦的方式学到了一些东西
-Ttext 0x0
是关键的,否则.text
段被推到16位寻址范围之外(不要问我为什么)
我个人还在学习组装,所以这只是我的方式,不一定是最好的方式
编辑:如果您正在编写引导代码,则应更改
-Ttext 0x0
到
这将使内存地址偏移
0x7c00
,因为BIOS通常在0x7c00
加载引导代码。GCC 4.3有一个补丁:
和。请注意,它可能工作得不太好,例如,更新后的帖子说:“现在支持构造函数和析构函数,但出于某种原因,它们是
仅在麋鹿配置上工作。”
此Docker容器具有其构建:
我还没有制作DOS二进制文件:根据2014年的最新版本是我得到了带有嵌入式板的“lite”版本。Watcom不知何故将编译器嵌入IDE可执行文件.IIRC中,生成了怪异的.objs。如果OpenWatcom不是这样,那么它可能是您的最佳选择,因为它为您提供了对代码的所有控制generation@JimR:是的,我认为MS的>16位工具基本上是单独使用COFF/**ar**来处理
.obj
和.lib
文件的;其他DOS系列工具似乎通常要么使用OMF(Borland、Watcom、Digital Mars、MS for 16位代码,…),要么将其文件命名为其他名称,如.o
和.a
(GNU工具链,可能还有来自*nix land的任何其他工具)。NT项目似乎在从*nix主机交叉开发NT时采用了*nix技术(COFF对象和ar存档),但保留了传统的DOS文件扩展名。奇妙的链接()似乎是我要写的东西<代码>inc%upvote有趣。这是否会产生elf文件、a.out文件,还是会被剥离为无操作系统二进制文件?@paulNathanld--oformat binary-Ttext 0x0-e start
将其剥离为无操作系统二进制文件;但是,这将内存地址设置为0x0000
如果您正在编写引导代码,请将-Ttext 0x0000
更改为-Ttext 0x7c00
,因为这是引导代码加载到内存中的位置。我已点击此答案作为答案,因为我认为任何关心这些东西的商店都可以很容易地用gcc找到c++->asm
路径。@PaulNathan-你完成了那条路径了吗?一些研究表明,GCC对段/远指针的理解不足可能是任何需要大于64K地址空间的东西的真正障碍。@ChrisStratton:我5年前就提出了这个问题。由于外部因素,这项工作在2009年被取消。从那以后我就再也没有回来过。很抱歉然而,如果GCC2.9没有得到分段内存,我会感到惊讶。看到了吗,8086太旧了吗?支持80186、80286或
-Ttext 0x0
-Ttext 0x7c00