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

📄 main.bas

📁 用VB编的51单片机反汇编程序
💻 BAS
📖 第 1 页 / 共 3 页
字号:
        NonASM = NonASM + SOp + ","
        Op = BD(Addr + 2).D
        BD(Addr + 2).F = True
        SOp = RelAddrFunc(Op) '计算rel,得到addr$
        NonASM = NonASM + SOp
        CP.Label = MyTab
'       NonASM = "CJNE R" + n$ + ",#" + a$ + "," + Addr$
    Case 192
        CP.Addr = CP.Addr + 1
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "PUSH " + SOp
        CP.Label = MyTab
    Case 194
        CP.Addr = CP.Addr + 1
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "CLR " + SOp
        CP.Label = MyTab
    Case 195
        NonASM = CP.Label + "CLR C"
        CP.Label = MyTab
    Case 196
        NonASM = CP.Label + "SWAP A"
        CP.Label = MyTab
    Case 197
        CP.Addr = CP.Addr + 1
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "XCH A," + SOp
        CP.Label = MyTab
    Case 198
        NonASM = CP.Label + "XCH A,@R0"
        CP.Label = MyTab
    Case 199
        NonASM = CP.Label + "XCH A,@R1"
        CP.Label = MyTab
    Case 200 To 207
        Op = Dt Mod 16
        SOp = Hex(Op Mod 8)
        NonASM = CP.Label + "XCH A,R" + SOp
        CP.Label = MyTab
    Case 208
        CP.Addr = CP.Addr + 1
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
       NonASM = CP.Label + "POP " + SOp
       CP.Label = MyTab
    Case 210
        CP.Addr = CP.Addr + 1
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "SETB " + SOp
        CP.Label = MyTab
    Case 211
        NonASM = CP.Label + "SETB C"
        CP.Label = MyTab
    Case 212
        NonASM = CP.Label + "DA A"
        CP.Label = MyTab
    Case 213
        CP.Addr = CP.Addr + 2
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "DJNZ " + SOp + ","
        Op = BD(Addr + 2).D
        BD(Addr + 2).F = True
        SOp = RelAddrFunc(Op)                 '计算rel,得到addr$
        NonASM = NonASM + SOp
        CP.Label = MyTab
    Case 214
        NonASM = CP.Label + "XCHD A,@R0"
        CP.Label = MyTab
    Case 215
        NonASM = CP.Label + "XCHD A,@R1"
        CP.Label = MyTab
    Case 216 To 223
        Op = Dt Mod 16
        SOp = Hex(Op Mod 8)
        NonASM = CP.Label + "DJNZ R" + SOp + ","
        CP.Addr = CP.Addr + 1
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = RelAddrFunc(Op)
        NonASM = NonASM + SOp
        CP.Label = MyTab
    Case 224
        NonASM = CP.Label + "MOVX A,@DPTR"
        CP.Label = MyTab
    Case 226
        NonASM = CP.Label + "MOVX A,@R0"
        CP.Label = MyTab
    Case 227
        NonASM = CP.Label + "MOVX A,@R1"
        CP.Label = MyTab
    Case 228
        NonASM = CP.Label + "CLR A"
        CP.Label = MyTab
    Case 229
        CP.Addr = CP.Addr + 1
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "MOV A," + SOp
        CP.Label = MyTab
    Case 230
        NonASM = CP.Label + "MOV A,@R0"
        CP.Label = MyTab
    Case 231
        NonASM = CP.Label + "MOV A,@R1"
        CP.Label = MyTab
    Case 232 To 239
        Op = Dt Mod 16
        SOp = Hex(Op Mod 8)
        NonASM = CP.Label + "MOV A,R" + SOp
        CP.Label = MyTab
    Case 240
        NonASM = CP.Label + "MOVX @DPTR,A"
        CP.Label = MyTab
    Case 242
        NonASM = CP.Label + "MOVX @R0,A"
        CP.Label = MyTab
    Case 243
        NonASM = CP.Label + "MOVX @R1,A"
        CP.Label = MyTab
    Case 244
        NonASM = CP.Label + "CPL A"
        CP.Label = MyTab
    Case 245
        CP.Addr = CP.Addr + 1
        Op = BD(Addr + 1).D
        BD(Addr + 1).F = True
        SOp = MyHex(Op)
        NonASM = CP.Label + "MOV " + SOp + ",A"
        CP.Label = MyTab
    Case 246
        NonASM = CP.Label + "MOV @R0,A"
        CP.Label = MyTab
    Case 247
        NonASM = CP.Label + "MOV @R1,A"
        CP.Label = MyTab
    Case 248 To 255
        Op = Dt Mod 16
        SOp = Hex(Op Mod 8)
        NonASM = CP.Label + "MOV R" + SOp + ",A"
        CP.Label = MyTab
    Case Else
        NonASM = ";反汇编程序错误! 代码=" + Hex(Dt) + "H?"
    End Select
End Function

Public Function MyHex(ByVal D As Long) As String
MyHex = Hex(D)
UCase (MyHex)
If (Len(MyHex) Mod 2 = 1) Then MyHex = "0" + MyHex
If (Mid(MyHex, Len(MyHex))) <> "H" Then MyHex = MyHex + "H"
If (Asc(MyHex) >= Asc("A")) Then MyHex = "0" + MyHex

End Function

Public Function RelAddrFunc(ByVal D As Integer) As String
Dim T As Integer
Dim R As String
If D >= 128 Then
    T = CP.Addr - 256 + D
    R = Hex(T)
Else
    T = CP.Addr + D
    R = Hex(T)
