实验二查找匹配字符串.doc
文本预览下载声明
20001542 罗阳 00级计算机二班
实验二 查找匹配字符串
实验目的:查找匹配字符串
实验要求:程序接收键入的一个关键字和一个句子,若句子中不包含关键字,则显示‘NO MATCH’;若句子包含关键字则显示‘MATCH’,并把该关键字在句子中的位置用十六进制数显示出来。程序以输入CTRL+C退出。
实验设计思想:①输入关键字和一个句子,应分别存入相应的缓冲区,可调用功能0AH。
②在句子中查找关键字,可用串比较指令。SI:存放关键字的指针;DI:存放句子中正相比较的字段的指针;CX:存放关键字的字母个数(长度)。③整个比较过程可用一个循环结构完成。循环次数:(句子长度-关键字长度)+1,注意:在计算循环次数时,遇到句子长度关键字长度,转向显示“NO MATCH”。循环中还需用到BX寄存器,用来保存句子中当前正在比较字段的首地址。④输出信息:用功能调用09H分别显示不同的信息。若找到,还要显示匹配字符串在句子中的位置。找到时,BX寄存器的内容为匹配字符串的首地址,将其减去句子的首地址,再将差值加一即是所要的匹配字符串在句子中的位置。可将位置值转换为十六进制数从屏幕中显示出来。
源程序框图:
(见下页)
程序开始
按照要求输入关键字,并保存。
输入句子,并保存
将句子首地址放到bx和di寄存器中,si指向关键字首地址,并将dl寄存器值赋0
CX寄存器中存放关键字长度,用串比较指令,结果为0?
N
AL内容赋(关键字长度-句子长度
Y
(AL)0?
Y
N
(AL)=(AL)+1
(BX)=(BX)+1,(DI)=BX
Y
(DL)=(DL)+1,(DL)(AL)?
N
执行NOT MATCH
无
条
件
执行MATCH,并将关键字在句子中的位置转化为十六进制数输出
跳
转
结束返回
5、实验源程序:
newline macro
mov ah, 02h
mov dl, 0dh
int 21h
mov ah, 02h
mov dl, 0ah
int 21h
endm
data segment
maxlenk db 8 ;max key_word length
factlenk db ? ;key_word length to enter
key_word db 8 dup(?)
maxlens db 32 ;max sentence length
factlens db ? ;sentence length to enter
sentence db 32 dup(?)
info1 db Enter Key_word:$
info2 db Enter sentence:$
mess0 db Match at location:$
mess1 db No match.$
mess2 db ?,?,H of the sentence.$
data ends
stack segment stack
stack ends
code segment
main proc far
assume cs:code, ds:data, es:data, ss:stack
start:
push ds
sub ax, ax
push ax
mov ax, data
mov ds, ax
mov es, ax
mov ah, 09h
lea dx, info1
int 21h
mov ah, 0ah
lea dx, maxlenk
int 21h ; read the keyword
begin:
newline
mov ah, 09h
lea dx, info2
int 21h
mov ah, 0ah
lea dx, maxlens
int 21h ; read the sentence
newline
lea si, key_word
lea bx, sentence
lea di, sentence
mov dl, 00h
cld
again:
mov cl, factlenk
repz cmpsb
jz match
mov al, factlens
sub al,factlenk
显示全部