似乎我所参加的每个课程都是对新主题的介绍,该主题无法提供全面的知识,使我能够生成可以在IDE外部执行的实际程序.实现我不知道的东西既令人沮丧又令人生畏,令我感到困惑的是,一个经过认证的计算机科学课程可以提供一个课程,从一开始就不会对这个过程有所了解.
实际问题:原谅介绍,但它提供了我(经验)的良好指示.我目前正在计算机架构课程中学习MIPS,并且已经获得了快速的装配介绍.程序执行方式的精细细节通常被描述为魔术,并在地毯下刷,以供另一位老师解释,如果可能的话.
据我所知,处理器电路在芯片之间变化很大,因此可能需要不同的低级指令来执行相同的高级代码.在成为原始机器代码之前,所有程序最终都会转换为汇编语言,还是不再需要此步骤?
如果是这样,处理器在什么时候开始执行自己独特的指令集?这是最低级别的代码,所以此时程序指令是由处理器逐位执行的吗?
最后,所有架构都需要汇编语言吗?
Mic*_*ski 11
可以说,汇编语言是表示处理器执行的指令的人类可读形式(其是二进制数据并且非常难以由人管理).因此,如果机器指令不是由人类生成的,则不需要使用组装步骤,尽管有时为了方便起见.如果程序是用诸如C++之类的语言编译的,则编译器可以直接生成机器代码,而无需经过汇编代码的中间阶段.尽管如此,许多编译器还提供了生成汇编代码的选项,以便人们更容易检查生成的内容.
许多现代语言,例如Java和C#被编译成所谓的字节码.这是CPU不直接执行的代码,而是一种中间形式,可以在程序执行时及时编译为机器代码(JIT-ted).在这种情况下,生成依赖于CPU的机器代码,但通常不经过人工可读的汇编代码.
汇编语言只是原始机器代码的人类可读的文本表示。它的存在是为了(人类)程序员的利益。作为生成机器代码的中间步骤,它完全没有必要。一些编译器确实生成汇编,然后调用汇编器将其转换为机器代码。但是由于省略这一步会导致更快的编译(而且并不难),编译器将(广义上讲)倾向于直接生成机器代码。但是,可以选择编译为汇编以检查结果很有用。
对于您的最后一个问题,汇编语言是一种人类便利,因此没有架构真正需要它。如果您真的愿意,您可以创建一个没有架构的架构。但实际上,所有架构都有汇编语言。首先,创建一种新的汇编语言非常容易:为所有机器操作码和寄存器提供一个文本名称,添加一些语法来表示不同的寻址模式,您已经基本完成了。即使所有代码都直接从高级语言直接转换为机器语言,您仍然需要汇编语言,如果只是作为在寻找编译器错误等时反汇编和可视化机器代码的一种方式。
每个通用 CPU 都有自己的指令集。也就是说,某些字节序列在执行时会对寄存器和内存产生众所周知的、记录在案的影响。汇编语言是写下这些指令的一种便捷方式,这样人们就可以阅读和编写它们并理解它们所做的事情,而无需一直查找命令。可以肯定地说,对于每个现代CPU,都存在一种汇编语言。
现在,关于程序是否转换为汇编。让我们开始通过说CPU并没有执行的汇编代码。它执行机器代码,但机器代码命令和装配线是一一对应的。只要记住这种区别,就可以说“现在 CPU 执行 MOV,然后执行 ADD”等。当然,CPU 执行与 MOV 命令相对应的机器代码。
也就是说,如果您的语言编译为本机代码,那么您的程序确实会在执行前转换为机器代码。一些编译器(不是全部)通过发出汇编源代码并让汇编器完成最后一步来做到这一点。这一步,当存在时,通常很好地隐藏。程序集表示在编译过程中只存在一小段时间,除非你告诉编译器保持它的完整性。
其他编译器不使用汇编步骤,但如果要求则发出汇编。例如,Microsoft C++ 接受一个选项 /FA - 连同目标文件一起发出程序集列表。
如果它是一种解释型语言,则没有显式转换为机器。源代码行由语言解释器执行。面向字节码的语言(Java、Visual Basic)介于两者之间;它们被编译成与机器代码不同的代码,但比高级源代码更容易解释。对于那些,也可以说它们没有转换为机器代码。