一、实验目的
1.熟悉汇编语言编程环境和DEBUG调试程序的使用。
2.掌握键盘输入字符串的方法和分支程序的设计。
二、实验内容
编程实现:从键盘分别输入两个字符串,然后进行比较,若两个字符串的长度和对应字符都完全相同,则显示“MATCH”,否则显示“NO MATCH”。
三、实验程序(必须加注释)和结果
程序代码:
; 定义一个名为crlf的宏,用于输出回车(0DH)和换行(0AH)
crlf macro
; 功能:输出回车符
mov ah,2
mov dl,0dh
int 21h
; 功能:输出换行符
mov ah,2
mov dl,0ah
int 21h
endm
; 定义数据段
DATAS SEGMENT
; 定义一个字符串常量,表示匹配成功的消息
MESS1 DB 'MATCH',0DH,0AH,'$'
; 定义一个字符串常量,表示匹配失败的消息
MESS2 DB 'NO MATCH',0DH,0AH,'$'
; 定义一个字符串常量,用于提示输入第一个字符串
MESS3 DB 'INPUT STRING1:',0DH,0AH,'$'
; 定义一个字符串常量,用于提示输入第二个字符串
MESS4 DB 'INPUT STRING2:',0DH,0AH,'$'
; 定义一个包含个人信息的字符串常量
MESS5 DB 'GUOZHIHONG Kruanjian221 2022900624',0DH,0AH,'$'
; 定义一个字符串常量,用于提示按任意键继续或按ESC键退出
MESS6 DB 'Press any key to continue or press ESC exit',0DH,0AH,'$'
; 定义一个缓冲区用于存储输入的第一个字符串,最多21个字符
STR1 DB 21,?,21 DUP(0)
; 定义一个缓冲区用于存储输入的第二个字符串,最多21个字符
STR2 DB 21,?,21 DUP(0)
; 此处可添加更多数据段相关代码,如果有的话
DATAS ENDS
; 定义代码段
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,es:datas
START:
again: ; 循环开始的标签,用于实现多次执行字符串比较操作
MOV AX,DATAS
MOV DS,AX
; 输出包含个人信息的字符串
mov ah,9
mov dx,offset mess5
int 21h
; 输出提示输入第一个字符串的消息
mov ah,9
mov dx,offset mess3
int 21h
; 输入第一个字符串到STR1缓冲区
mov ah,0ah
mov dx,offset str1
int 21h
crlf ; 调用crlf宏,输出回车换行
; 输出提示输入第二个字符串的消息
mov ah,9
mov dx,offset mess4
int 21h
; 输入第二个字符串到STR2缓冲区
mov ah,0ah
mov dx,offset str2
int 21h
crlf ; 调用crlf宏,输出回车换行
; 比较两个输入字符串的长度(第一个字符为实际长度)
mov cl,str1 + 1
cmp cl,str2 + 1
jnz noequ ; 如果长度不相等,跳转到noequ标签
mov ch,0
mov si,offset str1+2
mov di,offset str2 + 2
next:
mov al,[si]
cmp al,[di]
jnz noequ ; 如果对应字符不相等,跳转到noequ标签
inc si
inc di
loop next
; 如果字符串完全匹配,输出匹配成功的消息
mov ah,9
mov dx,offset mess1
int 21h
jmp post_judgment
noequ:
; 如果字符串不匹配,输出不匹配的消息
mov ah,9
mov dx,offset mess2
int 21h
jmp post_judgment
post_judgment:
; 输出按任意键继续或按ESC键退出的提示消息
mov ah,9
mov dx,offset mess6
int 21h
mov ah, 0
int 16h ; 读取键盘输入
cmp al, 1BH ; 比较输入是否为ESC键(ASCII码为1BH)
je exit ; 如果是ESC键,跳转到exit标签退出程序
jmp again ; 如果不是ESC键,跳转到again标签开始下一轮循环
exit:
MOV AH,4CH
INT 21H
CODES ENDS
END START