-3

我试图学习由处理器本机处理的代码或机器代码,因为我对构建解释性编程语言所花费的困难非常不满意。我没有创建一种实用的编程语言而不是 esolang,而是着手制作一种编译语言(编辑:正如 SO 所指出的那样,我这样做有很大的缺陷)

然而,当我开始学习汇编和机器码时,我意识到机器码会因操作系统而异。知道了这一点,我将学习机器代码的目标更改为学习 Windows/Intel Core 处理器的机器代码(编辑:你再次指出这是一个非常愚蠢的想法)。

然后,我意识到当我试图学习如何制作一个 .exe 文件时(我已经研究了 2 年,所以我只是查找与机器代码相关的任何内容,因为我很绝望),我在 WikiHow 上看到了一个帖子。它不是二进制或对应于二进制数的 Unicode 字符,它是汇编(编辑:这又是一个坏主意)!

这就是我如何(错误地)意识到我可以将汇编语言放在一个 .exe 文件中以使其工作。不幸的是,WikiHow 示例不起作用,但我仍然感觉某些类型的程序集会起作用。

问题:问题是我不知道哪种类型的程序集能够在我的计算机上的 .exe 文件(或可执行文件)中工作。

问题:在没有任何编译器/汇编器编译汇编代码的情况下,可以从可执行文件运行哪种类型的汇编?(使用 Windows 64 位,Intel Core i5-6400T CPU)

到目前为止我已经尝试过的内容:注意:如果我给出了我尝试过的所有内容的完整列表,你会厌倦阅读这篇文章。所以我只会说到目前为止我为解决问题所做的部分尝试。

  • 已尝试英特尔文档。
  • 已尝试查找机器代码教程
  • 尝试在 Commodore 64 模拟器中使用 6502 程序集,查看它生成的机器代码并运行它在可执行文件中返回的机器代码。
  • 已尝试查找组装教程
  • 尝试过 OllyDbg 为我反汇编文件,以便我可以理解汇编助记符变成机器代码
  • 查了组装教程
  • 查了机器码教程
  • 查了一下.exe
  • 查找英特尔酷睿文档

帮助真的很感激。

4

1 回答 1

3

问题:问题是我不知道哪种类型的程序集能够在我的计算机上的 .exe 文件(或可执行文件)中工作。

问题:在没有任何编译器/汇编器编译汇编代码的情况下,可以从可执行文件运行哪种类型的汇编?(使用 Windows 64 位,Intel Core i5-6400T CPU)

有些例外情况会发生这种情况。但是没有汇编语言直接执行。汇编语言是一种人类可读/可写的机器代码形式。使它更可用的意义远不止于此,但是您的代码中有一部分是映射到指令的语法,理想情况下是一对一行的 asm 到单个机器代码指令。

编译器、C 等编译为汇编语言,然后编译器调用汇编器将其转换为目标文件,然后根据您使用编译器的方式可以/将调用链接器将其转换为操作系统可以理解的最终可执行文件.

