查找匹配字符串

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档