构建汇编程序

时间:2008-12-21 19:59:13

标签: c# assembly

我需要为我构建的CPU架构构建汇编程序。该架构类似于MIPS,但这并不重要。

我开始使用C#,虽然C ++更合适。 (C#意味着我的开发时间更快)。

我唯一的问题是我不能为这个应用程序提供一个好的设计。我正在构建一个2通道汇编程序。我知道每次传球我需要做什么。\

我已经实现了第一个传递,我意识到如果我必须在同一行上汇编汇编代码......不会抛出任何错误。这意味着只有一个糟糕的解析技术。

如此全能的程序员,汇编的父亲告诉我应该如何进行。 我只需要支持符号和数据声明。说明书有固定的大小。

如果您需要更多信息,请与我们联系。

4 个答案:

答案 0 :(得分:13)

我写了三四个简单的汇编程序。在不使用解析器生成器的情况下,我所做的就是模拟我对6502最熟悉的S-C assembler

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

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

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

指令是< whitespace>< mnemonic> [操作数]

指令是< whitespace> .XX [operands]

评论是*到最后一行。

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

包括指令 .EQ等于定义常量

.OR设置代码的原始地址

.HS十六进制字节串

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

.TF输出目标文件

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

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

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

我保存了一个指令名表和操作数的所有有效寻址模式。当我收到指令时,我试图依次解析每个寻址模式,直到有效。

鉴于这种结构,整个事情应该花费一天或两天。

答案 1 :(得分:4)

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

The Assembler Developer's Kit

答案 2 :(得分:2)

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

答案 3 :(得分:1)

如果您要编写一个可正常工作的汇编程序,并将一个hex文件吐出来加载到微控制器上,它可以简单易行。我的ciforth库的一部分是一个完整的Pentium汇编器,用于添加大约150行的内联定义。有一个汇集器可以容纳80几十几行。

原则解释http://home.hccnet.nl/a.w.m.van.der.horst/postitfixup.html。 这相当于将黑板设计模式应用于问题。首先放下指令,为任何和所有操作数留下空洞。然后在遇到参数时填写孔 通用工具和指令集之间存在严格的分离。

如果你需要的汇编程序只适合你自己,并且没有任何要求而不是可用性(不是作业),你可以在http://home.hccnet.nl/a.w.m.van.der.horst/forthassembler.html中有一个示例实现。如果您不喜欢Forth,Perl中还有一个示例实现。如果奔腾指令集过于咀嚼,那么你仍然必须能够理解原理和通用部分。  建议您首先查看 asi8080.frt 文件。这是389 WOC(代码字,而不是代码行)。熟悉指令集的经验丰富的Forther可以在晚上制作出像这样的汇编程序。奔腾是一个婊子。