(1)strlen(char *s)
.386
.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
include msvcrt.inc
includelib msvcrt.lib
.data
szText db "Reverse Engineering", 0
format db "length = %d", 0AH, 0
.code
main PROC
LEA EDI, szText
MOV ECX,0FFFFFFFFH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
XOR AL, AL
MOV EBX, EDI
REPNE SCASB
INC EDI
SUB EDI, EBX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INVOKE crt_printf, addr format, EDI
INVOKE crt_getchar
INVOKE ExitProcess, 0
main ENDP
END main
将eax置为0,用scasb,使得edi与eax的值比较,直到edi所指地址存的数据为’/0′,即为字符串结束时停止循环,此时与edi最初的位置(ebx)向减,再减去’/0’所占用的1,即为字符串长度,结果为19 。
(2)strchr(const *char s)
.386
.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
include msvcrt.inc
includelib msvcrt.lib
.data
szText db "Reverse Engineering", 0
chr db 'i'
format db "%d", 0AH, 0
.code
main PROC
LEA EDI, szText
MOV ECX,0FFFFFFFFH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV EBX,EDI
MOV EAX,i
R