《80x86汇编语言程序设计教程》P212--STRSTR子程序

本文介绍了一个用汇编语言实现的strstr函数,该函数用于判断一个字符串是否是另一个字符串的子串。通过详细的代码注释解释了函数的工作原理,包括如何获取字符串长度、如何进行字符匹配等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

添加了自己的一点注释,感觉看起来更明白一点。

 

;子程序名: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值