|
1
8
汇编程序和其他任何“编译器”一样,最好是作为一个词汇分析器来编写的,它将输入到语言语法处理器中。 汇编语言通常比常规编译语言容易,因为您不需要担心跨行边界的构造,而且格式通常是固定的。 两年前,为了教育目的,我为一个(虚拟的)CPU编写了一个汇编程序,它基本上将每一行处理为:
最简单的方法是确保令牌易于识别。
这就是为什么我制定了标签必须以的规则
你可以很容易地坚持不同的操作数也有特殊的标记,使你的生活更容易。所有这些都假定您可以控制输入格式。如果你被要求使用Intel或AT&T格式,那就有点困难了。
我的方法是有一个简单的每操作函数被调用(例如,
例如,
例如,下面是
这个
通过使操作数的类型易于区分,可以检查提供的操作数、它们是否合法以及要生成的字节序列。将操作分离为它们自己的函数提供了一个良好的逻辑结构。 此外,大多数CPU都遵循从操作码到操作码的合理逻辑转换(以使芯片设计人员更容易生活),因此在所有允许索引寻址的操作码上都会有非常相似的计算。 为了在允许可变长度指令的CPU中正确地创建代码,最好在两次传递中完成。
在第一步中,不要生成代码,只生成指令的长度。这允许您在遇到所有标签时为其指定值。第二遍将生成代码,并可以填充对这些标签的引用,因为它们的值是已知的。这个
|
|
|
2
6
不要让你泄气,但已经有了 many assemblers 各种各样的铃声和口哨声。请考虑为现有的开源项目做出贡献,例如 elftoolchain . |
|
|
EE18 · C中字节序与尺寸组装转换的关系 2 年前 |
|
|
MagicRacoon · TSO和存储转发保证 2 年前 |
|
|
ugo_capeto · gcc使用“lea”而不是“add”` 2 年前 |
|
|
Locke · GCC和Clang奇怪的不必要堆栈使用[重复] 2 年前 |