我对编写汇编程序的概念非常陌生,即使在阅读了大量材料之后,我仍然难以绕过几个概念。
将源文件实际分解为令牌的过程是什么?我相信这个过程叫做lexing,我已经搜索了一些有意义的真实代码示例,但我找不到一个非常受欢迎的简单代码示例;)
解析时,是否需要在树上向上或向下传递信息?我问的原因如下:
LD BC,nn
一旦标记化(???)
,需要将其转换为以下解析树 ___ LD ___
| |
BC nn
现在,当遍历此树时,它需要生成以下机器代码:
01 n n
如果说明是:
LD DE,nn
然后输出必须是:
11 n n
这意味着它引发了一个问题,LD节点是否根据操作数返回不同的东西,还是返回某些东西的操作数?这是如何实现的?如果时间允许,更简单的代码示例将非常出色。
答案 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 。