码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-12-09 19:05:14      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:


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

技术分享

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

标签:

原文地址:http://www.cnblogs.com/Viwilla/p/5033588.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!