注册算法中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]