添加了自己的一点注释,感觉看起来更明白一点。
;子程序名:strstr
;功 能:判断字符串2是否是字符串1的字串
;入口参数:指向字符串的远指针
;出口参数:DX:AX返回指向字符串2在字符串1中首次出现处的指针
;说 明:调用方法如下--
; 压入字符串2的远指针
; 压入字符串1的远指针
; call far ptr strstr
strstr proc far
push bp
mov bp, sp
push ds
push es
push bx
push cx
push si
push di
;
les bx, [bp+10]
cmp byte ptr es:[bx], 0 ;判str2是否为空串
jnz strstr1
mov dx, [bp+8]
mov ax, [bp+6]
jmp short strstr6
;
strstr1:
cld
les di, [bp+6] ;取str1指针
push es
mov bx, di
xor ax, ax
mov cx, 0ffffh
repnz scasb
not cx
mov dx, cx ;使DX含str1长度(含结束标志)
;
les di, [bp+10] ;取str2指针
push es
mov bp, di
xor ax, ax
mov cx, 0ffffh
repnz scasb
not cx
dec cx ;CX为str2长度(不含结束标志)
;
pop ds ;DS:BP指向str2
pop es ;ES:BX指向str1
;
strstr2:
mov si, bp ;DS:SI指向str2
lodsb ;取str2的第一个字符
;此时,si加1指向str2的第二个字符
mov di, bx
xchg cx, dx ;使CX含str1长度,DX含str2长度
repnz scasb ;在str1中搜索str2的第一个字符
mov bx, di ;1.找到--di指向找到字符的下一位
;2.找不到--di指向0后面的一位
jnz strstr3 ;找不到,转
cmp cx, dx ;str1剩下字符数(包括结束标志)CX,与str2的字符数DX比较
jnb strstr4 ;大于等于则进入字符串其它字符的比较
; '*','*','M',|'A','S','M',0|
; |'M','A','S','M'|
strstr3: ;找不到处理
xor bx, bx
mov es, bx
mov bx, 1
jmp short strstr5
;
strstr4:
xchg cx, dx ;使CX含str2长度,DX含str1长度
mov ax, cx
dec cx
repz cmpsb ;判str1中是否有str2后续字符
mov cx, ax
jnz strstr2 ;没有,转继续找
;
strstr5:
mov ax, bx ;找到!
dec ax ;准备返回值
mov dx, es
;
strstr6:
pop di
pop si
pop cx
pop bx
pop es
pop ds
pop bp
ret
strstr endp