Implementation of user login verification program

Compile the second experiment:
refer to the two solutions of Example 4.23 on page P186 of the book to realize the comparison of user names;
refer to the program list of Example 4.3 on page P157 of the book to realize the output of colored strings;
Note: If the solution of Example 4.23 is used The additional section is set, when trying to output color strings, ES:BP needs to point to the first address of the string to be displayed before calling the 13H function of BIOS. (Please consider the location of the string definition, which can be successfully found in the additional section 13H. If it is in the code section, two instructions must be added before MOV AX, 1301H: MOV AX, DATA and MOV ES, AX. In order to ensure the execution of INT 10H When AH=13H and 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


If WELCOME is displayed with 09H (that is, displayed in black and white), please remember to add $ to him to indicate the end of the string.

.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


Running results: (I submitted these pictures, so, don’t be the same)

insert image description here

insert image description here

I submitted these pictures

Reference document: https://wonzwang.blog.csdn.net/article/details/80863047

Guess you like

Origin blog.csdn.net/m0_51928767/article/details/120919932