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