汇编实验2 字符串匹配

字符串匹配

编写程序,实现两个字符串比较,如相同,由显示“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

运行结果:
在这里插入图片描述
在这里插入图片描述

程序接收用户键入的一个关键字以及一个句子。如果句子中不包含关键字则显示’no match’;如果句子中包含关键字则显示‘match’,且把该字在句子中的位置用十六进制数显示出来,要求程序的执行过程如下: enter keyword :abc enter sentence :we are studying abc match at location :11H of the sentence enter sentence: xyz ,ok? no match enter sentence :^c 四. 方法说明: 程序可由三部分组成: (1 ) 输入关键字和一个句子,分别存入相应的缓冲区中,可用功能调用0AH。 (2) 在句子中查找关键字。 1. 关键字和一个句子中相应字段的比较可使用串比较指令,为此必须定义附加段,但附加段和数据段可以定义为同一段,以便于串指令的使用,这样,相应的寄存器内容也有了确定的含义,如下: SI 寄存器为关键字的指针 DI 寄存器为句子中正相比较的字段的指针 CX寄存器存放关键字的字母个数(长度) 2. 整个句子和关键字的比较过程可以用一个循环结构来完成。循环次数为: (句子长度--关键字长度)+1在计算循环次数时,如遇到句子长度小于关键字长度的情况则应转向显示“no match”,循环中还需要用到BX寄存器,它用来保存句子中当前正在比较字段的首地址。 (3) 输出信息: 用功能调用09h分“找到”或“找不到”两种情况分别显示不同的信息。在“找到”时,还要求显示匹配字符串在句子中的位置,在“找到”时BX寄存器的内容为匹配字符串的首地址,将此值减到句子的首地址,再将差值加1 即是所要的匹配字符串在句子中的位置,可将位置转换为十六进制数从屏幕上显示出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Andy-wen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值