#include<stdio.h> #include<unistd.h> char *my_strstr(char *,char *); int main(int argc,char *argv[]) { char *presult; if(3!=argc){ printf("Usage:%s <dst> <src>\n",argv[0]); exit(1); } presult=my_strstr(argv[1],argv[2]); printf("%s\n",presult); exit(0); } char *my_strstr(char *str,char *sub_str) { int i=0,j=0; while(str[i]!='\0'&&sub_str[j]!='\0') { if(str[i]==sub_str[j]) { i++; j++; } else { i=i-j+1; j=0; } } if(sub_str[j]=='\0') return (char *)(str+i-j); return NULL; } |
;########################################################## ;strstr函数的实现。 ;使用_TEXT SEGMENT,_DATA SEGMENT伪指令 ;########################################################## PUBLIC CRT_strstr _TEXT SEGMENT CRT_strstr PROC USES EBX ESI EDI lpStr:DWORD,lpSubStr:DWORD  ROCSTART: MOV ESI,[EBP+8] ;ESI=lpStr MOV EBX,[EBP+12] ;EBX=lpSubStr MOV EDI,EBX ;EDI=lpSubStr FIRSTCMP: XOR ECX,ECX ;ECX=0 XOR EDX,EDX ;EDX=0 MOV CL,[ESI] ;CL=(*lpStr) MOV DL,[EDI] ;DL=(*lpSubStr) CMP CL,0h ; JZ ZERORETURN ;if((*ESI)==0) GOTO ZERORETURN CMP DL,0h ; JZ ZERORETURN ;if((*EDI)==0) GOTO ZERORETURN NOP CMP CL,DL ; JE READYSECCMP ;if((*ESI)==(*EDI)) GOTO READYSECCMP INC ESI ;ESI++ JMP FIRSTCMP ;if((*ESI)!=(*EDI)) GOTO FIRSTCMP READYSECCMP: MOV EAX,ESI ;EAX=ESI (recording ret addr) SECONDCMP: INC ESI ;ESI++ INC EDI ;EDI++ XOR ECX,ECX ;ECX=0 XOR EDX,EDX ;EDX=0 MOV CL,[ESI] ;CL=(*ESI) MOV DL,[EDI] ;DL=(*EDI) NOP CMP DL,0h ; JZ PROCEXIT ;if((*EDI)==0) GOTO PROCEXIT (Successful Matched) CMP CL,0h ; JZ ZERORETURN ;if((*ESI)==0) GOTO ZERORETURN NOP CMP CL,DL ; JE SECONDCMP ;if(CL=DL) GOTO SECONDCMP MOV EDI,EBX ;ECX=lpSubStr JNE FIRSTCMP ;else GOTO FIRSTCMP ZERORETURN: XOR EAX,EAX ;EAX=NULL  ROCEXIT: NOP RET 8 ;return to caller CRT_strstr ENDP _TEXT ENDS |
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |