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)
Documento de referencia: https://wonzwang.blog.csdn.net/article/details/80863047