编译器与汇编器

Dar*_*hah 2 compiler-construction optimization assembly

汇编器将汇编代码作为输入并生成机器代码作为输出。那么是否意味着汇编程序还必须对代码进行词法分析和语法分析呢?

例如,需要某种方式来区分作为指令的 MOV 和作为标签的 MOVXYZ。

以下面这段与8086兼容的代码为例。

MOV MOVXYZ,013h
MOV BX,023h
ADD BX,MOVXYZ
Run Code Online (Sandbox Code Playgroud)

如果它确实需要另一轮词法分析和语法分析,那么为什么要把汇编作为编译的中间步骤呢?

编辑:

汇编器获取汇编代码作为输入

 MOV AX,MOVXYZ
 ADD AX,BX
Run Code Online (Sandbox Code Playgroud)

它本质上是一个带有字符的文件。我的问题是,如果不是词法分析,它如何区分“MOV”和“MOVS”?

500*_*ror 5

汇编器将汇编代码作为输入并生成机器代码作为输出。那么是否意味着汇编程序还必须对代码进行词法分析和语法分析呢?

是的。汇编语言可以被认为是一种编程语言,就像任何其他语言一样,尽管它是一种非常低级的语言。

例如,需要某种方式来区分作为指令的 MOV 和作为标签的 MOVXYZ。

的确

如果它确实需要另一轮词法分析和语法分析,那么为什么要把汇编作为编译的中间步骤呢?

就像你说的,它确实需要分析,事实上,大多数编译器使用汇编程序作为中间步骤,而是直接将二进制代码生成某种对象格式,然后将其馈送到链接器阶段。

作为一个单独的问题:如果生成三地址代码作为中间形式,那么它的优化(由编译器从三地址代码到优化的三地址代码完成)也需要词法分析。

正确,如果 3 地址代码实际上是作为文本发出的,但实际上它通常以二进制形式发出到内部表中,因此实际上已经被解析/分析。