实验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寄存器,用来保存句子中当前正在比较字段的首地址。BXSIDI寄存器的作用如图2.1所示:
DATAREA SEGMENT
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 AX,DATAREA
MOV DS,AX
MOV ES,AX
LEA DX,STRING1
MOV AH,09H
INT 21H
LEA DX,keyword
MOV AH,0AH
INT 21H
MOV AH ,02H
MOV DL,0AH
INT 21H
LEA DX,STRING2
MOV AH,09H
INT 21H
LEA DX,sentence
MOV AH,0AH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
LEA SI,keyword+2 ;关键词
LEA DI,sentence+2
MOV AX,0
MOV AL,[sentence+1] ;句子字符个数
MOV AH,[keyword+1] ;关键词字符个数
CMP AL,AH
JL NO
SUB AL,AH
MOV AH,0
MOV CX,AX
INC CX
COMPARE:
PUSH CX
MOV CX,3 ;建议采用mov ax,字符个数,使字符的个数不固定
CLD
REPZ CMPSB
JZ MATCH
MOV AX,3 ;建议采用mov ax,字符个数
SUB AX,CX
SUB SI,AX ;关键词回到词首
MOV AX,2 ;建议采用mov ax,字符个数-1
SUB AX,CX
SUB DI,AX
POP CX
LOOP COMPARE
NO: LEA DX,STRING4
MOV AH,09H
INT 21H
JMP EXIT
MATCH: POP CX
MOV BX,DI
LEA DX,STRING3
MOV AH,09H
INT 21H
SUB BX,OFFSET sentence+2
SUB BX,2 ;首地址所在字符串中的地址
CALL CHANGE
LEA DX,STRING5
MOV AH,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 AL,BL
AND AL,0FH
ADD AL,30H
CMP AL,3AH
JL PRINTIT
ADD AL,7H
PRINTIT:
MOV DL,AL
MOV AH,2
INT 21H
DEC CH
JNZ ROTATE
POP DX
POP CX
POP BX
POP AX
RET
CHANGE ENDP
CODE ENDS
END START

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。