继续混时间……继续些无聊的代码……等待工作…… strstr是一个经常用到的函数,很多人初学时总认为这个函数WINDOWS不提供,于是自己编写,我也是其中之一……(实际在ADVAPI32.DLL里有lstrstr函数)。 现在写个简单的strstr,没有用什么算法……简单得可以说直接抄袭…… 首先是用C语言写的大体思路: 01 #include <stdio.h> 02 #include <windows.h> 03 04 int mystrstr(char *addr1, char *addr2) 05 { 06 int m,n; 07 int x; 08 x=strlen(addr1); 09 for (n=0; n<=strlen(addr1); n++) 10 { 11 if (*addr1+n == *addr2) 12 { 13 for (m=0; m<=strlen(addr2); m++) 14 { 15 if (*addr1+n+m != *addr2+m) 16 { 17 break; 18 } 19 if (m == strlen(addr2)) 20 { 21 return n; 22 } 23 } 24 } 25 26 } 27 28 return 0; 29 } 30 int main() 31 { 32 int num; 33 num = mystrstr("12345678","78"); 34 printf("%d",num); 35 return 0; 36 } 37 38 就这样了…… 好,现在用汇编写一下: 01 strstr proc pszHaystack:PTR BYTE, pszNeedle:PTR BYTE, dwCaseSensitive:DWORD 02 push esi 03 push edi 04 xor eax, eax 05 xor ecx, ecx 06 xor edx, edx 07 mov esi, [pszHaystack] 08 mov edi, [pszNeedle] 09 @@char: mov al, byte ptr [esi] 10 mov ah, byte ptr [edi] 11 cmp [dwCaseSensitive], 0 12 jne @@cmp1 13 cmp al, "Z" 14 ja @@cmp0 15 cmp al, "A" 16 jb @@cmp0 17 add al, 32 18 @@cmp0: cmp [dwCaseSensitive], 0 19 jne @@cmp1 20 cmp ah, "Z" 21 ja @@cmp1 22 cmp ah, "A" 23 jb @@cmp1 24 add ah, 32 25 @@cmp1: cmp al, ah 26 jne @@next 27 inc ecx 28 mov eax, esi 29 inc edi 30 inc esi 31 inc eax 32 cmp byte ptr [esi], 0 33 je @@zero 34 cmp byte ptr [edi], 0 35 je @@quit 36 jmp @@char 37 @@zero: mov dl, byte ptr [edi] 38 cmp dl, byte ptr [esi] 39 je @@quit 40 xor eax, eax 41 xor ecx, ecx 42 jmp @@quit 43 @@next: mov edi, [pszNeedle] 44 test ecx, ecx 45 setz dl 46 add esi, edx 47 xor ecx, ecx 48 xor eax, eax 49 cmp byte ptr [esi], 0 50 jne @@char 51 @@quit: sub eax, ecx 52 pop edi 53 pop esi 54 ret 55 strstr endp 好像从哪抄来的……因为其对大小写有判断,所以……把自己的那段扔了…… 以后有时间把KMP算法用汇编实现一下,当然这个“以后”是个很长的时间…… 
|