目标(我想做什么):我正在尝试学习机器代码,因为我想制作自己编译的编程语言。但是当我开始学习汇编和机器代码时,我意识到机器代码会因操作系统而异。知道了这一点,我改变了学习机器代码的目标,学习了Windows / Intel Core处理器的机器代码。然后,我意识到当我试图学习如何制作.exe文件时(我正在研究它2年,所以我只是查找了与机器代码相关的任何东西,因为我很绝望),我在WikiHow上看到了一篇文章。它不是二进制或对应于二进制数的Unicode字符,它是汇编!这就是我意识到我可以将汇编语言放在.exe文件中以使其工作的方式。不幸的是,WikiHow的例子没有用,但我仍然觉得某种类型的汇编会起作用。
问题:问题是我不知道哪种类型的程序集能够在我的计算机上的.exe文件(或可执行文件)中工作。
问题:在没有任何编译器/汇编程序编译汇编代码的情况下,可以从可执行文件运行哪种类型的程序集? (使用Windows 64位,Intel Core i5-6400T CPU)
我做了多少尝试:注意:如果我列出了我尝试过的所有内容,你就会厌倦阅读这篇文章。所以我只会说到目前为止我尝试解决问题的部分内容。
真的很感激帮助。
答案 0 :(得分:3)
问题:问题在于我不知道哪种类型的装配 将能够在我的.exe文件(或可执行文件)中工作 计算机。
问题:可以从可执行文件运行什么类型的程序集 没有任何编译器/汇编程序编译汇编代码? (使用 Windows 64位,Intel Core i5-6400T CPU)
有些例外情况会发生这种情况。但是没有汇编语言直接执行。汇编语言是一种人类可读/可写的机器代码形式。要使它更有用,远远不止于此,但是你的代码的一定百分比是映射到指令的语法,理想情况是一对一行的asm到单个机器代码指令。
编译器,C等编译成汇编语言然后编译器调用汇编程序将其转换为目标文件,然后根据您使用的编译器的方式/可以调用链接器将其转换为最终的可执行文件操作系统理解。
操作系统倾向于支持非常有限数量的二进制格式。众所周知的操作系统,窗口,Linux等的二进制格式对谷歌来说是微不足道的,并且可以在具有详细信息的页面上查找详细信息。即使使用相同的文件格式,例如elf,操作系统也是它自己的东西,它有关于二进制文件必须包含什么以及二进制文件必须如何为该操作系统运行的规则。使用相同的硬件,相同的物理PC,运行DOS,Linux,Windows,OSX,以及二进制格式和这些二进制文件包含的规则,特别是系统调用操作系统以及用它们包装的内容,变化。已存在的汇编器和链接器知道该操作系统和目标指令集的二进制格式。如果你想制作一种语言,那么你从前端开始,然后做整个项目中最复杂的部分。一旦超过中间,将高级语言转换为可消化的原子操作,然后可以通过后端将其移植到一个或多个指令集中。操作系统调用由库处理,通常不一定是语言,JAVA,Python和其他一些例外。因此,C中的printf链接到一个C库,该库具有目标和操作系统特定的汇编语言,以将该层桥接到操作系统中,其中一些百分比(对于printf为巨大的)代码理想地使用相同的语言并编译然后编译或者通常在过去的某个时间进入可链接的库。
老实说,通过检查一些小到可以理解的简单工具,听起来你还没准备好制作一个你需要学习一些基础知识的编译器。查找课程材料或在线/免费课程(或书籍/书籍),其中包括这些基本工具主题,汇编程序和链接程序,然后是编译器。看一下像pascal或ada这样的语言,这些语言有点松散,更容易解析并变成C / C ++之类的东西。不要因为教育原因而看gnu或llvm或其他大项目,他们不是正确的道路。一旦你进入gnu,你会发现它几乎没有用胶带和捞丝。 LLVM有一些很好的文档,它们与实际的工具不匹配,可能很多年前但不再存在。随着时间的推移,它也在积累管道胶带和捞丝,在这方面需要一段时间才能赶上gnu,但我预计它最终会成为这类项目的性质。
许多(如果不是全部)计算机科学课程都有编译器课程,为了让学生在一个学期内有任何成功的机会,编译语言和使用现有工具都是为此而调整的。去找一些这些类(谷歌是你的朋友),在github或其他地方,你会发现偶尔发布他们代码的学生。这通常是认为他们打成本垒打的情况,但通常更多的是我几乎没有让它工作。但无论是在本垒打还是其他情况下,都假设他们通过了该解决方案的课程,因此理论上它可以消化,因为这是一个学期的工作,数十小时。
简短回答:
您无法执行汇编语言,处理器执行机器代码,机器代码是特定于PROCESSOR而非操作系统。
二进制文件,.exe,elf,coff,com,ihex,srec等并非特定于操作系统,但操作系统将支持一组有限的,可能只有一种文件格式。 / p>
您的操作系统存在一个汇编程序和链接程序,它知道目标计算机代码并知道可执行文件格式。与其他编译器作者一样,如果您希望发明一种新语言并为其编写编译器,那么请编译成汇编语言,然后让这些工具完成剩下的工作。这称为工具链,工具链(编译器,汇编器,链接器)。您正在使用链中的编译器工具。