汇编Lab2:用户登陆验证程序
# 南邮汇编实验一:1.2 用户登陆验证程序的设计
实验名称 用户登陆验证程序的设计 实验人员 季嘉澎 指导老师 闵丽娟 指导单位 南京邮电大学物联网学院 实验性质 设计 实验时间 2020-10-16 09:35 实验课时 2 课程名称 微型计算机与接口技术【B1801522S】
# 实验要求
- 运行程序后,界面首先出现自己的学号,例如“B18060701”;
- 在学号下方输入登录密码,密码长度不超过30个字符。密码内容不能显示在屏幕上,要求用字符*替代;
- 验证输入密码与事先设定的密码是否相同,如果密码正确,给出提示“OK”,程序结束;如果密码不正确,重新输出学号,继续输入密码;
- 选作内容:如果连续5次密码输入都不正确,界面提示“LOCKED”,退出程序;
# 实验提示
- 为了实现在学号下方输入登录密码,输出学号时后面要跟着回车换行符
- 密码输入不能用DOS的0A号功能调用,虽然该功能允许键盘输入字符串,但是会明码显示在界面上,可以使用DOS的8号功能调用
- 程序包括数据段和代码段。其中数据段至少需要定义4个字符串,一个是自己的学号,一个是事先设定的密码,一个是键盘输入的密码,一个是“OK”。(实现选作功能时,可以再增加2个变量)
- 记录键盘输入的密码串时,需要用到循环操作。密码输入如果不满30就结束,可以自行设定结束标记
- 判断输入密码串与事先设定的密码串是否相等,请使用LOOP实现循环判断。虽然使用大家上课没有学过的串操作指令也可以实现两个字符串的比较,但是不利于大家对课堂已学内容的掌握和巩固,所以请不用使用串操作指令。
# 实验环境
- 实验环境:(DOSbox v0.74)
- 编程语言:工作于80x86微处理器的Intel风格汇编语言
- 实验工具:MASM32 SDK v5.0 (opens new window)
# 程序设计
使用
%
作为密码输入结束标志程序流程图如下
# 实验代码
;FILENAME EXA2.ASM
DATA SEGMENT
USERNAME DB 'B17100126',0AH,0DH,'$'
MSGPASSWD DB 'INPUT PASSWORD: $'
MSGLOCKED DB 'ERROR MORE THAN 5,LOCKED',0AH,0DH,'$'
MSCHECKOK DB 0AH,0DH,'OK',0AH,0DH,'$'
PWDERR1 DB 0AH,0DH,'PASSWORD ERROR',0AH,0DH,'$'
PWDERR2 DB 0AH,0DH,'PASSWORD TOO LONG',0AH,0DH,'$'
PASSWORD DB '123456789'
PWLENGTH EQU $-PASSWORD
INPUTLEN DB 30
LOCKTIME DB 5
BUF DB 30 DUP(?)
DATA ENDS ; 结束数据段
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
BEG:
MOV AX,DATA
MOV DS,AX
MOV DI,0
MOV CX,0
MOV SI,0
DSPMSGUNAME:
MOV AH,09H
MOV DX,OFFSET USERNAME ; 输出用户名
INT 21H
INPUTPWD: ; 输入密码前的准备
MOV BX,OFFSET BUF
MOV CL,0
MOV AH,09H
MOV DX,OFFSET MSGPASSWD ; 打印输入密码的提示信息
INT 21H
INPUTKEY: ; 开始接受字符
MOV AH,08H
INT 21H
CMP AL,'%' ; ’%‘是结束标志
JE CHECKLEN ; 如果结束先检查密码,再逐个字符循环检查字符
MOV [BX],AL ; 如果输入的不是结束标志,则存储到buffer
MOV AH,02H
MOV DL,'*' ; 打印出密文符号 '*'
INT 21H
INC BX ; buffer后移一位
INC CL ; 接受的密码位数+1
JMP INPUTKEY
CHECKLEN:
CMP CL,PWLENGTH
JNE CHECKPWDERR
CMP CL,30
JG CHECKPWDLEN
MOV DI,OFFSET PASSWORD ; 输入密码和原密码都使用寄存器间接寻址,方便buffer和密码比较
MOV BX,OFFSET BUF
CHECKPWD:
MOV AL,[DI] ; 注意双操作数不能同时是主存数(间接寻址)
;CMP Byte PTR DS:[BX],Byte PTR DS:[DI]
CMP [BX],AL
JNE CHECKPWDERR
INC BX ; buffer 后移
INC DI ; password 后移
LOOP CHECKPWD
CHECKOK: ; 输出 'OK' 信息
MOV AH,09H
MOV DX,OFFSET MSCHECKOK
INT 21H
JMP EXIT
CHECKPWDERR: ; 输出密码错误信息
MOV AH,09H
MOV DX,OFFSET PWDERR1
INT 21H
INC SI
CMP SI,5
JGE CHECKLOCK
JMP INPUTPWD
CHECKPWDLEN:
MOV AH,09H
MOV DX,OFFSET PWDERR2
INT 21H
INC SI
CMP SI,5
JGE CHECKLOCK
JMP INPUTPWD
CHECKLOCK: ; 输出'LOCKED' 信息
MOV AH,09H
MOV DX,OFFSET MSGLOCKED
INT 21H
EXIT: ; 返回 DOS 功能调用
MOV AH,4CH
INT 21H
CODE ENDS ; 结束代码段
END BEG
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# 实验结果
# 实验反思
通过本次实验应用了上课所学习的汇编语言的DOS功能调用和程序设计的分支循环结构,实现了具有简单密码登录验证的程序,同时在设计的过程中真正自己思考寄存器的选择和寻址方式的选用,以及操作数使用的约定。
上次更新: 2020/11/09, 15:11:00