【问题标题】:How to compile code generated by a Java or C++ App如何编译由 Java 或 C++ 应用程序生成的代码
【发布时间】:2010-06-19 15:44:51
【问题描述】:

我一直在学习编译器理论和汇编,并设法创建了一个可以生成 x86 汇编代码的编译器。

如何获取此汇编代码并将其转换为 .exe?是否有一些我必须与之交互的神奇 API 或工具?还是比我想象的要简单?

我不确定 .exe 中有什么,或者汇编代码和 .exe 本身之间有多少抽象。

我的“编译器”是用 Java 编写的,但我也想知道如何在 C++ 中执行此操作。

请注意,如果我使用生成的程序集,它可以编译为 .exe,例如使用 vc++。


编辑:更准确地说,我已经知道如何使用编译器编译汇编代码。我想要的是让我的程序基本上输出一个 .exe。

【问题讨论】:

    标签: java c++ assembly compilation exe


    【解决方案1】:

    看起来您需要生成一个汇编器进程和一个链接器进程。在 UNIX 上,它就像调用 fork() 函数(将创建一个新进程)和 exec() 函数一样简单,将汇编器和链接器可执行文件名称指定为函数的参数,并为这些可执行文件提供合适的参数,这将是您生成的程序集和目标文件的名称。这就是您在 UNIX 系统上需要做的所有事情。

    【讨论】:

    • 谢谢。在 Windows 上呢?
    • 抱歉,我一定错过了关于 Windows 的要点。它应该几乎相同,有 CreateProcess() 函数,并且汇编器和链接器可执行文件作为 VS 发行版的一部分安装(al.exe 和 link.exe) 我建议您查阅 MSDN 文档以了解 CreateProcess () 也是如此。
    • 酷,谢谢。我实际上并没有在我的问题中提到窗户 - 可能应该有:)
    【解决方案2】:

    通常您使用汇编器和链接器来创建 exe 文件。没有魔法。组装不同的部分,添加标题和其他样板,以便操作系统知道程序的引导代码位于何处并组织内存。

    VC++ 编译器在后台执行此操作。您可能会考虑在 Linux 上玩一下,因为您可以更好地了解在 Unix 平台上运行的机器。本质上是一样的,只是很难看透windows上的UI。

    【讨论】:

      【解决方案3】:

      原则上,每条流水线对应一条机器指令,在exe文件中只有几个字节。您可以在处理器的规格中找到它们。因此,如果您知道代码和 exe 格式(标头、重定位信息等),您可以编写自己的汇编程序。

      How Do Assemblers Map x86 Instruction Mnemonics to Binary Machine Instructions?

      【讨论】:

        猜你喜欢
        • 2010-11-24
        • 1970-01-01
        • 2017-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-21
        • 2017-06-06
        • 1970-01-01
        相关资源
        最近更新 更多