|
发表于 2016-12-1 01:37:06
|
显示全部楼层
本帖最后由 xieglt 于 2016-12-1 07:27 编辑
;_StringLen PROC __stdcall,string
;求字符串长度,要求字符串以0结束如: msg db "Hello,world",0
;返回值在EAX中,长度不包括最后的0 ,如上面的 msg 长度为 11
;调用方法 PUSH offset msg
; CALL _StringLen
;返回值在EAX中
_StringLen PROC
PUSH EBP
MOV EBP,ESP
PUSH ECX
PUSH EDI
MOV EDI,DWORD PTR [EBP + 8]
XOR EAX,EAX
XOR ECX,ECX
DEC ECX
REPNE SCASB
NOT ECX
MOV EAX,ECX
DEC EAX
POP EDI
POP ECX
MOV ESP,EBP
POP EBP
RET 4
_StringLen ENDP
;_StringFind PROC __stdcall , string1,string2
;在一个字符串(string1)中查找另一个字符串(string2)
;如果没有找到,则返回0,找到则返回子字符串在父字符串中的位置,从0开始计数
;比如:
;str1 DB "Hello,c plus plus!",0
;str2 DB "plus",0
;PUSH OFFSET str2
;PUSH OFFSET str1
;CALL _StringFind
;则返回eax = 8
_StringFind PROC
PUSH EBP
MOV EBP,ESP
SUB ESP,4
PUSH ECX
PUSH ESI
PUSH EDI
PUSH DWORD PTR [EBP + 12]
CALL _StringLen
MOV DWORD PTR [EBP - 4],EAX
PUSH DWORD PTR [EBP + 8]
CALL _StringLen
CMP EAX,DWORD PTR [EBP - 4]
JL _IsNotFound
MOV ECX,EAX
SUB ECX,DWORD PTR [EBP - 4]
MOV ESI,DWORD PTR [EBP + 8]
MOV EDI,DWORD PTR [EBP + 12]
_SearchForString:
PUSH ESI
PUSH EDI
MOV EAX,DWORD PTR [EBP - 4]
XCHG EAX,ECX
REPE CMPSB
POP EDI
POP ESI
JCXZ _FoundIt
INC ESI
XCHG EAX,ECX
LOOP _SearchForString
_IsNotFound:
XOR EAX,EAX
JMP _FindExit
_FoundIt:
MOV EAX,ESI
SUB EAX,DWORD PTR [EBP + 8]
_FindExit:
POP EDI
POP ESI
POP ECX
MOV ESP,EBP
POP EBP
RET 8
_StringFind ENDP
字符串处理一定要善用汇编的串处理指令,而不要一个字节一个字节的去比较
SCASB/W/D 串指针 EDI
CMPSB/W/D 串指针 ESI,EDI
LODSB/W/D 串指针ESI
STOSB/W/D 串指针EDI |
|