用c语言编写一个简单的组译器

sk_soju 2008-04-02 12:10:38
用c语言编写一个简单的组译器
要求 :1 一行一行读取输入文件
2 将输入文件的每一行转化成记忆码,操作码,标签等
3 对无效的指令或者操作码进行操作
运行程序的时候输入指令为
./assembler <输入文件> <输出文件>

小弟初学,看到题目很迷茫,望各位高手给个简单的例子就行,先谢过。

...全文
123 11 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
没遇到过这种情况.
UltraBejing 2008-05-01
  • 打赏
  • 举报
回复
我也想知道,正在找這方面的資料~~~~~
knowledge_Is_Life 2008-04-30
  • 打赏
  • 举报
回复
以后需再关注,现在先帮你顶一下
dongyi940333 2008-04-03
  • 打赏
  • 举报
回复
学习了,谢谢jennyvenus
sk_soju 2008-04-03
  • 打赏
  • 举报
回复
这个函数就是用来做加减法的么
运行的时候输入
./assembler <输入文件> <输出文件>
这里的输入和输出都是些啥文件啊
huxiaolai 2008-04-03
  • 打赏
  • 举报
回复
看不懂,没学到什么,
顶下
智能卡_Snooper 2008-04-02
  • 打赏
  • 举报
回复
    If Decom(i) = "WORD" And Decom(i + 1) = "PTR" Then
