汇编实践作业,字符串匹配
《微机与单片机系统及应用》实践报告
Created on Wed. Jun 17 00:36:12 2020
@author: 姜志成
学号:2018633007
专业:电子与计算机工程
实验说明与内容
字符串的处理是汇编语言程序设计中一个重要部分。字符串操作一般包括数据块移动、串排序、串搜索、串比较、串复制、串插入、串删除、串交换以及大小写字母转换等内容。编写字符串操作程序时经常会用到80x86串操作指令。
**模拟密码输入:假设数据库中有密码 5201314 ,用户输入一个字符串,显示的时候全都以 * 出现,然后判断用户输入的字符串是否与数据库中密码相同,若相同,输出 “ PasswordRight!” ,否则输出 “ Password Error!” **
程序完成的功能及流程图
- 完成老师布置的基本功能,即检查密码是否正确,输入密码时显示
*
- 可以检查用户名是否输入正确
- 如果觉得输入的时候错误了,可以在输入的时候用backspace进行删除。因为正常输入密码的时候backspace也会读入进去,所以要进行特判
流程图
程序清单:
DATA SEGMENT
MSG1 DB 'USERNAME:',0DH,0AH,'$' ; 指定用户名存放的数据区
MSG2 DB 0DH,0AH,'PASSWORD:',0DH,0AH,'$' ; 指定密码的数据区
MSG3 DB 0DH,0AH,0DH,0AH,'Password Right!',0DH,0AH,'$' ; 密码正确提示
MSG4 DB 0DH,0AH,0DH,0AH,'USERNAME Error!',0DH,0AH,'$'; ;用户名报错
MSG5 DB 0DH,0AH,0DH,0AH,'Password Error!',0DH,0AH,'$'; ;密码报错
BUF1 DB '2018633007'
USERLEN EQU $-BUF1 ; 统计用户名长度
BUF2 DB '5201314'
PWLEN EQU $-BUF2 ; 统计密码长度
BUF3 DB 15 ; 用户输入用户名的数据区
DB ?
DB 15 DUP(?)
BUF4 DB 15 DUP(?) ; 用户输入密码的数据区
DATA ENDS
STACKS SEGMENT STACK
DW 128 DUP(?)
STACKS ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AH,9
MOV DX,OFFSET MSG1 ; 显示用户名输入界面
INT 21H
MOV AH,0AH
MOV DX,OFFSET BUF3 ; 键入用户名字符串
INT 21H
MOV BX,OFFSET BUF1 ; 获得储存正确账户名的偏移地址
MOV SI,OFFSET BUF3+2 ; 获得储存输入账户名的偏移地址
MOV CX,USERLEN
CMPUSER:
; 进行用户名对比
MOV AL,[BX]
CMP [SI],AL ; 将输入字符串的对应位置与正确账户名进行比较
JNZ ERROR1 ; 当前位置和原本的用户名不一样就报错
INC SI
INC BX
LOOP CMPUSER ; 重复进行直到字符串结束
MOV AH,9
MOV DX,OFFSET MSG2 ;显示密码输入界面
INT 21H
MOV CX,PWLEN ; 读入正确的密码长度
MOV SI,OFFSET BUF4 ; 获得储存输入密码的偏移地址
GETPW:
MOV AH,7 ; 逐个字符输入密码,遇到回车结束输入
INT 21H
CMP AL,0DH
JZ NEXT
CMP AL,08H
JE DELETE ; 觉得输入错误,利用backspace键删除
MOV [SI],AL
MOV AH,2 ; 在屏幕上显示*
MOV DX,'*'
INT 21H
INC SI
INC BX ; 统计输入密码的长度
LOOP GETPW
DELETE:
; 想利用backspace键进行删除
CMP BX, 00H ; 如果删除到第0个位置,再删除就直接退出
JZ EXIT
DEC BX
CALL DELCODE
MOV AH,2 ; 调用2号中断,显示空格,消除星号
MOV DL,' '
INT 21H
MOV BYTE PTR [SI],00H
DEC SI
CALL DELCODE
JMP GETPW
NEXT:
MOV CX,PWLEN
MOV BX,OFFSET BUF2
MOV SI,OFFSET BUF4
CMPPW:
; 把输入的密码和正确的密码进行对比
MOV AL,[BX]
CMP [SI],AL
JNZ ERROR2
INC SI
INC BX
LOOP CMPPW ;逐个字符比较BUF2和BUF4
MOV AH,9
MOV DX,OFFSET MSG3
INT 21H
JMP EXIT
DELCODE PROC
; 删除一个字符,即把光标向左移动一格
MOV AH,3 ; 获取光标位置
INT 10H
MOV AH,2 ;2号中断:置光标位置
SUB DL,1 ;列数减1,实现光标左移
INT 10H
RET
DELCODE ENDP
ERROR1:
; 用户名错误时报错
MOV DX,OFFSET MSG4
CALL DISPMSG
ERROR2:
; 密码错误时报错
MOV DX,OFFSET MSG5
CALL DISPMSG
DISPMSG PROC
;定义一个过程,用于输出字符串
MOV AH,9 ;调用9号子功能
INT 21H ;返回DOS
JMP EXIT
DISPMSG ENDP
EXIT:
MOV AH,4CH
INT 21H
CODE ENDS
END START
实验小结:
- 本实验要熟练掌握dos系统I/O功能调用
01H:键盘输入并回显单字符
02H:单字符显示输出
07H:键盘输入无回显
09H:显示字符串
0AH:字符串输入到缓冲区,等待读入一串字符
虽然功能号01H与07H都是等待输入一个字符,但是他们的区别是07H没有回显,因此本实验等待键入密码应调用功能号07H。
- 在检查输入的用户名和密码是否正确时,采取的是逐个字符比较,若相同则继续比较后一个字符,不同则停止循环并报错。
- 由于输入密码时,每输入一个字符,屏幕上应显示一个
*
,因此不宜以字符串形式输入密码,应逐个输入。 - 每输入一个字符,将其ASCII码和08H进行比较,若相等则捕获当前光标的位置,然后删除这个不想要的字符
- 每输入一个字符,将其ASCII码与0DH进行比较,目的是以回车键进行结束输入
- 在调用子程序的时候可以通过寄存器DX,BX等来传输参数,并且有些时候可以通过段寄存器来过渡存储数据
有什么问题可以加qq:1281372141进行交流