15

我需要为我已经构建的 CPU 架构构建一个汇编器。该架构类似于 MIPS,但这并不重要。

我开始使用 C#,尽管 C++ 会更合适。(C# 对我来说意味着更快的开发时间)。

我唯一的问题是我无法为这个应用程序提供一个好的设计。我正在构建一个 2 遍汇编器。我知道每次通过时我需要做什么。\

我已经实现了第一遍,我意识到如果我必须在同一行上编写汇编代码......不会引发错误。这意味着只有一件事解析技术不佳。

所以万能的程序员,汇编之父们赐教我该怎么做。我只需要支持符号和数据声明。说明有固定大小。

如果您需要更多信息,请告诉我。

4

4 回答 4

14

我已经写了三四个简单的汇编程序。在不使用解析器生成器的情况下,我所做的是对我最熟悉的 6502的SC 汇编器进行建模。

为此,我使用了一种简单的语法——一行是以下之一:

nothing
[label] [instruction] [comment]
[label] [directive] [comment]

标签是一个字母后跟任意数量的字母或数字。

一条指令是 <whitespace><mnemonic> [operands]

指令是 <whitespace>.XX [operands]

注释是一个 * 直到行尾。

操作数取决于指令和指令。

包含的指令 .EQ 等同于定义常量

.OR 设置代码的源地址

.HS 十六进制字节串

.AS ascii 字节字符串 - 除空格外的任何分隔符 - 无论开始它都结束它

.TF 目标文件用于输出

.BS n 保留 n 字节的块存储

当我编写它时,我为每个组件编写了简单的解析器。每当我遇到一个标签时,我都会把它放在一个带有目标地址的表中。每当我遇到一个我不知道的标签时,我都会将该指令标记为不完整,并将未知标签与需要修复的指令的引用一起放置。

在所有源代码行通过后,我查看了“修复”表并尝试在符号表中找到一个条目,如果找到了,我修补了说明。如果不是,那么这是一个错误。

我保留了一张指令名称表和操作数的所有有效寻址模式。当我收到一条指令时,我尝试依次解析每种寻址模式,直到某些东西起作用。

鉴于这种结构,完成整个事情应该需要一天甚至两天的时间。

于 2008-12-21T20:15:59.023 回答
5

看看 Randy Hyde 著名的“汇编语言的艺术”的作者的这个汇编器开发工具包:

汇编器开发者工具包

于 2008-12-21T20:10:43.467 回答
2

两遍汇编程序的第一遍汇编代码并为符号放置占位符(因为在您运行汇编程序之前您不知道所有内容有多大)。第二遍填写地址。如果汇编代码随后需要链接到外部引用,这就是同名链接器的工作。

于 2008-12-21T20:10:50.330 回答
1

如果您要编写一个可以正常工作的汇编程序,并生成一个十六进制文件以加载到微控制器上,那么它可以简单易行。我的 ciforth 库的一部分是一个完整的 Pentium 汇编器,用于添加大约 150 行的内联定义。有几十行 8080 的汇编程序。

原理解释http://home.hccnet.nl/awmvan.der.horst/postitfixup.html。它相当于将黑板设计模式应用于问题。您首先制定指令,为任何和所有操作数留下孔。然后,当您遇到参数时,您将填补漏洞。
通用工具和指令集之间有严格的区分。

如果您需要的汇编器仅供您自己使用,并且除了可用性之外没有其他要求(不是家庭作业),您可以在http://home.hccnet.nl/awmvan.der.horst/forthassembler 中有一个示例实现。 .html _ 如果你不喜欢 Forth,Perl 中也有一个示例实现。如果 Pentium 指令集太多太嚼,那么你仍然必须能够理解原理和通用部分。建议您先查看asi8080.frt文件。这是 389 WOC(Words Of Code,而不是 Lines Of Code)。一个熟悉指令集的有经验的 Forther 可以在一个晚上完成一个这样的汇编程序。奔腾是个婊子。

于 2012-05-04T13:34:58.970 回答