'[]=============[]
'[]列举可能的方式
'[]mov word ptr [1000h],1
'[]mov word ptr [si],1
'[]mov word ptr [si+d8],1
'[]mov word ptr [si+d16],1
'[]mov word ptr [bx+si],1
'[]mov word ptr [bx+si+d8],1
'[]mov word ptr [bx+si+d16],1
'[]=============[]
If Is_Dir_Mem(i + 2) Then
ADD_OR_SUB = WORDPTR_DIRMEM_0(OPT, Decom(i + 3), Decom(i + 6))
ElseIf Is_InDir_Mem(i + 2) Then
ADD_OR_SUB = WORDPTR_INDIRMEM_0(OPT, Decom(i + 3), Decom(i + 6))
ElseIf Is_InDir_Mem8(i + 2) Then
ADD_OR_SUB = WORDPTR_INDIRMEM8_0(OPT, Decom(i + 3), Decom(i + 4), Decom(i + 5), Decom(i + 8))
ElseIf Is_InDir_Mem16(i + 2) Then
ADD_OR_SUB = WORDPTR_INDIRMEM16_0(OPT, Decom(i + 3), Decom(i + 4), Decom(i + 5), Decom(i + 8))
ElseIf Is_Base_Mem(i + 2) Then
ADD_OR_SUB = WORDPTR_BASEMEM_0(OPT, Decom(i + 3), Decom(i + 5), Decom(i + 8))
ElseIf Is_Base_Mem8(i + 2) Then
ADD_OR_SUB = WORDPTR_BASEMEM8_0(OPT, Decom(i + 3), Decom(i + 5), Decom(i + 6), Decom(i + 7), Decom(i + 9))
ElseIf Is_Base_Mem16(i + 2) Then
ADD_OR_SUB = WORDPTR_BASEMEM16_0(OPT, Decom(i + 3), Decom(i + 5), Decom(i + 6), Decom(i + 7), Decom(i + 9))
End If
End If
'--------------------------------------------------
'++++++++++++++++++++++++++++++++++++++++++++++++++
If IsWord(Decom(i)) Then
If IsWord(Decom(i + 2)) Then
If OPT = "XCHG" And Decom(i) = "AX" And Decom(i + 2) = "AX" Then
ADD_OR_SUB = "90"
Else
ADD_OR_SUB = word1 & WORD_WORD(Decom(i), Decom(i + 2))
End If
ElseIf IsImme(i + 2) Then
ADD_OR_SUB = WORD_IMME_0(OPT, Decom(i), Decom(i + 2))
ElseIf Is_Dir_Mem(i + 2) Then
ADD_OR_SUB = WORD_DIR_MEM_0(OPT, Decom(i), Decom(i + 3))
ElseIf Is_InDir_Mem(i + 2) Then
ADD_OR_SUB = word2 & WORD_INDIR_MEM(Decom(i), Decom(i + 3))
ElseIf Is_InDir_Mem8(i + 2) Then
ADD_OR_SUB = word2 & WORD_INDIR_MEM8(Decom(i), Decom(i + 3), Decom(i + 4), Decom(i + 5))
ElseIf Is_InDir_Mem16(i + 2) Then
ADD_OR_SUB = word2 & WORD_INDIR_MEM16(Decom(i), Decom(i + 3), Decom(i + 4), Decom(i + 5))
ElseIf Is_Base_Mem(i + 2) Then
ADD_OR_SUB = word2 & WORD_BASE_MEM(Decom(i), Decom(i + 3), Decom(i + 5))
ElseIf Is_Base_Mem8(i + 2) Then
ADD_OR_SUB = word2 & WORD_BASE_MEM8(Decom(i), Decom(i + 3), Decom(i + 5), Decom(i + 6), Decom(i + 7))
ElseIf Is_Base_Mem16(i + 2) Then
ADD_OR_SUB = word2 & WORD_BASE_MEM16(Decom(i), Decom(i + 3), Decom(i + 5), Decom(i + 6), Decom(i + 7))
End If
End If
'----------------------------------------------------------------
'++++++++++++++++++++++++++++++++++++++++++++++++++
If IsByte(Decom(i)) Then
If IsByte(Decom(i + 2)) Then
ADD_OR_SUB = byte1 & BYTE_BYTE(Decom(i), Decom(i + 2))
ElseIf IsImme(i + 2) Then
ADD_OR_SUB = BYTE_IMME_0(OPT, Decom(i), Decom(i + 2))
ElseIf Is_Dir_Mem(i + 2) Then
ADD_OR_SUB = BYTE_DIR_MEM_0(OPT, Decom(i), Decom(i + 3))
ElseIf Is_InDir_Mem(i + 2) Then
ADD_OR_SUB = byte2 & BYTE_INDIR_MEM(Decom(i), Decom(i + 3))
ElseIf Is_InDir_Mem8(i + 2) Then
ADD_OR_SUB = byte2 & BYTE_INDIR_MEM8(Decom(i), Decom(i + 3), Decom(i + 4), Decom(i + 5))
ElseIf Is_InDir_Mem16(i + 2) Then
ADD_OR_SUB = byte2 & BYTE_INDIR_MEM16(Decom(i), Decom(i + 3), Decom(i + 4), Decom(i + 5))
ElseIf Is_Base_Mem(i + 2) Then
ADD_OR_SUB = byte2 & BYTE_BASE_MEM(Decom(i), Decom(i + 3), Decom(i + 5))
ElseIf Is_Base_Mem8(i + 2) Then
ADD_OR_SUB = byte2 & BYTE_BASE_MEM8(Decom(i), Decom(i + 3), Decom(i + 5), Decom(i + 6), Decom(i + 7))
ElseIf Is_Base_Mem16(i + 2) Then
ADD_OR_SUB = byte2 & BYTE_BASE_MEM16(Decom(i), Decom(i + 3), Decom(i + 5), Decom(i + 6), Decom(i + 7))
End If
End If
'----------------------------------------------------------------
If Decom(i) = "[" Then
If Is_Dir_Mem(i) Then
If IsByte(Decom(i + 4)) Then
ADD_OR_SUB = DIR_MEM_BYTE_0(OPT, Decom(i + 1), Decom(i + 4))
ElseIf IsWord(Decom(i + 4)) Then
ADD_OR_SUB = DIR_MEM_WORD_0(OPT, Decom(i + 1), Decom(i + 4))
End If
ElseIf Is_InDir_Mem(i) Then
If IsByte(Decom(i + 4)) Then
ADD_OR_SUB = mem1 & INDIR_MEM_BYTE(Decom(i + 1), Decom(i + 4))
ElseIf IsWord(Decom(i + 4)) Then
ADD_OR_SUB = mem2 & INDIR_MEM_WORD(Decom(i + 1), Decom(i + 4))
End If
ElseIf Is_InDir_Mem8(i) Then
If IsByte(Decom(i + 6)) Then
ADD_OR_SUB = mem1 & INDIR_MEM8_BYTE(Decom(i + 1), Decom(i + 2), Decom(i + 3), Decom(i + 6))
ElseIf IsWord(Decom(i + 6)) Then
ADD_OR_SUB = mem2 & INDIR_MEM8_WORD(Decom(i + 1), Decom(i + 2), Decom(i + 3), Decom(i + 6))
End If
ElseIf Is_InDir_Mem16(i) Then
If IsByte(Decom(i + 6)) Then
ADD_OR_SUB = mem1 & INDIR_MEM16_BYTE(Decom(i + 1), Decom(i + 2), Decom(i + 3), Decom(i + 6))
ElseIf IsWord(Decom(i + 6)) Then
ADD_OR_SUB = mem2 & INDIR_MEM16_WORD(Decom(i + 1), Decom(i + 2), Decom(i + 3), Decom(i + 6))
End If
ElseIf Is_Base_Mem(i) Then
If IsByte(Decom(i + 6)) Then
ADD_OR_SUB = mem1 & BASE_MEM_BYTE(Decom(i + 1), Decom(i + 3), Decom(i + 6))
ElseIf IsWord(Decom(i + 6)) Then
ADD_OR_SUB = mem2 & BASE_MEM_WORD(Decom(i + 1), Decom(i + 3), Decom(i + 6))
End If
ElseIf Is_Base_Mem8(i) Then
If IsByte(Decom(i + 8)) Then
ADD_OR_SUB = mem1 & BASE_MEM8_BYTE(Decom(i + 1), Decom(i + 3), Decom(i + 4), Decom(i + 5), Decom(i + 8))
ElseIf IsWord(Decom(i + 8)) Then
ADD_OR_SUB = mem2 & BASE_MEM8_WORD(Decom(i + 1), Decom(i + 3), Decom(i + 4), Decom(i + 5), Decom(i + 8))
End If
ElseIf Is_Base_Mem16(i) Then
If IsByte(Decom(i + 8)) Then
ADD_OR_SUB = mem1 & BASE_MEM16_BYTE(Decom(i + 1), Decom(i + 3), Decom(i + 4), Decom(i + 5), Decom(i + 8))
ElseIf IsWord(Decom(i + 8)) Then
ADD_OR_SUB = mem2 & BASE_MEM16_WORD(Decom(i + 1), Decom(i + 3), Decom(i + 4), Decom(i + 5), Decom(i + 8))
End If
End If
End If


