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