- 论坛徽章:
- 0
|
I386汇编的
;##########################################################
;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 |
|
|