这只是当时的一个函数。
智能卡_Snooper 2008-04-02
  • 打赏
  • 举报
回复
        Case "LDS"
word1 = "C5"
word2 = "C5"
Case "LES"
word1 = "C4"
word2 = "C4"
Case "LEA"
word1 = "8D"
word2 = "8D"
Case Else
End Select
If (Decom(i) = "BYTE" Or Decom(i) = "DWORD") And Decom(i + 1) = "PTR" Then
'[]=============[]
'[]列举可能的方式
'[]mov byte ptr [1000h],1
'[]mov byte ptr [si],1
'[]mov byte ptr [si+d8],1
'[]mov byte ptr [si+d16],1
'[]mov byte ptr [bx+si],1
'[]mov byte ptr [bx+si+d8],1
'[]mov byte ptr [bx+si+d16],1
'[]=============[]
If Is_Dir_Mem(i + 2) Then
ADD_OR_SUB = BYTEPTR_DIRMEM_0(OPT, Decom(i + 3), Decom(i + 6))
ElseIf Is_InDir_Mem(i + 2) Then
ADD_OR_SUB = BYTEPTR_INDIRMEM_0(OPT, Decom(i + 3), Decom(i + 6))
ElseIf Is_InDir_Mem8(i + 2) Then
ADD_OR_SUB = BYTEPTR_INDIRMEM8_0(OPT, Decom(i + 3), Decom(i + 4), Decom(i + 5), Decom(i + 8))
ElseIf Is_InDir_Mem16(i + 2) Then
ADD_OR_SUB = BYTEPTR_INDIRMEM16_0(OPT, Decom(i + 3), Decom(i + 4), Decom(i + 5), Decom(i + 8))
ElseIf Is_Base_Mem(i + 2) Then
ADD_OR_SUB = BYTEPTR_BASEMEM_0(OPT, Decom(i + 3), Decom(i + 5), Decom(i + 8))
ElseIf Is_Base_Mem8(i + 2) Then
ADD_OR_SUB = BYTEPTR_BASEMEM8_0(OPT, Decom(i + 3), Decom(i + 5), Decom(i + 6), Decom(i + 7), Decom(i + 9))
ElseIf Is_Base_Mem16(i + 2) Then
ADD_OR_SUB = BYTEPTR_BASEMEM16_0(OPT, Decom(i + 3), Decom(i + 5), Decom(i + 6), Decom(i + 7), Decom(i + 9))
End If
End If
End Function
智能卡_Snooper 2008-04-02
  • 打赏
  • 举报
