寻找16位x86编译器 我正在研究一个嵌入式系统项目,并且已经遇到了一个编译程序嵌入到C++ C++ IDE中的问题。我希望能够自动化建设

寻找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编译器,但您将有几个潜在的大问

处理器是AMD186ES。我不是在使用操作系统——只是纯金属的东西。 我需要从C++生成实模式16位8086机器代码。p> 我的谷歌搜索表明G++可以构建这样的代码

我的问题是:

是否可以将g++配置为生成此机器代码

<> P>还有其他C++编译器可以做到吗?

你最好的办法是,其中包括C++编译器。早在90年代初到中期,我相信这是最好的C/C++编译器。几年前它是开源的。

你的芯片供应商(我想是AMD)没有针对该芯片的编译器的指针吗

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

  • 获取不依赖BIOS或MS-DOS的编译器库
  • 调试
  • 嵌入式系统的链接器通常支持在特定内存区域中定位代码。DOS编译器中通常不包含这种功能,但您可能会找到某种链接器/定位器来为您实现这一功能
  • 仍受支持并生成16位代码的编译器有:

    显示了将gcc设置为交叉编译器的一系列链接。要使它以标准ELF二进制以外的对象为目标,您可以冻结输出。讨论排除标准库和自定义输出格式。你可能得做些手脚才能使它发挥作用


    另一种选择是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文件,还是会被剥离为无操作系统二进制文件?@paulNathan
    ld--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