Implementación del programa de verificación de inicio de sesión de usuario

Compile el segundo experimento:
consulte las dos soluciones del Ejemplo 4.23 en la página P186 del libro para realizar la comparación de nombres de usuario;
consulte la lista de programas del Ejemplo 4.3 en la página P157 del libro para realizar la salida de cadenas de colores;
Nota : Si se usa la solución del Ejemplo 4.23 La sección adicional está configurada, al intentar generar cadenas de color, ES:BP debe apuntar a la primera dirección de la cadena que se mostrará antes de llamar a la función 13H del BIOS. (Tenga en cuenta la ubicación de la definición de cadena, que se puede encontrar correctamente en la sección adicional 13H. Si está en la sección de código, se deben agregar dos instrucciones antes de MOV AX, 1301H: MOV AX, DATA y MOV ES, AX. Para asegurar la ejecución de INT 10H Cuando AH=13H y 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


Si BIENVENIDO se muestra con 09H (es decir, se muestra en blanco y negro), recuerde agregarle $ para indicar el final de la cadena.

.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


Ejecución de resultados: (envié estas fotos, así que no seas el mismo)

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

envié estas fotos

Documento de referencia: https://wonzwang.blog.csdn.net/article/details/80863047

Supongo que te gusta

Origin blog.csdn.net/m0_51928767/article/details/120919932
Recomendado
Clasificación