能力值:
( LV2,RANK:10 )
|
-
-
2 楼
自己找资料看了看,再对比跟踪结果,确定
MSVBVM60.__vbaStrCmp
返回值在eax中,
可是不明白的是
/*401BFE*/ call dword ptr [<&MSVBVM60.__vbaStrCmp>]
后面几句
/*401C04*/ mov esi, eax
/*401C06*/ lea ecx, dword ptr [ebp-18]
/*401C09*/ neg esi
/*401C0B*/ sbb esi, esi
/*401C0D*/ inc esi
/*401C0E*/ neg esi
/*401C10*/ call dword ptr [<&MSVBVM60.__vbaFreeStr>]
/*401C16*/ lea ecx, dword ptr [ebp-1C]
/*401C19*/ call dword ptr [<&MSVBVM60.__vbaFreeObj>]
/*401C1F*/ mov ecx, 80020004
/*401C24*/ mov eax, 0A
/*401C29*/ cmp si, di
用意何在?
反正MSVBVM60.__vbaStrCmp返回值就那么几种-1,1,0,null
直接判断eax的值不就可以了么?
望大家指教,谢谢
|
能力值:
(RANK:570 )
|
-
-
3 楼
STRCMP从字意上可以推断是字符串比较吧?那么后面一定得有一个比较指令,来控制程序的流程。所以后面那个CMP,实际就是比较STRCMP的返回结果,然后转向不同的流程。
另外你没有给出跟DI相关的代码,DI怎么来的,没给,别人怎么分析呢?
当然自己分析最好,一个程序这么多代码,就给其中一小部分,很难说清楚的。
最好自己用VB写一个字符比较的程序,然后反汇编看看
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
谢谢斑竹回复,DI始终为0
我是不明白
MSVBVM60.__vbaStrCmp
把返回结果存入eax
为什么程序还要把eax 复值给esi
然后用
/*401C06*/ lea ecx, dword ptr [ebp-18]
/*401C09*/ neg esi
/*401C0B*/ sbb esi, esi
/*401C0D*/ inc esi
/*401C0E*/ neg esi
/*401C10*/ call dword ptr [<&MSVBVM60.__vbaFreeStr>]
/*401C16*/ lea ecx, dword ptr [ebp-1C]
/*401C19*/ call dword ptr [<&MSVBVM60.__vbaFreeObj>]
/*401C1F*/ mov ecx, 80020004
/*401C24*/ mov eax, 0A
来把esi处理一番,
最后比较si 与di (di始终==0)
为什么不直接比较eax是否==0来判断字符串是否相等呢?
程序就是我用VB写的一个简单的,
Private Sub Command1_Click()
If Text1.Text = "xixihaha" Then
MsgBox "ok"
Else
MsgBox "not ok"
End If
End Sub
|
能力值:
(RANK:570 )
|
-
-
5 楼
你应该去问写编译器的作者。
你可以试试按你的想法去改。
如果正常运行了。那就是你说的也是对的
就象去一个地方,可以步行,可以用自行车,也能坐公车或者出租车。你问我为什么要用步行的,我还真的不知道该怎么答你
|
能力值:
( LV12,RANK:210 )
|
-
-
6 楼
*401C06*/ lea ecx, dword ptr [ebp-18]
/*401C09*/ neg esi
/*401C0B*/ sbb esi, esi
/*401C0D*/ inc esi
/*401C0E*/ neg esi
/*401C10*/ call dword ptr [<&MSVBVM60.__vbaFreeStr>]
/*401C16*/ lea ecx, dword ptr [ebp-1C]
/*401C19*/ call dword ptr [<&MSVBVM60.__vbaFreeObj>]
/*401C1F*/ mov ecx, 80020004
/*401C24*/ mov eax, 0A
vb的东东。 因为你的字符串是在stack的变量。
If Text1.Text = "xixihaha" Then
MsgBox "ok"
Else
MsgBox "not ok"
End If
首先, vb会给你生成一个临时的variant对象,
然后把text1.text的值放到这个变量中去。
你退出了Command1_Click(), 你说这个临时变量需要释放内存吗?
当然就有。
/*401C10*/ call dword ptr [<&MSVBVM60.__vbaFreeStr>]
/*401C16*/ lea ecx, dword ptr [ebp-1C]
/*401C19*/ call dword ptr [<&MSVBVM60.__vbaFreeObj>]
这种代码你可以不考虑的。
至于为什么要
cmp si, di这样, 不是直接test eax,eax呢。
你属于钻牛角尖。
比如我做编译器, 我生成代码的时候, 要比较字符串。
我一定会生成cmp esi,edi的值。
这个值怎么来, 我就希望在上面能得到。
比如mov esi, eax.
这叫约定。 懂吗。 不要觉得罗嗦。。。
|
|
|