我已经写了三四个简单的汇编程序。在不使用解析器生成器的情况下,我所做的是对我最熟悉的 6502的SC 汇编器进行建模。
为此,我使用了一种简单的语法——一行是以下之一:
nothing
[label] [instruction] [comment]
[label] [directive] [comment]
标签是一个字母后跟任意数量的字母或数字。
一条指令是 <whitespace><mnemonic> [operands]
指令是 <whitespace>.XX [operands]
注释是一个 * 直到行尾。
操作数取决于指令和指令。
包含的指令 .EQ 等同于定义常量
.OR 设置代码的源地址
.HS 十六进制字节串
.AS ascii 字节字符串 - 除空格外的任何分隔符 - 无论开始它都结束它
.TF 目标文件用于输出
.BS n 保留 n 字节的块存储
当我编写它时,我为每个组件编写了简单的解析器。每当我遇到一个标签时,我都会把它放在一个带有目标地址的表中。每当我遇到一个我不知道的标签时,我都会将该指令标记为不完整,并将未知标签与需要修复的指令的引用一起放置。
在所有源代码行通过后,我查看了“修复”表并尝试在符号表中找到一个条目,如果找到了,我修补了说明。如果不是,那么这是一个错误。
我保留了一张指令名称表和操作数的所有有效寻址模式。当我收到一条指令时,我尝试依次解析每种寻址模式,直到某些东西起作用。
鉴于这种结构,完成整个事情应该需要一天甚至两天的时间。