I'm trying to replace native x86 asm to C++ code so I can make a emulator.
I got this
If ereg(ASM, "PUSH ([A-F0-9\s]+)", False) Then
ASM = ereg_replace(ASM, "PUSH ([A-F0-9\s]+)", _
"regs.d.esp -= 4;" & vbNewLine & _
"*(unsigned int *)(regs.d.esp) = $1;", False)
End If
Functions I found on the internet.. should work.. as they are on google.
Function ereg(strOriginalString, strPattern, varIgnoreCase)
' Function matches pattern, returns true or false
' varIgnoreCase must be TRUE (match is case insensitive) or FALSE (match is case sensitive)
Dim objRegExp: Set objRegExp = New RegExp
With objRegExp
.Pattern = strPattern
.IgnoreCase = varIgnoreCase
.Global = True
End With
ereg = objRegExp.test(strOriginalString)
Set objRegExp = Nothing
End Function
Function ereg_replace(strOriginalString, strPattern, strReplacement, varIgnoreCase)
' Function replaces pattern with replacement
' varIgnoreCase must be TRUE (match is case insensitive) or FALSE (match is case sensitive)
Dim objRegExp: Set objRegExp = New RegExp
With objRegExp
.Pattern = strPattern
.IgnoreCase = varIgnoreCase
.Global = True
End With
ereg_replace = objRegEx开发者_开发问答p.Replace(strOriginalString, strReplacement)
Set objRegExp = Nothing
End Function
I start up with.
/* 401187 */
PUSH 466F20
and want to end up with..
/* 401187 */
regs.d.esp -= 4;
*(unsigned int *)(regs.d.esp) = 466F20;
But function above, ran ends up with..
/* 401187 */
regs.d.esp -= 4;
*(unsigned int *)(regs.d.esp) = 466F20
;
..Err don't worry about it not being 0x466F20; (that I will do later with a second pass).
bad regular expression...
instead of
"PUSH ([A-F0-9\s]+)"
I had to use
"PUSH ([A-F0-9]+)"
\s
was capturing new lines.
精彩评论