编写 Z80 汇编程序 - 词法 ASM 并使用组合构建解析树?
-
19-09-2019 - |
题
我对编写汇编器的概念非常陌生,即使在阅读了大量材料之后,我仍然很难理解几个概念。
将源文件实际分解为令牌的过程是什么?我相信这个过程称为词法分析,我已经到处搜索有意义的真实代码示例,但我找不到如此简单的代码示例,非常受欢迎;)
解析时,信息是否需要在树上向上或向下传递?我问的原因如下,取:
LD BC,nn
一旦标记化,它需要变成以下解析树(???)
___ LD ___
| |
BC nn
现在,当遍历这棵树时,它需要生成以下机器代码:
01 n n
如果指令是:
LD DE,nn
那么输出需要是:
11 n n
这意味着它提出了一个问题,LD 节点是否根据操作数返回不同的内容,或者是操作数返回某些内容?这是如何实现的?如果时间允许的话,更简单的代码示例将非常好。
解决方案
好吧,您真正想要的树的结构,用于在寄存器上运行的指令以及涉及偏移位移和索引寄存器的内存寻址模式看起来像这样:
INSTRUCTION-----+
| | |
OPCODE REG OPERAND
| |
OFFSET INDEXREG
是的,您想要在树中上下传递值。一种正式指定此类值传递的方法称为“属性语法”,您可以用langauge(在您的情况下是汇编语法)装饰语法,并具有值 - 通过值和计算这些值。有关更多背景,请参阅 属性语法的维基百科.
在一个 你问的相关问题, ,我讨论了一个 工具 数据管理系统, 它处理表达式语法和构建树。如 语言操作工具,DMS面对的正是这些上下起伏 树信息流问题。这不应该让你感到惊讶, 作为高端语言操作工具,它可以处理 直接属性语法计算。
其他提示
没有必要构建解析树。Z80操作码非常简单。它们由操作码和 0、1 或 2 个操作数组成,以逗号分隔。您只需使用一个非常简单的解析器将操作码拆分为(最多 3 个)组件 - 不需要树。
实际上,操作码没有字节基,而是八进制基。我所知道的最好的描述是 解码 Z80 操作码.
不隶属于 StackOverflow