2.1w+
社区成员
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
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
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"