⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.bas

📁 用VB编的51单片机反汇编程序
💻 BAS
📖 第 1 页 / 共 3 页
字号:
Attribute VB_Name = "ModMain"
Option Explicit
'该类型数据用于存储机器码数据
Public Type MyType
    D As Byte
    F As Boolean
End Type
'0~FFFFH个数据
Public BD(0 To 65535) As MyType
'入口地址的数据结构
Public Type MyPort
    Addr As Long
    Label As String
End Type
'
Public Type MyDataDBDW
    Label As String
    Addr As Long
    Length As Long
    DType As Boolean
End Type
'作为入口地址的FIFO
Public PortIn(0 To 5000) As MyPort
Public ProIn(0 To 1000) As MyPort
Public IP As Long
Public DataIn(0 To 1000) As MyDataDBDW
Public CDB As MyDataDBDW
Public CP As MyPort
Public L As String '回车换行符
'Public CP.addr As Long '下一个待编译的语句的开始地址
'Public CP.label As String '下一个语句的开始字符
Public Const MyTab = "      "
Public OpenFilePathName As String
Public SaveFilePathName As String
Public ASM(-1 To 65535) As String
Public SP As Integer 'FIFO入口指针
Public SO As Integer 'FIFO出口指针
Public DP As Integer 'FIFO入口指针
'Public DU As Integer 'FIFO出口指针
Public Declare Function GetTickCount Lib "kernel32" () As Long
Public Reg_code As Long
Public CDKey As String
Public Reg_OK As Boolean '软件是否注册
Public User_OK As Boolean '软件是否还能使用
Public Num As Integer '软件使用的次数
Public Const ASCode = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

Public Sub Main()
User_OK = True
Reg_OK = RegMe
'init
SO = 0
SP = 0
DP = 0
Dim i As Long
L = Chr(13) + Chr(10)
For i = 0 To 65535
    BD(i).D = 255
    BD(i).F = False
    ASM(i) = ""
Next i
For i = 0 To 5000
    PortIn(i).Addr = -1
Next i
For i = 0 To 1000
    DataIn(i).Addr = -1
Next i
For i = 1 To 1000
    ProIn(i).Addr = -1
Next i
IP = 1
ProIn(0).Addr = 0
ProIn(0).Label = "BEGIN:"
FrmMain.Show
End Sub

Public Function Val4Hex(ByVal Str As String) As Long
'四位十六进制字符转为Int数据
If Len(Str) > 4 Then Str = Right(Str, 4)
Val4Hex = Val("&H" + Right(Str, 2)) + 256 * Val("&H" + Left(Str, Len(Str) - 2))
End Function


Public Function NonASM(ByVal Addr As Integer) As String
'使用的全局变量有CP.addr,CP.label
'CP.addr表示下一个要编译的数据地址
'CP.label表示下一个语句前面的字符
Dim Dt As Integer
Dim Op As Long '暂存操作数
Dim SOp As String
Dim LAddr As Long
Dim SLAddr As String
Dim i As Integer
If BD(Addr).F Then
    i = Len(ASM(Addr))
    If i > 7 Then NonASM = CP.Label + Right(ASM(Addr), Len(ASM(Addr)) - 6)
    CP.Label = MyTab
    CP.Addr = -1
    Exit Function
