键盘输入一段正文串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
运行结果: