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