实验内容:
编写程序,比较两个字符串STRING1和STRING2所含的字符是否相同,若字符串相同则显示“Match!”,否则显示“No match!”。
程序流程图:
实现代码:
DATA SEGMENT ;数据段定义
STRING1 DB 'HAPPY ASM'
LEN1 EQU $-STRING1 ;$符号表示当前地址,该语句定义了字符串的长度
STRING2 DB 'HAPPY AS'
LEN2 EQU $-STRING2
MSG1 DB 'Match!',0DH,0AH,'$' ;取得干净的输出,其中0DH、0AH、'$'分别表示
MSG2 DB 'No match!',0DH,0AH,'$' ;光标回车、光标换行、结束
DATA ENDS ;数据段定义结束
CODE SEGMENT ;代码段定义
ASSUME CS:CODE,DS:DATA,ES:DATA ;段分配语句
START:
MOV AX,DATA
MOV DS,AX ;数据段地址经AX传送给DS,ES
MOV ES,AX
LEA SI,STRING1 ;设置源字符串数据指针
LEA DI,STRING2 ;设置目的字符串数据指针
MOV CX,LEN1 ;CX保存需要比较的字符个数,即源字符出串长度
LENCMP: ;进入COMPARE循环体之前先判断字符串的长度是否相同,避免字符串对比出错
MOV DX,[LEN2]
CMP CX,DX ;先判断两字符串的长度是否相等
JNE DISMATCH ;长度不相等则跳转至DISMATCH
COMPARE: ;通过循环体对字符串逐个字节进行比较
MOV AL,[SI] ;读取源字符串的一个字符到AL
MOV BL,[DI] ;读取目的字符串的一个字符到BL
CMP AL,BL ;对比AL和BL的数据
JNE DISMATCH ;如果AL和BL的数据不相等,则退出循环跳转至DISMATCH
INC SI ;指针加1,修改指针指向下一个字符
INC DI
DEC CX ;CX寄存器减1,修改比较次数
JNZ COMPARE ;如果CX寄存器中的数据不为0,则在COMPARE中继续进行字符的比较
;CX中寄存器的数据为0后,表明比较完毕,字符串完全相同,执行MATCH
MATCH:LEA DX,MSG1 ;显示"Match!"
JMP DISP
DISMATCH:LEA DX,MSG2 ;显示"No match!"
DISP:MOV AH,09H ;显示字符串的DOS调用
INT 21H
MOV AH,4CH ;退出当前程序,返回DOS
INT 21H
CODE ENDS ;代码段结束
END START ;全部结束
相关知识:
常用DOS 功能调用的INT 21H功能中的1号、2号、9号、10号及返回DOS的语句:
1号DOS功能调用:单个字符输入,输入内容的ASCII码值保存到AL寄存器。例如输入“3”,则AL寄存器的值变为33H,字符“3”的ASCII码。
MOV AH,01H
INT 21H
2号DOS功能调用:单个字符输出,输出DL寄存器对应的字符。例如要输出字符“3”,则需要把字符“33H”的ASCII码33H放到DL寄存器,再调用2号DOS功能调用。
MOV DL, 33H
MOV AH, 02H
INT 21H
9号DOS功能调用:字符串输出,从DX指向的空间读取内存并输出到屏幕上,直到遇到“$”停止。
9号DOS功能调用包括两部分内容:数据段中定义的字符串,9号DOS功能调用。
;字符串定义:
BUF DB 'Hello World!', 0AH, 0DH, '$'
;9号DOS功能调用:
MOV DX, OFFSET BUF
MOV AH, 09H
INT 21H
10号DOS功能调用:字符串输入,从键盘输入一个字符串,并保存字符ASCII码到DX所指向的缓冲区。
10号DOS功能调用包括两部分内容:数据段中定义的缓冲区,10号DOS功能调用。
;缓冲区定义:
BUF DB 255 ;缓冲区长度
DB ? ;输入字符串长度
DB 255 DUP(?) ;实际输入内容
;10号DOS功能调用:
MOV DX, OFFSET BUF
MOV AH, 0AH
INT 21H
4CH的DOS功能调用:退出程序,返回DOS。
MOV AH, 4CH
INT 21H