利用repne scas byte ptr es:[edi]计算字符串长度


edi:存放字符串
al:存放字符x
repne scas byte ptr es:[edi] :遍历字符串,每循环一次ecx-1,遇到字符x则停止
汇编中一个很经典的计算字符串长度的方法便是利用了这条指令。

00406930  /$  89FA          mov edx,edi   
00406932  |.  89C7          mov edi,eax         ;edi里为存放的字符串
00406934  |.  B9 FFFFFFFF   mov ecx,-0x1      ;ecx放入-1
00406939  |.  30C0          xor al,al                 ;al=0,将遍历所有字符串
0040693B  |.  F2:AE         repne scas byte ptr es:[edi]    ;以字节为单位遍历字符串,每循环一次cx-1
0040693D  |.  B8 FEFFFFFF   mov eax,-0x2     
00406942  |.  29C8          sub eax,ecx        ;由于cx末尾多减了一次,因此要用-2来减去得到真正的长度
00406944  |.  89D7          mov edi,edx

 

举例:

#include<stdio.h>

int main()
{
    char str[] = "123456789";
    int strCount=0;
    int c = 0;
    _asm
    {
        lea edi,str
        mov ecx,0xFFFFFFFF
        xor al,al
        repne scas byte ptr es:[esi]
        mov eax,0xFFFFFFFE
        sub eax,ecx
        mov c,ecx

        mov strCount,eax
    }
    printf("ecx=%d  count = %d",c,strCount);
    return 0;
}

结果:

将AL里放入0x34,再试一次,程序将在循环3次后遇到4,此时停止循环,ecx=-5,count=3

posted on 2015-12-09 17:34  -Vi  阅读(2420)  评论(0编辑  收藏  举报

导航