我想做一个简单的编译器,我想把一个像print ("Hello world!")这样的输入,用C++把它变成计算机可以读取的东西。我不想使用任何中间编译器,如NASM,但我想要一种方法,将其直接转换为exe,而无需Windows中没有的任何工具。所以我真的有两个问题:如何从lexer中获取指令并将其转换为机器代码,然后如何运行它?任何帮助都非常感谢。(我的处理器是i7- 9750 h,我运行的是Windows 11)
print ("Hello world!")
pwuypxnk1#
Windows对可执行EXE文件使用PE(可移植可执行文件)文件格式。本机运行任何代码的基本要求是生成PE文件。这并不复杂,网上也有例子。对于打印“Hello World”的程序,PE文件需要包括来自kernel32.dll的一些Windows API函数的Import-Table,例如WriteFile。当然,还有一个文本部分和一些代码来调用它。我可以向你推荐我两年前在github上发布的一个项目,它针对C子集语言做了同样的事情:https://github.com/urutech/nanocc我认为很酷的是,如果你的程序使用print函数(WriteFile)来生成一个PE文件,那么你就有了一个不依赖任何外部工具的 Bootstrap 编译器的起点。第一个版本需要使用现有的编译器编写,或者将十六进制代码发送到文件中。至少你需要的外部工具:向文件发送二进制十六进制代码。一个灵感可能是看看有人是如何从无到有地引导一个微型编译器的:https://github.com/smtlaissezfaire/bcompiler的
1条答案
按热度按时间pwuypxnk1#
Windows对可执行EXE文件使用PE(可移植可执行文件)文件格式。本机运行任何代码的基本要求是生成PE文件。这并不复杂,网上也有例子。
对于打印“Hello World”的程序,PE文件需要包括来自kernel32.dll的一些Windows API函数的Import-Table,例如WriteFile。当然,还有一个文本部分和一些代码来调用它。
我可以向你推荐我两年前在github上发布的一个项目,它针对C子集语言做了同样的事情:https://github.com/urutech/nanocc
我认为很酷的是,如果你的程序使用print函数(WriteFile)来生成一个PE文件,那么你就有了一个不依赖任何外部工具的 Bootstrap 编译器的起点。第一个版本需要使用现有的编译器编写,或者将十六进制代码发送到文件中。至少你需要的外部工具:向文件发送二进制十六进制代码。一个灵感可能是看看有人是如何从无到有地引导一个微型编译器的:https://github.com/smtlaissezfaire/bcompiler的