回复
我以前写过VB的。当时虽然知道有规则,但是并没有按规则写,都是逐个匹配翻译的。

Public Function ADD_OR_SUB(ByVal OPT As String) As String
Dim i As Long
Dim word1 As String
Dim word2 As String
Dim byte1 As String
Dim byte2 As String
Dim mem1 As String
Dim mem2 As String
i = 4
Select Case OPT
Case "ADC"
word1 = "11"
word2 = "13"
byte1 = "10"
byte2 = "12"
mem1 = "10"
mem2 = "11"
Case "ADD"
word1 = "01"
word2 = "03"
byte1 = "00"
byte2 = "02"
mem1 = "00"
mem2 = "01"
Case "AND"
word1 = "21"
word2 = "23"
byte1 = "20"
byte2 = "22"
mem1 = "20"
mem2 = "21"
Case "CMP"
word1 = "39"
word2 = "3B"
byte1 = "38"
byte2 = "3A"
mem1 = "38"
mem2 = "39"
Case "OR"
word1 = "09"
word2 = "0B"
byte1 = "08"
byte2 = "0A"
mem1 = "08"
mem2 = "09"
Case "SBB"
word1 = "19"
word2 = "1B"
byte1 = "18"
byte2 = "1A"
mem1 = "18"
mem2 = "19"
Case "SBB"
word1 = "29"
word2 = "2B"
byte1 = "28"
byte2 = "2A"
mem1 = "28"
mem2 = "29"
Case "TEST"
word1 = "85"
word2 = "85"
byte1 = "84"
byte2 = "84"
mem1 = "84"
mem2 = "85"
Case "XOR"
word1 = "31"
word2 = "33"
byte1 = "30"
byte2 = "32"
mem1 = "30"
mem2 = "31"
Case "XCHG"
word1 = "87"
word2 = "87"
byte1 = "86"
byte2 = "86"
mem1 = "86"
mem2 = "87"
sk_soju 2008-04-02
  • 打赏
  • 举报
回复
关键问题是我现在都不知道怎样入手 有什么最简单的例子可以借用一下的么
智能卡_Snooper 2008-04-02
  • 打赏
  • 举报
回复
俺正在做这个玩,其实很复杂的,最麻烦的就是各种指令如何转换成机器码,虽然有一定的规则,然后实现起来还是得逐个分析。
发帖
汇编语言

2.1w+

社区成员

汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
帖子事件
创建了帖子
2008-04-02 12:10
社区公告
暂无公告