End If
If Len(R) < 4 Then R = "0" + R
If Len(R) < 4 Then R = "0" + R
If Len(R) < 4 Then R = "0" + R
R = "L" + R
RelAddrFunc = R
'Save Port In
PUSH RelAddrFunc + ":", T
End Function
Public Sub PUSHD(ByVal Label As String, ByVal Addr As Long, ByVal Length As Long, ByVal DBW As Boolean)
DataIn(DP).Label = Label
DataIn(DP).Addr = Addr
DataIn(DP).Length = Length
DataIn(DP).DType = DBW
DP = DP + 1
End Sub


Public Sub PUSH(ByVal Label As String, ByVal Addr As Long)
'判断重复进堆栈否?
Dim i As Long
Dim tb As Boolean
tb = True
For i = 0 To SP
    If PortIn(i).Addr = Addr Then tb = False
Next i

If tb Then
    PortIn(SP).Label = Label
    PortIn(SP).Addr = Addr
    SP = SP + 1
End If
End Sub

Public Sub POP()
CP = PortIn(SO)
SO = SO + 1
End Sub

Public Function NonDBDW(ByVal Addr As Long, ByVal Length As Long) As Boolean
Dim i, T As Long
NonDBDW = True
If BD(Addr).F Then Exit Function
If Length <= 1 Then
    If CDB.DType = True Then
        ASM(Addr) = CDB.Label + "DB " + MyHex(BD(Addr).D)
        BD(Addr).F = True
    Else
        i = BD(Addr).D
        i = i * 256 + BD(Addr + 1).D
        ASM(Addr) = CDB.Label + "DW " + MyHex(i)
        BD(Addr).F = True
        BD(Addr + 1).F = True
    End If
    Exit Function
End If
For i = 0 To Length - 1
    If CDB.DType = True Then
        ASM(Addr + i) = CDB.Label + "DB " + MyHex(BD(Addr + i).D)
        CDB.Label = MyTab
        BD(Addr + i).F = True
    Else
        T = BD(Addr + 2 * i).D
        T = T * 256
        T = T + BD(Addr + 2 * i + 1).D
        ASM(Addr + 2 * i) = CDB.Label + "DW " + MyHex(T)
        CDB.Label = MyTab
        BD(Addr + 2 * i).F = True
        BD(Addr + 2 * i + 1).F = True
    End If
Next i
End Function

Public Function StartNASM() As Boolean
Dim i, j As Long
Dim B As Boolean
For i = 0 To 65535
    BD(i).F = False
Next i
'Init PortIn
SO = 0
SP = 0
'DU = 0
'DP = 0
For i = 0 To 5000
    PortIn(i).Addr = -1
Next i
B = False
For i = 0 To 65535
    If BD(i).D <> &HFF Then
        B = True
        Exit For
    End If
Next i
If Not B Then
    StartNASM = False
    Exit Function
End If
On Error GoTo TransFail
For i = 0 To IP - 1
    CP = ProIn(i)
    Do While CP.Addr >= 0
        j = CP.Addr
        If CP.Addr >= 0 Then ASM(j) = NonASM(j)
    Loop
Next i
Do While SP >= SO
    i = CP.Addr
    If i >= 0 Then ASM(i) = NonASM(i)
    Do While CP.Addr >= 0
        i = CP.Addr
        If CP.Addr >= 0 Then ASM(i) = NonASM(i)
    Loop
    POP
Loop
For i = 0 To DP - 1
    CDB = DataIn(i)
    j = CDB.Addr
    NonDBDW j, CDB.Length
Next i
'MsgBox "反编译成功”"
StartNASM = True
Exit Function
TransFail:
MsgBox "反编译失败!"
StartNASM = False
End Function

Public Function RegMe() As Boolean
Dim Fso As New FileSystemObject
Dim hFile As TextStream
Dim T As Long
On Error GoTo GoON
Set hFile = Fso.OpenTextFile(App.Path + "\NoASM.DLL", ForReading)
Reg_code = Val(hFile.ReadLine)
CDKey = hFile.ReadLine
T = Val(hFile.ReadLine)
Num = Val(hFile.ReadLine)
hFile.Close
If (T > 10) Then
    RegMe = True
    Exit Function
End If
RegMe = CodeCompCDKey(Reg_code, CDKey)
If RegMe = False Then
    If Num <= 0 Then
        User_OK = False
    Else
        Num = Num - 1
        Set hFile = Fso.OpenTextFile(App.Path + "\NoASM.DLL", ForWriting)
        hFile.WriteLine Str(Reg_code)
        hFile.WriteLine CDKey
        hFile.WriteLine Str(T)
        hFile.WriteLine Str(Num)
        hFile.Close
    End If
End If
Exit Function
GoON:
Reg_code = GetTickCount
Set hFile = Fso.CreateTextFile(App.Path + "\NoASM.DLL", True)
hFile.WriteLine (Str(Reg_code))
hFile.WriteLine (CDKey)
hFile.WriteLine ("0")
hFile.WriteLine ("1000")
hFile.Close
RegMe = False
End Function
Public Function CodeCompCDKey(ByVal Reg_code As Long, ByVal CDKey As String) As Boolean
If CDKey = CodeToCDKey(Reg_code) Then
    CodeCompCDKey = True
Else
    CodeCompCDKey = False
End If
End Function
Public Function CodeToCDKey(ByVal Reg_code As Long) As String
Dim S2 As String
Dim S1 As String
Dim i1, i As Integer
Dim IL As Integer
S1 = Trim(Str(Reg_code))
IL = Len(S1)
CodeToCDKey = ""
For i = IL - 1 To 1 Step -1
    S2 = Mid(S1, i, 2)
    i1 = Val(S2) Mod 62
    CodeToCDKey = Mid(ASCode, i1 + 1, 1) + CodeToCDKey
Next i
End Function

⌨️ 快捷键说明

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