2008-12-21 65 views
12

我需要爲我構建的CPU體系結構構建彙編程序。該架構與MIPS類似,但這並不重要。構建彙編程序

我開始使用C#,雖然C++會更合適。 (C#意味着更快的開發時間)。

我唯一的問題是,我不能爲這個應用程序提供一個好的設計。我正在建造一個2通匯編器。我知道我需要在每次通過中執行什麼操作。\

我已經實現了第一遍,並且我意識到如果必須將彙編代碼放在同一行上......不會拋出任何錯誤。這意味着只有一個差的解析技巧。

如此全能的程序員,彙編程序的父親給了我啓示,我該如何着手。 我只需要支持符號和數據聲明。指令具有固定大小。

如果您需要更多信息,請讓我知道。

+0

這是一個功課題嗎? – ConcernedOfTunbridgeWells 2008-12-21 20:11:16

回答

11

我寫了三個或四個簡單的彙編器。如果不使用解析器生成,我所做的是模型,我知道最好的6502

要做到這一點的S-C assembler,我用一個簡單的語法 - 一條線是下列之一:

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

一標籤是一個字母,後跟任意數量的字母或數字。

的指令是<空白> <助記符> [操作數]

甲指令是<空白> .XX [操作數]

註釋是*最多行結束。

操作數取決於指令和指令。

指令包括 .EQ等同於定義常量

的代碼.OR設定起始地址

開發文件的字節的字節

.AS ASCII字符串的十六進制字符串 - 除了白色空間中的任何分隔符 - 無論開始它結束它

.TF目標文件輸出

。BS n n個字節的預留塊存儲

當我寫它時,我爲每個組件編寫了簡單的解析器。每當我遇到一個標籤時,我都會把它放在一張帶有目標地址的表格中。每當我遇到一個我不知道的標籤時,我將該標記標記爲不完整,並將未知標籤與需要修復的指令相關聯。

在所有源代碼行都通過後,我查看了「修復」表並嘗試在符號表中找到條目,如果我這樣做了,我修補了說明。如果不是,那麼這是一個錯誤。

我保留了一個指令名和操作數的所有有效尋址模式表。當我得到一條指令時,我試着依次解析每個尋址模式,直到有效。

鑑於這種結構,它應該需要一天,也許兩個做整件事情。

+0

謝謝你的回答。你看,我有以下問題: LOOP1: LOOP2: LOOP3:ADD R1,R2 JMP LOOP1 我寫彙編器將跳轉到包含LOOP2,它應該跳轉到ADD指令行的方式。我一行一行解析。你把整個代碼視爲一行嗎? – John 2008-12-22 09:16:32

4

看,距離著名的蘭迪海德的作者本彙編開發工具包「彙編語言的藝術」:

The Assembler Developer's Kit

+0

該鏈接不再有效。 – NilsB 2013-12-10 07:08:43

2

兩次通過彙編程序的第一階段裝配的代碼,並把佔位符符號(因爲在運行彙編程序之前,您不知道所有東西都有多大)。第二遍填寫地址。如果組裝的代碼隨後需要鏈接到外部參考,這是同名連接器的工作。

1

如果您要編寫一個能正常工作的彙編程序,並將要加載到微控制器上的十六進制文件吐出,它可能非常簡單。我的ciforth庫的一部分是一個完整的奔騰彙編程序,用於添加大約150行的內聯定義。有幾十行8080的彙編程序。

原理解釋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可以在晚上啓動一個這樣的彙編程序。奔騰是個婊子。