键盘输入一段正文串text(长度为n)和模式串pattern(长度为m),且n>>m,显示模式串pattern在正文串text中所有出现的首位置,若不出现则显示-1。
- include io.inc
- .model small
- .stack
- .data
- text db 100 dup(?);定义缓存区,用于存放输入的字符串
- pattern db 10 dup(?);定义缓存区,用于存放待搜索的字符串
- A db 'please input string1:',0
- B db 'please input string2:',0
- flag db '-1'
- count dw 1
- n db 0;用于存放输入的待查找字符串的长度
- i dw 0;用于存放字符串长度
- j dw 0
- .code
- .startup
- mov ax,offset A
- call dispmsg;输入提示
- lea ax,text
- call readmsg;输入字符串
- mov i,ax;保存字符串长度
- mov ax,offset B
- call dispmsg;输入提示
- lea ax,pattern
- call readmsg;输入字符串
- mov j,ax;保存待搜索串长度
- mov dx,offset text;text的首地址
- mov di,dx;
- mov cx,i;text的长度,作为loop的跳出循环条件
- cld
- again1:xor bx,bx;使用bx指示逐个字符比较,
- again2: mov al,pattern[bx]
- cmp al,[bx+di]; 比较一个字符
- jne next;不相等就跳转
- inc bx;指向下一个字符
- cmp bx,j;比较bx和search的数量
- je found;字符串比较完,仍相等,则查找到,相等则跳转
- jmp again2;无条件转移,再次循环
- next: Inc di;偏移地址+1
- loop again1;出现了不等的情况,回到again重新比较 每执行一次loop指令,cx-1.当cx为0,即text被遍历了一遍后停止
- dec count;标识count-1
- jz print;如果为0则表示没有找到,跳转输出-1
- jmp done
- found: mov ax,di;将偏移地址传给ax
- sub ax,dx;减法,得到带搜索串的首地址,此时dx等于带搜索串长度
- add ax,1;输出控制,+1
- call dispuiw
- call dispcrlf
- add count,1;每次找到count就+1
- ;Inc di
- jmp next;返回next继续运算
- done: ;出口
- .exit
- print proc;输出-1
- mov ax,offset flag
- call dispmsg
- jmp done
- ret
- print endp
- End
-
运行结果: