10

我对编写汇编程序的概念非常陌生,即使在阅读了大量材料之后,我仍然难以理解几个概念。

  1. 将源文件实际分解为令牌的过程是什么?我相信这个过程被称为词法分析,我已经在高处和低处搜索了一个有意义的真实代码示例,但我找不到一个非常受欢迎的简单代码示例;)

  2. 解析时,信息是否需要向上或向下传递?我问的原因如下,采取:

    LD BC, nn

标记化后需要变成下面的解析树(???)

  ___ LD ___
  |        |
 BC        nn

现在,当遍历这棵树时,它需要产生以下机器代码:

01 n n

如果指令是:

LD DE,nn

那么输出需要是:

11 n n

这意味着它提出了一个问题,LD 节点是根据操作数返回不同的东西还是返回一些东西的操作数?这是如何实现的?如果时间允许,更简单的代码示例会更好。

我最感兴趣的是在这里学习一些原始流程,而不是查看现有的高级工具,因此在将我发送到YaccFlex之前请记住这一点。

4

3 回答 3

10

好吧,对于在寄存器上操作的指令和涉及偏移位移和索引寄存器的内存寻址模式,您真正想要的树的结构如下所示:

    INSTRUCTION-----+
    |      |        |
  OPCODE  REG     OPERAND
                  |     |
                OFFSET  INDEXREG

是的,你想在树上上下传递值。一种正式指定此类值传递的方法称为“属性语法”,并且您使用值传递和对这些值的计算来装饰您的语言(在您的情况下为您的汇编程序语法)的语法。有关更多背景信息,请参阅关于属性语法的 Wikipedia

您提出的一个相关问题中,我讨论了一个工具DMS,它处理表达式语法和构建树。作为语言处理工具,DMS 面临着同样的上下树信息流问题。不出所料,作为一款高端的语言操作工具,它可以直接处理属性语法计算。

于 2009-08-23T20:27:27.003 回答
7

没有必要构建解析树。Z80 操作码非常简单。它们由操作码和 0、1 或 2 个操作数组成,以逗号分隔。您只需使用非常简单的解析器将操作码拆分为(最多 3 个)组件 - 不需要树。

于 2009-08-20T09:54:31.200 回答
3

实际上,操作码没有字节基数,而是八进制基数。我知道的最好的描述是解码 Z80 操作码

于 2009-10-26T00:49:31.400 回答