.486
DATA SEGMENT USE16
BUF1 DB 255 ;用于存取键入的用户名
DB ?
DB 255 DUP(?)
BUF2 DB 255 ;用于存取键入的密码
DB ?
DB 255 DUP(?)
USER DB 'Jacob' ;用户名内置校验值 ;4A 61 63 6F 62
LEN1 = $-USER ;内置用户名长度
PASSWD DB 'Zeng' ;密码内置校验值 ;FF 04 5A 65 6E 67
LEN2 = $-PASSWD ;内置用户名长度
UNAME DB 'Username:',24H ;显示字符串'Username:'
PWORD DB 'Password:',24H ;显示字符串'Password:'
FAIL DB 'Login Failed',24H
SUCC DB 'Login Successed'
LL = $-SUCC
CRLF MACRO ;换行宏指令
MOV AH,0EH
MOV AL,0DH
INT 10H
MOV AL,0AH
INT 10H
ENDM
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA,ES:DATA ;注意将附加段重叠到数据段
BEG:MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AH,9 ;显示字符串'Username:'
MOV DX,OFFSET UNAME
INT 21H
MOV AH,0AH ;键入用户名到缓冲区BUF1
MOV DX,OFFSET BUF1
INT 21H
MOV BL,BUF1+1
MOV BH,0
MOV SI,OFFSET BUF1+2
MOV BYTE PTR[BX+SI],'$'
CRLF ;换行
MOV AH,9 ;显示字符串'Password:'
MOV DX,OFFSET PWORD
INT 21H
MOV BX,OFFSET BUF2
MOV SI,0
PASSWORD:MOV AH,07H ;键入密码到缓冲区BUF2
INT 21H
CMP AL,0DH
JZ VERIFIY
MOV [BX+SI+2],AL
INC SI
JMP PASSWORD
VERIFIY:
MOV AX,SI ;处理上述不回显循环时的遗留数据
MOV BYTE PTR[BX+1],AL
MOV BH,0
MOV BL,BUF2+1
MOV SI,OFFSET BUF2+2
MOV BYTE PTR[BX+SI],'$'
CMP BYTE PTR[BUF1+1],LEN1 ;校验用户名长度
JNZ FAILED
CMP BYTE PTR[BUF2+1],LEN2 ;校验密码长度
JNZ FAILED
MOV CX,LEN1
MOV SI,0
LOOP1: ;逐个校验用户名字符
LEA BX,USER
MOV AL,[BUF1+2+SI]
CMP BYTE PTR[BX+SI],AL
JNZ FAILED
INC SI
LOOP LOOP1
MOV CX,LEN2 ;逐个校验密码字符
MOV SI,0
LOOP2:
LEA BX,PASSWD
MOV AL,[BUF2+2+SI]
CMP [BX+SI],AL
JNZ FAILED
INC SI
LOOP LOOP2
SUCCESS: ;校验成功处理
MOV AH, 00
MOV AL, 03H ;在屏幕中央显示绿色Login Successed
INT 10H
MOV AH, 13H
MOV AL, 01H
MOV BH, 0
MOV BL, 0AH
MOV CX, LL
MOV DH,12
MOV DL, (80-LL)/2
MOV BP, OFFSET SUCC
INT 10H
JMP OVER
FAILED: CRLF ;校验失败处理
MOV AH,9
MOV DX,OFFSET FAIL
INT 21H
CRLF
JMP BEG
OVER:MOV AH,4CH ;程序结束
INT 21H
CODE ENDS
END BEG