操作系统将倾向于支持数量非常有限的二进制格式。众所周知的操作系统、windows、linux 等的二进制格式对于谷歌来说是微不足道的,并且可以找到详细信息,只需几秒钟就可以到达包含详细信息的页面。即使使用相同的文件格式,例如 elf,操作系统是它自己的东西,它也有关于二进制文件必须包含什么以及二进制文件必须如何为该操作系统运行的规则。使用相同的硬件,完全相同的物理 PC,运行 DOS、Linux、Windows、OSX,以及二进制格式和这些二进制文件包含的规则,特别是操作系统中的系统调用以及您使用的包装,各不相同。已经存在的汇编器和链接器知道该操作系统和目标指令集的二进制格式。如果你想做一门语言,那么你从前端开始,然后做中间,整个项目中最复杂的部分。一旦你通过了中间,将高级语言转换为可消化的原子操作,然后可以通过后端移植到一个或多个指令集。操作系统调用由库处理,通常不一定是语言、JAVA、Python 和其他一些例外。因此,C 中的 printf 链接到一个 C 库,该库具有目标和操作系统特定的汇编语言,以将该层桥接到操作系统,其中一定百分比的代码(对于 printf 来说是巨大的)理想情况下使用相同的语言并随后编译或者通常在过去的某个时间进入可链接库。整个项目中最复杂的部分。一旦你通过了中间,将高级语言转换为可消化的原子操作,然后可以通过后端移植到一个或多个指令集。操作系统调用由库处理,通常不一定是语言、JAVA、Python 和其他一些例外。因此,C 中的 printf 链接到一个 C 库,该库具有目标和操作系统特定的汇编语言,以将该层桥接到操作系统,其中一定百分比的代码(对于 printf 来说是巨大的)理想情况下使用相同的语言并随后编译或者通常在过去的某个时间进入可链接库。整个项目中最复杂的部分。一旦你通过了中间,将高级语言转换为可消化的原子操作,然后可以通过后端移植到一个或多个指令集。操作系统调用由库处理,通常不一定是语言、JAVA、Python 和其他一些例外。因此,C 中的 printf 链接到一个 C 库,该库具有目标和操作系统特定的汇编语言,以将该层桥接到操作系统,其中一定百分比的代码(对于 printf 来说是巨大的)理想情况下使用相同的语言并随后编译或者通常在过去的某个时间进入可链接库。然后可以通过后端将其移植到一个或多个指令集中。操作系统调用由库处理,通常不一定是语言、JAVA、Python 和其他一些例外。因此,C 中的 printf 链接到一个 C 库,该库具有目标和操作系统特定的汇编语言,以将该层桥接到操作系统,其中一定百分比的代码(对于 printf 来说是巨大的)理想情况下使用相同的语言并随后编译或者通常在过去的某个时间进入可链接库。然后可以通过后端将其移植到一个或多个指令集中。操作系统调用由库处理,通常不一定是语言、JAVA、Python 和其他一些例外。因此,C 中的 printf 链接到一个 C 库,该库具有目标和操作系统特定的汇编语言,以将该层桥接到操作系统,其中一定百分比的代码(对于 printf 来说是巨大的)理想情况下使用相同的语言并随后编译或者通常在过去的某个时间进入可链接库。

老实说,听起来你还没有准备好制作一个编译器,你需要通过检查一些小到可以理解的简单工具来学习一些基础知识。查找涵盖这些基本工具主题、汇编器和链接器以及编译器的课程资料或在线/免费课程(或书籍/书籍)。看看像 pascal 或 ada 这样的语言,它们有些荒谬,更容易解析并变成某种东西,而不是 C/C++。不要出于教育原因看 gnu 或 llvm 或其他大型项目,它们不是正确的路径。一旦你进入 gnu,你会发现它几乎没有用胶带和钢丝绳固定在一起。LLVM 有一些很好的文档与实际工具不匹配,可能是很多年前,但现在不是了。随着时间的流逝,它也在积累管道胶带和钢丝绳,

许多(如果不是全部)计算机科学课程都有编译器课程,为了让学生在一个学期内有任何成功的机会,编译语言和现有工具的使用都为此进行了调整。去寻找其中的一些课程(谷歌是你的朋友),在 github 或其他地方你会发现偶尔有学生发布他们的代码。这通常是一种认为他们打出本垒打的情况,但通常更多的是我几乎没有让它发挥作用。但无论是本垒打还是其他情况,都假设他们通过该解决方案通过了课程,因此理论上可以消化,因为这是一个学期的工作,数十小时。

简短的回答:

您不能执行汇编语言,处理器执行机器代码,并且机器代码是 PROCESSOR 特定的而不是操作系统。

二进制文件、.exe、elf、coff、com、ihex、srec 等不一定特定于操作系统,但操作系统将具有有限的一组文件格式,可能只有一个,它们支持。

您的操作系统存在一个汇编器和链接器,它们知道目标机器代码并知道可执行文件格式。与其他编译器作者一样,如果您希望在这里发明一种新语言并为其制作编译器,那么编译为汇编语言并让这些工具完成其余的工作。这称为工具链,工具链(编译器、汇编器、链接器)。您正在使用链中的编译器工具。

于 2018-06-11T11:02:05.473 回答