如何仅使用内置的Windows工具在.exe中打印“Hello world”

How to print "Hello world" in .exe with only built-in windows tools

提问人:GoogleCoder 提问时间:7/16/2023 更新时间:7/20/2023 访问量:321

问:

我正在尝试制作一个简单的编译器,我想在C++中获取输入并将其转换为计算机可以读取的内容。我不想使用任何像 NASM 这样的中间编译器,而是想要一种将其直接转换为 exe 的方法,而无需任何 Windows 附带的工具。因此,我真的有两个问题:如何从词法分析器中获取指令并将其转换为机器代码,然后如何运行它?print ("Hello world!")

任何帮助将不胜感激。(我的处理器是 i7-9750h,我运行的是 Windows 11)

Windows 程序集 二进制 编译器-构造 机械-代码

评论

1赞 Daemon-5 7/16/2023
.Net Framework 是现代 Windows 10/11 的一部分。 是 Framework 的 MS Visual C# 编译器(位于 中)。您可以使用它来编译任何代码以进行 hello-word 输出。csc.exeC:\Windows\Microsoft.NET\Framework\..
0赞 David Wohlferd 7/16/2023
根据您需要支持的操作,您可以尝试让词法分析器输出批处理文件(或.cmd文件)。因此会变成.与 Linux 相比,Windows 上的命令语言非常有限,但如果您的需求很简单,它可能就足够了。print("Hello world!")echo Hello world!
2赞 Luke 7/16/2023
“相反,我想要一种方法,可以将其直接转换为exe,而无需Windows附带的任何工具” 这就是所谓的编写编译器。
0赞 GoogleCoder 7/16/2023
@Luke我知道,但是我看到的关于这个主题的每个教程都使用外部工具,这就是为什么我想说清楚
0赞 Margaret Bloom 7/16/2023
为什么不想使用外部工具?为什么使用像样的文本编辑器或IDE而不是记事本会很糟糕?为什么使用编译器会很糟糕?要做什么?

答:

1赞 urutech 7/20/2023 #1

Windows 将 PE(可移植可执行文件)文件格式用于可执行 EXE 文件。本机运行任何代码本质上需要的是生成 PE 文件。它并不太复杂,网上有例子。

对于要打印“Hello World”的程序,PE 文件需要包含来自 kernel32.dll 的一些 Windows API 函数的 Import-Table,例如 WriteFile。当然,还有一个文本部分,其中包含一些代码来调用它。

我可以向你推荐我两年前在 github 上提出的一个项目,它对 C 子集语言来说正是这样做的:https://github.com/urutech/nanocc

我认为很酷的是,如果您的程序使用 print 函数 (WriteFile) 生成 PE 文件,那么您就拥有了一个不依赖任何外部工具的引导编译器的起点。第一个版本需要使用现有编译器编写,或者将十六进制代码发送到文件。至少你需要的外部工具:向文件发出二进制十六进制代码。一个灵感可能是看看有人如何从无到有地引导一个小型编译器:https://github.com/smtlaissezfaire/bcompiler