zoukankan      html  css  js  c++  java
  • 利用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

  • 相关阅读:
    Javascript DMO 编程艺术
    PHPExcel
    MYSQL
    AJAX全接触
    正则表达式
    常用知识
    PHP 常用函数
    thinkphp5 公共函数的使用与调用
    thinkphp 使用phpExcel 导入和导出
    php 判断是pc端还是移动端
  • 原文地址:https://www.cnblogs.com/Viwilla/p/5033588.html
Copyright © 2011-2022 走看看