编译器与汇编器

时间:2014-11-30 13:00:01

标签: optimization assembly compiler-construction

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

就像一个例子,它需要某种方式来区分MOV作为指令和MOVXYZ作为标签。

以下面的代码与8086兼容。

MOV MOVXYZ,013h
MOV BX,023h
ADD BX,MOVXYZ

如果确实需要进行另一轮词法分析和语法分析,那么为什么将程序集作为编译的中间步骤呢?

编辑:

汇编程序将汇编代码作为输入

 MOV AX,MOVXYZ
 ADD AX,BX

它本质上是一个包含字符的文件。我的问题是,如果不是词汇分析,它如何区分" MOV"来自" MOVS" ?

4 个答案:

答案 0 :(得分:4)

  

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

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

  

就像一个例子,它需要某种方式来区分MOV作为指令和MOVXYZ作为标签。

的确

  

如果确实需要进行另一轮词法分析和语法分析,那么为什么将程序集作为编译的中间步骤呢?

就像你说的那样,它确实需要分析,实际上大多数编译器使用汇编程序作为中间步骤,但直接将二进制代码发送到某种对象格式,后来将其输入到链接器阶段。

  

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

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

答案 1 :(得分:3)

  

这是否意味着汇编程序还必须对代码进行词法分析和语法分析?

仅限于非常有限的方式。它必须在必须提取操作码和参数等的意义上执行它,这意味着它将一系列字符转换为实际可以使用的内部表示。但与#34;真正的解析器"不同,解析器汇编器通常使用普通的旧字符串处理而不是有限状态机和类似的东西。您经常会看到诸如读取一条线,将其拆分,将第一部分解释为操作码之类的事情 - 这不是正确的词汇分析如何工作,而是有效地提取令牌。

从问题中删除,但是..是的,汇编程序也可以进行一些优化。不过你期望编译器做什么。但有时候有几种方法可以将助记符翻译成实际的指令,然后它可能会选择哪种方式,而且这种选择可能并非易事。一个例子是x86上的分支大小,其中包含2字节7x ofs8形式,范围有限,6字节0F 8x ofs32

为了找到指令和标签的地址(从而确定你可以/必须使用哪个分支),它必须知道指令的大小,但是它首先需要这些信息来决定分支的大小。解决此问题的常用方法是首先假设小尺寸,然后迭代地将未达到其目标的任何分支更改为更大的变体(这可能导致其他分支超出范围,依此类推)。

此外,一些汇编语言具有"伪指令",它们被编写为简单的助记符,但汇编为两个或更多实际指令。指令的选择可能取决于操作数等(在这种情况下,它有效地针对特定情况进行优化)。或者,更常见的是,它可能只是一个预先确定的宏。 MIPS和ARM都有最后一种类型的伪指令。

这是组装的奇怪一面,他们所做的大部分工作就是接受指令并对其进行编码。例如,如果您编写add eax, edx,则会提取标记addeaxedx,并认识到这是一条add指令,其操作数看起来像{ {1}},然后它可以在一个大表(或巨型r32或决策树)中查找如何对其进行编码。事实证明,有两种符合该模式的编码switch01 /r。因此,您可以获得03 /r01 D0,具体取决于汇编程序的作者所做出的选择。如果它组装16位代码,它也会发出操作数大小覆盖。

答案 2 :(得分:1)

一些汇编程序包含某种形式的更高级指令。对于MASM(ML.EXE)6.11(在MSDOS时代发布)以及之后,有一些点指令可以为每行汇编代码生成多条指令:

        .if     ax == 0 || bx == 0
        ;... conditional code goes here.
        .else
        ;... conditional code goes here.
        .endif

这些类型的指令在减少源代码中的标签数量方面很受欢迎。还有像.while .break .endw这样的指令。向下滚动到此网页ml directives的条件控制流部分。

IBM的HLASM也支持类似的功能:IBM HLASM

许多汇编程序也支持宏,其中宏中定义的通用指令序列可以使用源代码中的宏的单个实例(可选地带参数)生成。

答案 3 :(得分:0)

  

这是否意味着汇编程序还必须进行词法分析   关于代码的语法分析?

是的,解析和词法分析与高级语言相同,但通常要简单得多,因为汇编中的一条指令对应于机器代码中的一条指令。汇编是机器代码的人类表示,没有像高级语言(例如C)那样的抽象层。

  

然后它的优化也需要词法分析

汇编程序没有优化。它按原样使用您的代码并转换为机器代码。另一方面,编译器可以优化您的代码;生成的装配已经过优化。