我试图学习MIPS汇编语言以更好地了解计算机的工作方式。我通常会编写Java和JS,并且我知道Java正在使用编译器执行我的代码。在学习MIPS时,我遇到了汇编程序。
它们的工作方式有何不同?
答案 0 :(得分:4)
编译器和汇编器都采用人类可读的文本并将其转换为特定格式的二进制对象。
主要区别在于:
具体说明的来源。
在编译器中,细节来自上面,是针对的编程语言。
高级语言是抽象,因为它们在设计时就考虑了抽象机,它们隐藏了硬件细节。
编译器必须将抽象机中的操作映射到目标机(真实机)中的操作。
在汇编器中,详细信息来自下面的内容,它是针对的ISA。
汇编是具体的(不是100%具体的,例如,参见Pseudo-instructions),它是特定CPU的操作码的助记符。
汇编程序必须允许程序员在使用操作码时使用助记符,因为目标是直接指令CPU,因此汇编指令和机器指令之间存在接近1:1的映射。
复杂度
高级语言具有复杂的语法,该语法往往类似于英语,编译器必须执行的解析和映射也非常复杂。
需要一个词法分析器/令牌生成器和a parser来创建一个AST,该{{3}}用于相应地生成机器代码,这需要在树的节点之间保持上下文。
我们还期望编译器优化AST和生成的代码。
Assembly具有基于行的语法,词法分析器和解析器一次只限于一行,并且通常可以通过智能表查找进行组合和完成。
没有复杂的状态管理。
实际上没有优化的空间,也没有花哨的,难以实现的功能映射到机器代码中,实际上,映射是很简单的,因为程序员已经完成了。
Bot编译器和汇编器需要支持某种对象和执行文件格式,以增加一些复杂性。
目标
编译器是一种工具,可以实现从用户那里提取硬件细节的目标,我们希望编写一个可以在理想情况下在任何硬件上重新编译时运行的源代码。
汇编器是一种工具,当人们不想将硬件抽象出来而他们想充分利用其功能时,它就很方便。
因此,汇编器将公开编译器将尝试隐藏的一组低级细节(例如段)。
我们可以认为编译器是遵循烹饪收据的人,当它说“混合牛奶”时,他们实际上必须使用正确的工具(木勺?),将其放入牛奶中并制成旋转运动。
那很复杂。
组装工就像一个孩子,不懂“混合牛奶”,我们必须告诉它“从左边的画中拿木勺,就像一根长木棍,末端是凸面的”,然后,“用手保持容器静止不动”,“将木勺放入牛奶中4-5英寸深”,“绕圈转圈,平稳且不要太快地顺时针旋转”,“重复20秒”。
这些指令更易于解析,同时使教师可以更好地控制整个操作,例如如果他们想改变勺子的深度。
那为什么要有汇编程序?
因为我们需要一种精确生成机器指令 的方法,所以我们可以为此使用编译器,使用一种特定的语言,但是由于低级指令列表的结构化程度不如抽象操作,因此最终结果将是一个光荣的汇编程序(或多或少像使用Git这样的版本控制软件来提交一个充满复制粘贴备份的工作目录)。
因此我们将它们分开:汇编程序的简单结构,编译器的复杂语法。