如何编译Java或C++应用程序生成的代码

问题描述:

我一直在学习编译器理论和程序集,并设法创建一个生成x86汇编代码的编译器。如何编译Java或C++应用程序生成的代码

我怎样才能把这个汇编代码变成一个.exe?是否有一些神奇的API或工具需要与之交互?或者比我想象的更简单?

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

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

请注意,如果我将生成的程序集编译为.exe就好了,例如使用vC++。


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

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

+0

谢谢。在窗户上怎么样? – Cam 2010-06-19 16:11:11

+0

对不起,我一定错过了关于Windows的一点。它应该几乎相同,有CreateProcess()函数,并且汇编程序和链接程序可执行文件作为VS发行版的一部分进行安装(al.exe和link.exe)我建议您参阅CreateProcess的MSDN文档()以及。 – iksemyonov 2010-06-19 16:25:56

+0

很酷,谢谢。我其实并没有在我的问题中提到过窗口 - 可能应该有:) – Cam 2010-06-19 16:34:02

通常情况下,您使用汇编程序和链接器来创建一个exe文件。没有涉及的魔法。不同的部分被组装在一起,添加了一个头文件和其他样板文件,以便操作系统知道引导程序代码位于程序的位置并组织内存。

VC++编译器在底层实现了这个功能。您可能会考虑在Linux上玩一下,因为您可以更好地看到在Unix平台上工作的机器。它基本上是一样的,但在Windows上浏览UI很困难。

原则上,每条装配线对应于一个机器指令,它只是exe文件中的几个字节。你可以在处理器的规格中找到它们。所以如果你知道代码和exe格式(标题,重定位信息等),你可以编写自己的asembeler。

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