hahacker 发表于 2010-7-23 14:29:15

注册算法中test bl,bl的问题!

004013C2/$33FF          xor edi,edi                              ;EDI清零
004013C4|.33DB          xor ebx,ebx                              ;EBX清零
004013C6|>8A1E          /mov bl,byte ptr ds:                ;将ESI所指的name取出一位到bl
004013C8|.84DB          |test bl,bl                              ;name中还有字符吗
004013CA|.74 05         |je short serial.004013D1                ;没有计算结束
004013CC|.03FB          |add edi,ebx                           ;EDI=EDI+EBX依次将name中字符相加
004013CE|.46            |inc esi                                 ;将指针移向下一字符
004013CF|.^ EB F5         \jmp short serial.004013C6               ;跳转
004013D1\>C3            retn                                     ;返回
下断时输入的字符串是abcde,但算法会把字母小写转化为大写ABCDE,在004013C2一行下断,当在OD里走了几次后,当运行jmp short serial.004013C6后跳到mov bl,byte ptr ds:,这时堆栈面板有以下信息:
ds:=00
bl=45 ('E')
跳转来自 004013CF
现在光标停留在mov bl,byte ptr ds:这一行,我把这行运行后,光标停到test bl,bl上,这时bl=0;再运行
这行test bl,bl后,OD提示跳转已实现.
我的问题在于:
原来:EBX清零后,A与0不等,跳转不实现,移向下一字符,B与A不等,不跳向下移。C与B不等,不跳向下移,D与C不
等,不跳向下移。E与D不等再向下移,这时我不明白的问题出来了:再向下移时,
ds:=00
bl=45 ('E')
这时把0给了bl了,bl应该是0了,是不是把E的下一个字符'\0'(在C语言中:字符串"ABCDE",存储方式E后面有'\0',
而'\0'的ASCII值是0),虽然这时bl被给0了,但原来的bl还是'E'啊,还是不相等啊,应该再向下移,也就是再循环
一次后,原来的就是test bl(这时是0了)bl(这时的源操作数还是'E'啊),所以我想还应该循环一次,但实事是:
OD没有再循环,就提示跳转已实现.就这点不明白!
页: [1]
查看完整版本: 注册算法中test bl,bl的问题!