我一直在学习编译器理论和汇编,并设法创建一个生成x86汇编代码的编译器。
如何获取此汇编代码并将其转换为.exe?是否有一些神奇的API或工具我必须与之互动?还是比我想的更简单?
我不确定.exe中有什么,或者汇编代码和.exe本身之间有多少抽象。
我的'编译器'是用Java编写的,但我也想知道如何在C ++中这样做。
请注意,如果我使用生成的程序集,它会编译为.exe就好了,例如使用vc ++。
编辑:更确切地说,我已经知道如何使用编译器编译汇编代码。我想要的是让我的程序基本上输出.exe。
答案 0 :(得分:1)
看起来您需要生成汇编程序进程和链接程序进程。在UNIX上,它就像调用fork()
函数(它将创建一个新进程)和exec()
函数一样简单,指定汇编器和链接器可执行文件名作为函数的参数,并使用适当的参数可执行文件,它们是生成的程序集和目标文件的名称。这就是你在UNIX系统上需要做的所有事情。
答案 1 :(得分:0)
通常使用汇编程序和链接器来创建exe文件。没有魔法参与。组装不同的部件,添加标题和其他样板,以便操作系统知道程序代码所在的位置以及组织内存。
VC ++编译器在幕后做了这件事。你可以考虑在Linux上玩一点,因为你可以更好地看到在Unix平台上工作的机器。它基本上是相同的,但很难在Windows上查看UI。
答案 2 :(得分:0)
原则上,每个装配线对应于一个机器指令,它只是exe文件中的几个字节。您可以在处理器的规格中找到它们。因此,如果您知道代码和exe格式(标题,重定位信息等),您可以编写自己的asembeler。
How Do Assemblers Map x86 Instruction Mnemonics to Binary Machine Instructions?