利用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM