查找匹配字符串
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验2 查找匹配字符串
一、实验目的与要求
1.进一步熟悉汇编语言运行、调试环境及方法。
2.进一步掌握循环程序的设计方法。
3.掌握显示输出、键盘输入DOS功能调用的使用方法。
二、实验内容
程序接收用户键入的一个关键字以及一个句子,如果句子中不包含关键字则显示“No Match!”;如果句子中包含关键字则显示“Match”,且把该字在句子中的位置用十六进制数显示出来。要求程序的执行过程如下:
Enter keyword:abc
Enter sentence:We are studying abc.
Match at location:11H of the sentence.
Enter keyword:xyz
Enter sentense:We are studying abc
No match!
Enter keyword:^C
三、分析与提示
程序可由三部分组成:
1.输入关键字和一个句子,分别存入相应的缓冲区中。可用DOS功能调用0AH,使用方法如下:
①字符缓冲区定义格式如下:
maxlen db 32
actlen db ?
string db 32 dup(?)
缓冲区的第一个字节定义字符的最大个数;第二个字节为实际输入的字符个数,该数据由OAH功能根据用户实际输入自动计算并填入。在这两个字节后,存放输入的字符串,字符串以回车(0DH)结束,但回车符不作实际输入字符的个数。
②输入字符串程序段如下:
LEA DX,MAXLEN
MOV AH,0AH
INT 21H
2.在句子中查找关键字
①关键字和句子中相应字段的比较可使用串比较指令。为此必须定义附加段,但附加段和数据段可定义为同一段,以便于串指令的使用。这样,相应的寄存器就有明确的定义:SI寄存器为关键字的指针;DI寄存器为句子中正相比较的字段的指针;CX寄存器存放关键字的长度。
②整个句子和关键字的比较过程可以用一个循环结构来完成。循环次数为:
句子长度-关键字长度+1
在计算循环次数时,如遇到句子长度小于关键字长度,则显示“No match!”。循环中还需用到BX寄存器,用来保存句子中当前正在比较字段的首地址。BX、SI、DI寄存器的作用如图2.1所示:
DATAREA SEGM ENT
STRING1 DB "Enter keyword:$"
STRING2 DB "Enter sentence:$"
STRING3 DB "Match at location:$"
STRING4 DB "No match!",13,10,"$"
STRING5 DB "H of the sentence.$"
keyword DB 50D,?,51D DUP(?)
sentence DB 50D,?,51D DUP(?)
DATAREA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATAREA,ES:DATAREA
START:
PUSH DS
SUB AX,AX
PUSH AX
MOV A X,DATAREA
MOV DS,AX
MOV ES,AX
LEA DX,STRING1
MOV A H,09H
INT 21H
LEA DX,keyword
MOV A H,0AH
INT 21H
MOV A H ,02H
MOV DL,0AH
INT 21H
LEA DX,STRING2
MOV A H,09H
INT 21H
LEA DX,sentence
MOV A H,0AH
INT 21H
MOV A H,02H
MOV DL,0AH
INT 21H
LEA SI,keyword+2 ;关键词
LEA DI,sentence+2
MOV A X,0
MOV A L,[sentence+1] ;句子字符个数
MOV A H,[keyword+1] ;关键词字符个数
CMP A L,A H
JL NO
SUB AL,AH
MOV A H,0
MOV CX,AX
INC CX
COMPARE:
PUSH CX
MOV CX,3 ;建议采用mov ax,字符个数,使字符的个数不固定CLD
REPZ CMPSB
JZ MATCH
MOV A X,3 ;建议采用mov ax,字符个数
SUB AX,CX
SUB SI,A X ;关键词回到词首
MOV A X,2 ;建议采用mov ax,字符个数-1
SUB AX,CX
SUB DI,AX
POP CX
LOOP COMPA RE
NO: LEA DX,STRING4
MOV A H,09H
INT 21H
JMP EXIT
MATCH: POP CX
MOV BX,DI
LEA DX,STRING3
MOV A H,09H
INT 21H
SUB BX,OFFSET sentence+2
SUB BX,2 ;首地址所在字符串中的地址CA LL CHANGE
LEA DX,STRING5
MOV A H,09H
INT 21H
EXIT:
RET
MAIN ENDP
CHANGE PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CH,4
MOV CL,4
ROTATE: ROL BX,CL
MOV A L,BL
AND A L,0FH
ADD A L,30H
CMP A L,3AH
JL PRINTIT
ADD A L,7H
PRINTIT:
MOV DL,A L
MOV A H,2
INT 21H
DEC CH
JNZ ROTATE
POP DX
POP CX
POP BX
POP AX
RET
CHANGE ENDP
CODE ENDS
END STA R T