如何编译Java或C++应用程序生成的代码
我一直在学习编译器理论和程序集,并设法创建一个生成x86汇编代码的编译器。如何编译Java或C++应用程序生成的代码
我怎样才能把这个汇编代码变成一个.exe?是否有一些神奇的API或工具需要与之交互?或者比我想象的更简单?
我不太确定.exe中有什么,或者汇编代码和.exe本身之间有多少抽象。
我的'编译器'是用Java编写的,但我想知道如何在C++中执行此操作。
请注意,如果我将生成的程序集编译为.exe就好了,例如使用vC++。
编辑:更确切地说,我已经知道如何使用编译器编译汇编代码。我想要的是让我的程序基本上输出一个.exe。
看起来你需要产生一个汇编程序进程和一个链接程序进程。在UNIX上,调用fork()
函数(这将创建一个新进程)和exec()
函数(指定汇编程序和链接程序可执行文件名称作为函数的参数)以及这些可执行文件的合适参数(这将是你生成的程序集和目标文件。这就是您在UNIX系统上需要做的所有事情。
通常情况下,您使用汇编程序和链接器来创建一个exe文件。没有涉及的魔法。不同的部分被组装在一起,添加了一个头文件和其他样板文件,以便操作系统知道引导程序代码位于程序的位置并组织内存。
VC++编译器在底层实现了这个功能。您可能会考虑在Linux上玩一下,因为您可以更好地看到在Unix平台上工作的机器。它基本上是一样的,但在Windows上浏览UI很困难。
原则上,每条装配线对应于一个机器指令,它只是exe文件中的几个字节。你可以在处理器的规格中找到它们。所以如果你知道代码和exe格式(标题,重定位信息等),你可以编写自己的asembeler。
How Do Assemblers Map x86 Instruction Mnemonics to Binary Machine Instructions?
谢谢。在窗户上怎么样? – Cam 2010-06-19 16:11:11
对不起,我一定错过了关于Windows的一点。它应该几乎相同,有CreateProcess()函数,并且汇编程序和链接程序可执行文件作为VS发行版的一部分进行安装(al.exe和link.exe)我建议您参阅CreateProcess的MSDN文档()以及。 – iksemyonov 2010-06-19 16:25:56
很酷,谢谢。我其实并没有在我的问题中提到过窗口 - 可能应该有:) – Cam 2010-06-19 16:34:02