End If
Dt = BD(Addr).D
BD(Addr).F = True
CP.Addr = Addr + 1
Select Case Dt
    Case 0
        NonASM = CP.Label + "NOP"
        CP.Label = MyTab
    Case 1, 33, 65, 97, 129, 161, 193, 225 'AJMP
        CP.Addr = -1
        Op = (Addr \ &H800) * &H800 + 256 * (Dt \ 32)
        Op = Op + BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = Hex(Op)
        If Len(SOp) < 4 Then SOp = "0" + SOp
        If Len(SOp) < 4 Then SOp = "0" + SOp
        If Len(SOp) < 4 Then SOp = "0" + SOp
        SOp = "L" + SOp
        PUSH SOp + ":", Op
        NonASM = CP.Label + "AJMP " + SOp
        CP.Label = MyTab
    Case 2
        Op = BD(Addr + 1).D
        Op = Op * 256 + BD(Addr + 2).D
        BD(Addr + 1).F = True
        BD(Addr + 2).F = True
        SLAddr = Hex(Op)
        If Len(SLAddr) < 4 Then SLAddr = "0" + SLAddr
        If Len(SLAddr) < 4 Then SLAddr = "0" + SLAddr
        If Len(SLAddr) < 4 Then SLAddr = "0" + SLAddr
        If Len(SLAddr) < 4 Then SLAddr = "0" + SLAddr
        SLAddr = "L" + SLAddr
        NonASM = CP.Label + "LJMP " + SLAddr
        CP.Addr = Op
        CP.Label = SLAddr + ":"
    Case 3
        NonASM = CP.Label + "RR A"
        CP.Label = MyTab
    Case 4
        NonASM = CP.Label + "INC A"
'        CP.addr = Addr + 1
        CP.Label = MyTab
    Case 5
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "INC " + SOp
        CP.Addr = CP.Addr + 1
        CP.Label = MyTab
    Case 6
        NonASM = CP.Label + "INC @R0"
'        CP.addr = Addr + 1
        CP.Label = MyTab
    Case 7
        NonASM = CP.Label + "INC @R1"
 '       CP.addr = Addr + 1
        CP.Label = MyTab
    Case 8 To 15
        Op = Dt Mod 16                   '求Rn的下标n的串
        SOp = Hex(Op Mod 8)
        NonASM = CP.Label + "INC R" + SOp
'        CP.addr = Addr + 1
        CP.Label = MyTab
    Case 16                        'JBC BIT,REL
        CP.Addr = CP.Addr + 2
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "JBC " + SOp + ","
        Op = BD(Addr + 2).D
        BD(Addr + 2).F = True
        SOp = RelAddrFunc(Op)
        NonASM = NonASM + SOp
        CP.Label = MyTab
    Case 17, 49, 81, 113, 145, 177, 209, 241
        CP.Addr = CP.Addr + 1
        Op = (Addr \ &H800) * &H800 + 256 * (Dt \ 32)
        Op = Op + BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = Hex(Op)
        If Len(SOp) < 4 Then SOp = "0" + SOp
        If Len(SOp) < 4 Then SOp = "0" + SOp
        If Len(SOp) < 4 Then SOp = "0" + SOp
        SOp = "L" + SOp
        PUSH SOp + ":", Op
        NonASM = CP.Label + "ACALL " + SOp
        CP.Label = MyTab
    Case 18
        CP.Addr = CP.Addr + 2
        Op = BD(Addr + 1).D * 256 + BD(Addr + 2).D
        BD(Addr + 1).F = True
        BD(Addr + 2).F = True
        SOp = Hex(Op)
        If Len(SOp) < 4 Then SOp = "0" + SOp
        If Len(SOp) < 4 Then SOp = "0" + SOp
        If Len(SOp) < 4 Then SOp = "0" + SOp
        SOp = "L" + SOp
        PUSH SOp + ":", Op 'Save Port In
        NonASM = CP.Label + "LCALL " + SOp
        CP.Label = MyTab
    Case 19
'        CP.addr = Addr + 1
        NonASM = CP.Label + "RRC A"
        CP.Label = MyTab
    Case 20
        NonASM = CP.Label + "DEC A"
