当前位置:网站首页>用户登录验证程序的实现
用户登录验证程序的实现
2022-08-03 05:21:00 【物腐虫生】
汇编第二次实验:
参考书P186页的例4.23的两个解法来实现用户名的比较;
参考书P157页例4.3的程序清单来实现彩色字符串的输出;
注:若采用例4.23的解法一设置了附加段,在尝试输出彩色字符串时,需在调用BIOS的13H功能前将ES:BP指向待显示字符串首地址。(请考虑字符串定义位置,在附加段13H能成功寻找,若在代码段,需在在MOV AX,1301H之前加上两条指令:MOV AX, DATA和 MOV ES, AX。从而保证执行INT 10H时AH=13H以及AL=01H。)
.586
DATA SEGMENT USE16
MESG1 DB 'Please enter your username:$'
MESG2 DB 'Please enter your password:$'
BUF DB 30
DB ?
DB 30 DUP(?) ;输入字符串缓冲区
WRONG DB 'Wrong Username!',0DH, 0AH,'$'
WRONG2 DB 'Wrong Password!',0DH, 0AH,'$'
RIGHT DB '----------WELCOME----------'
LL EQU $-RIGHT
CHOICE DB 3
USER DB '030915' ;用户名
COUNT EQU $-USER ;统计串长度
CIPHER DB 'as12' ;密码
COUNT2 EQU $-CIPHER
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA,ES:DATA
BEG:
MOV AX,DATA ;DS<-DATA
MOV DS,AX
MOV ES,AX ;ES<-DATA
MOV AX,0003H ;80列*25行彩色文本方式
INT 10H
AGA: ;循环确认用户名是否正确
MOV AH,9
MOV DX,OFFSET MESG1 ;显示黑白字符串
INT 21H
MOV CX,COUNT
MOV AH,0AH ;从键盘键入用户名
MOV DX,OFFSET BUF
INT 21H
MOV CL,BUF+1 ;输入用户名长度->CX
MOV CH,0
CMP CX,COUNT ;比较长度是否相等
JNZ AGA2
MOV SI,OFFSET BUF+2 ;原串首址->SI
MOV DI,OFFSET USER ;目标串首址->DI
CLD ;D标志为0,增址型
LOAD:
REPE CMPSB ;两字符串比较
JNZ AGA2 ;不相等,提示
MOV AH,2
MOV DL,0AH ;换行
INT 21H
MOV CHOICE,3 ;尝试次数重新置3
JMP CHECK
AGA2:
MOV AH,2
MOV DL,0AH ;换行
INT 21H
MOV AH,09H
MOV DX,OFFSET WRONG
INT 21H
DEC CHOICE ;尝试次数减一
JZ EXIT
JMP AGA ;再输入一次用户名
CHECK:
MOV AH,09H
MOV DX,OFFSET MESG2
INT 21H
MOV CX,COUNT2
MOV BX,OFFSET BUF
AGA3: ;判断密码是否错误
MOV AH,08H ;O8H,不回显字符,响应Ctrl+C
INT 21H ;光标下移一行
MOV [BX],AL ;按键的ASCII码传给BX
INC BX ;BX后移一位,一共移COUNT2次
LOOP AGA3
MOV DI,OFFSET BUF
MOV SI,OFFSET CIPHER
CLD
MOV CX,COUNT2
REPE CMPSB ;字符串比较
JZ LAST ;一致则跳转
MOV AH,2
MOV DL,0AH
INT 21H
MOV AH,09H
MOV DX,OFFSET WRONG2
INT 21H
DEC CHOICE ;尝试次数减一
JZ EXIT
JMP CHECK
LAST:
MOV AX,1301H ;显示彩色字符串
MOV BH,0
MOV BL,01001111B
MOV CX,LL
MOV DH,12
MOV DL,(80-LL)/2
MOV BP,OFFSET RIGHT
INT 10H
EXIT:
MOV AH,4CH
INT 21H ;返回 DOS
CODE ENDS
END BEG
如果WELCOME是用09H显示的(即黑白显示),请记得给他加上$来表示字符串的结束。
.586
DATA SEGMENT USE16
MESG1 DB 'Please enter your username:$'
MESG2 DB 'Please enter your password:$'
BUF DB 30
DB ?
DB 30 DUP(?) ;输入字符串缓冲区
WRONG DB 'Wrong Username!',0DH, 0AH,'$'
WRONG2 DB 'Wrong Password!',0DH, 0AH,'$'
RIGHT DB '----------WELCOME----------'
LL EQU $-RIGHT
CHOICE DB 3
USER DB '030915' ;用户名
COUNT EQU $-USER ;统计串长度
CIPHER DB 'as12' ;密码
COUNT2 EQU $-CIPHER
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA,ES:DATA
BEG:
MOV AX,DATA ;DS<-DATA
MOV DS,AX
MOV ES,AX ;ES<-DATA
MOV AX,0003H ;80列*25行彩色文本方式
INT 10H
AGA: ;循环确认用户名是否正确
MOV AH,9
MOV DX,OFFSET MESG1 ;显示黑白字符串
INT 21H
MOV CX,COUNT
MOV AH,0AH ;从键盘键入用户名
MOV DX,OFFSET BUF
INT 21H
MOV CL,BUF+1 ;输入用户名长度->CX
MOV CH,0
CMP CX,COUNT ;比较长度是否相等
JNZ AGA2
MOV SI,OFFSET BUF+2 ;原串首址->SI
MOV DI,OFFSET USER ;目标串首址->DI
CLD ;D标志为0,增址型
LOAD:
REPE CMPSB ;两字符串比较
JNZ AGA2 ;不相等,提示
MOV AH,2
MOV DL,0AH ;换行
INT 21H
MOV CHOICE,3 ;尝试次数重新置3
JMP CHECK
AGA2:
MOV AH,2
MOV DL,0AH ;换行
INT 21H
MOV AH,09H
MOV DX,OFFSET WRONG
INT 21H
DEC CHOICE ;尝试次数减一
JZ EXIT
JMP AGA ;再输入一次用户名
CHECK:
MOV AH,09H
MOV DX,OFFSET MESG2
INT 21H
MOV CX,COUNT2
MOV BX,OFFSET BUF
AGA3: ;判断密码是否错误
MOV AH,08H ;O8H,不回显字符,响应Ctrl+C
INT 21H ;光标下移一行
MOV [BX],AL ;按键的ASCII码传给BX
INC BX ;BX后移一位,一共移COUNT2次
LOOP AGA3
MOV DI,OFFSET BUF
MOV SI,OFFSET CIPHER
CLD
MOV CX,COUNT2
REPE CMPSB ;字符串比较
JZ LAST ;一致则跳转
MOV AH,2
MOV DL,0AH
INT 21H
MOV AH,09H
MOV DX,OFFSET WRONG2
INT 21H
DEC CHOICE ;尝试次数减一
JZ EXIT
JMP CHECK
LAST:
MOV AX,1301H ;显示彩色字符串
MOV BH,0
MOV BL,01001111B
MOV CX,LL
MOV DH,12
MOV DL,(80-LL)/2
MOV BP,OFFSET RIGHT
INT 10H
EXIT:
MOV AH,4CH
INT 21H ;返回 DOS
CODE ENDS
END BEG
运行结果:(我交的就是这些图,so,不要一样)



参考文档:https://wonzwang.blog.csdn.net/article/details/80863047
边栏推荐
猜你喜欢
随机推荐
Makefile 遍历子目录模板
初识C语言
-整数求和-
EIP-5058 能否防止NFT项目方提桶跑路?
7.24[C语言零基础 知识点总结]
速来围观,17个运维实用技巧
3588. 排列与二进制
pta a.1003 的收获
7.21[日常]
【frp内网穿透】
The ` monorepo ` ` hoist ` mechanism lead to the change of the loading configuration file path
MySQL 索引详解和什么时候创建索引什么时候不适用索引
【myPow,2次幂,3次幂..代码实现】
【解读合约审计】Harmony的跨链桥是如何被盗一亿美金的?
浏览器多线程离屏渲染压缩打包方案
玩转Markdown(2) —— 抽象语法树的提取与操纵
用C语言来实现扫雷小游戏
pta a.1030的dijkstra+DFS方法
arm64麒麟安装paddlehub(国产化)注意事项
Pr第二次培训笔记








