字符串匹配
编写程序,实现两个字符串比较,如相同,由显示“MARCH”,否则,显示“NOMATCH”。
两个字符串完全匹配
CRLF MACRO
MOV DL,0DH
MOV Ah,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
ENDM ;定义宏功能用于换行
STRSHOW MACRO buff;buff表示要显示字符串标号
mov dx,offset buff
mov ah,09H
int 21H
ENDM;定义宏功能用于显示字符串
STRIN MACRO OFF;OFF表示接收域标号
mov dx,offset OFF
mov ah,0AH
int 21H
ENDM;定义宏功能用于接收输出字符串
data segment;定义数据段部分
;定义提示信息的字符串
MESS1 db 'input string1:',0DH,0AH,'$'
MESS2 db 'input string2:',0DH,0AH,'$'
MESS3 db 'MATCH.',0DH,0AH,'$'
MESS4 db 'NO MATCH.',0DH,0AH,'$'
MAXLEN1 db 5;定义string1相关信息
ACTLEN1 db ?
string1 db 4 dup(?),'$'
MAXLEN2 db 5;定义string2相关信息
ACTLEN2 db ?
string2 db 4 dup(?),'$'
data ends
;定义栈段
stack segment stack 'stack'
STA db 128 DUP(?)
TOP EQU LENGTH STA
stack ends
code segment
ASSUME cs:code,ds:data,es:data,ss:stack
START: ;初始化相关寄存器
mov ax,data
mov ds,ax
mov es,ax
mov ax,stack
mov ss,ax
mov sp,TOP
;调用STRSHOW宏显示提示信息MESS1
STRSHOW MESS1
;调用STRIN宏接收string1
STRIN MAXLEN1
CRLF;调用CRLF输出换行符
;调用STRSHOW宏显示提示信息MESS2
STRSHOW MESS2
;调用STRIN宏接收string2
STRIN MAXLEN2
CRLF;调用CRLF输出换行符
LEA bx,ACTLEN1
mov ah,[bx] ;ah中存放string1的实际长度
LEA bx,ACTLEN2
mov al,[bx] ;al中存放string2的实际长度
sub ah,al;检查两个字符串长度是否一致
jnz nomatch
LEA SI,string1;取出字符串偏移量
LEA DI,string2
CLD; DF=0,向高地址增加
CBW
mov cx,ax ;记录比较次数
REPZ CMPSB
jnz nomatch
match:;若匹配则输出提示信息MESS3
STRSHOW MESS3
jmp done
nomatch:;若不匹配则输出提示信息MESS4
STRSHOW MESS4
jmp done
done:;
mov ax,4C00H
int 21H
code ends
END START
运行结果:
两个字符串有交集
CRLF MACRO
MOV DL,0DH
MOV Ah,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
ENDM ;定义宏功能用于换行
STRSHOW MACRO buff;buff表示要显示字符串标号
mov dx,offset buff
mov ah,09H
int 21H
ENDM;定义宏功能用于显示字符串
STRIN MACRO OFF;OFF表示接收域标号
mov dx,offset OFF
mov ah,0AH
int 21H
ENDM;定义宏功能用于接收输出字符串
data segment;定义数据段部分
;定义提示信息的字符串
MESS1 db 'input string1:',0DH,0AH,'$'
MESS2 db 'input string2:',0DH,0AH,'$'
MESS3 db 'MATCH.',0DH,0AH,'$'
MESS4 db 'NO MATCH.',0DH,0AH,'$'
MAXLEN1 db 5;定义string1相关信息
ACTLEN1 db ?
string1 db 4 dup(?),'$'
MAXLEN2 db 5;定义string2相关信息
ACTLEN2 db ?
string2 db 4 dup(?),'$'
data ends
;定义栈段
stack segment stack 'stack'
STA db 128 DUP(?)
TOP EQU LENGTH STA
stack ends
code segment
ASSUME cs:code,ds:data,es:data,ss:stack
START: ;初始化相关寄存器
mov ax,data
mov ds,ax
mov es,ax
mov ax,stack
mov ss,ax
mov sp,TOP
;调用STRSHOW宏显示提示信息MESS1
STRSHOW MESS1
;调用STRIN宏接收string1
STRIN MAXLEN1
CRLF;调用CRLF输出换行符
;调用STRSHOW宏显示提示信息MESS2
STRSHOW MESS2
;调用STRIN宏接收string2
STRIN MAXLEN2
CRLF;调用CRLF输出换行符
CLD; DF=0,向高地址增加
lea si,string1;si中保存string1中当前比较字符偏移量
mov cl,[si-1];cl中保存string1的实际长度
mov ch,0
L1:
push cx;保存外层循环的次数
lea di,string2;di中保存string2偏移量
mov cl,[di-1];cl中保存string2的实际长度
mov ch,0
mov al,[si]
REPNZ SCASB;进行串扫描操作
JZ match
pop cx
INC si
LOOP L1
nomatch:;若不匹配则输出提示信息MESS4
STRSHOW MESS4
jmp done
match:;若匹配则输出提示信息MESS3
STRSHOW MESS3
jmp done
done:;结束程序
mov ax,4C00H
int 21H
code ends
END START
运行结果: