编写Z80汇编程序 - lexing ASM并使用组合构建解析树?

时间:2009-08-20 09:50:00

标签: parsing assembly lexical-analysis z80

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

  1. 将源文件实际分解为令牌的过程是什么?我相信这个过程叫做lexing,我已经搜索了一些有意义的真实代码示例,但我找不到一个非常受欢迎的简单代码示例;)

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

    LD BC,nn

  3. 一旦标记化(???)

    ,需要将其转换为以下解析树
      ___ LD ___
      |        |
     BC        nn
    

    现在,当遍历此树时,它需要生成以下机器代码:

    01 n n
    

    如果说明是:

    LD DE,nn
    

    然后输出必须是:

    11 n n
    

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

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

3 个答案:

答案 0 :(得分:9)

那么,你真正想要的树的结构 在寄存器和存储器上操作的指令 寻址模式涉及偏移位移和索引寄存器 看起来像这样:

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

是的,你想要在树上上下传递值。 调用正式指定这种值传递的方法 “属性语法”,你装饰你的语法 langauge(在您的情况下,您的汇编语法)与值传递 以及对这些值的计算。更多背景, 见Wikipedia on attribute grammars

related question you asked中,我讨论了一个问题 工具,DMS, 它处理表达式语法和构建树。如 语言操作工具,DMS完全面对这些相同的上下 树信息流问题。你不应该感到惊讶, 作为一种高端语言操作工具,它可以处理 直接属性语法计算。

答案 1 :(得分:6)

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

答案 2 :(得分:3)

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