'        CP.addr = Addr + 1
        CP.Label = MyTab
    Case 21
        CP.Addr = CP.Addr + 1
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "DEC " + SOp
        CP.Label = MyTab
    Case 22
        NonASM = CP.Label + "DEC @R0"
        CP.Addr = CP.Addr + 1
        CP.Label = MyTab
    Case 23
        NonASM = "DEC @R1"
        CP.Label = MyTab
    Case 24 To 31
        Op = Dt Mod 16
        SOp = Hex(Op Mod 8)
        NonASM = "DEC R" + SOp
        CP.Label = MyTab
    Case 32
        CP.Addr = CP.Addr + 2
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "JB " + SOp + ","
        Op = BD(Addr + 2).D
        BD(Addr + 2).F = True
        SOp = RelAddrFunc(Op)                 '计算rel,得到addr$
        NonASM = NonASM + SOp
        CP.Label = MyTab
    Case 34
        NonASM = CP.Label + "RET"
        CP.Addr = -1
    Case 35
        NonASM = CP.Label + "RL A"
        CP.Label = MyTab
    Case 36
        CP.Addr = CP.Addr + 1
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "ADD A,#" + SOp
        CP.Label = MyTab
    Case 37
        CP.Addr = CP.Addr + 1
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "ADD A," + SOp
        CP.Label = MyTab
    Case 38
        NonASM = CP.Label + "ADD A,@R0"
        CP.Label = MyTab
    Case 39
        NonASM = CP.Label + "ADD A,@R1"
        CP.Label = MyTab
    Case 40 To 47
        Op = Dt Mod 16
        SOp = Hex(Op Mod 8)
        NonASM = CP.Label + "ADD A,R" + SOp
        CP.Label = MyTab
    Case 48
        CP.Addr = CP.Addr + 2
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "JNB " + SOp + ","
        Op = BD(Addr + 2).D
        BD(Addr + 2).F = True
        SOp = RelAddrFunc(Op)
        '计算rel,得到addr$
        NonASM = NonASM + SOp
        CP.Label = MyTab
    Case 50
        NonASM = CP.Label + "RETI"
        CP.Addr = -1
    Case 51
        NonASM = CP.Label + "RLC A"
        CP.Label = MyTab
    Case 52
        CP.Addr = CP.Addr + 1
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "ADDC A,#" + SOp
        CP.Label = MyTab
    Case 53
        CP.Addr = CP.Addr + 1
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "ADDC A," + SOp
        CP.Label = MyTab
    Case 54
        NonASM = CP.Label + "ADDC A,@R0"
        CP.Label = MyTab
    Case 55
        NonASM = CP.Label + "ADDC A,@R1"
        CP.Label = MyTab
    Case 56 To 63
        Op = Dt Mod 16
        SOp = Hex(Op Mod 8)
        NonASM = CP.Label + "ADDC A,R" + SOp
    Case 64
        CP.Addr = CP.Addr + 1
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = RelAddrFunc(Op)
        NonASM = CP.Label + "JC " + SOp
        CP.Label = MyTab
    Case 66
        CP.Addr = CP.Addr + 1
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "ORL " + SOp + ",A"
    Case 67
        CP.Addr = CP.Addr + 2
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "ORL " + SOp + ",#"
        Op = BD(Addr + 2).D
        BD(Addr + 2).F = True
        SOp = MyHex(Op)
        NonASM = NonASM + SOp
        CP.Label = MyTab
    Case 68
        CP.Addr = CP.Addr + 1
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "ORL A,#" + SOp
        CP.Label = MyTab
    Case 69
        CP.Addr = CP.Addr + 1
        Op = BD(Addr + 1).D
        SOp = MyHex(Op)
        NonASM = CP.Label + "ORL A," + SOp
        CP.Label = MyTab
    Case 70
        NonASM = CP.Label + "ORL A,@R0"
        CP.Label = MyTab
    Case 71
        NonASM = CP.Label + "ORL A,@R1"
        CP.Label = MyTab
    Case 72 To 79
        Op = Dt Mod 16
        SOp = Hex(Op Mod 8)
        NonASM = CP.Label + "ORL A,R" + SOp
        CP.Label = MyTab
    Case 80
        CP.Addr = CP.Addr + 1
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = RelAddrFunc(Op)
        NonASM = CP.Label + "JNC " + SOp
        CP.Label = MyTab
    Case 82
        CP.Addr = CP.Addr + 1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -