例8.4 编写一个输入密码的程序,该程序的具体要求如下:
1、每输入一个字符,显示字符"#"表示之;
2、密码最多只有10个字符,多余的按键被丢弃;
3、若输入的字符串为"HELLO",则以蓝色显示"Welcome…",否则,以闪烁、亮红色在显示"Invalid Password"。
解: | ||||
.MODEL SMALL .DATA |
||||
CR EQU 0DH MSG1 DB "Welcome..." MSG2 DB "Invalid Password" PSW1 DB "HELLO" BUFF DB 10 DUP(?) |
||||
.CODE | ||||
.STARTUP | ||||
MOV | AX, DS | |||
MOV | ES, AX | |||
XOR | BX, BX | |||
again: | ||||
MOV | AH, 0H | |||
INT | 16H | ;从键盘接受字符输入 | ||
CMP | AL, CR | |||
JZ | next | ;若按“回车“键,则结束密码输入 | ||
CMP | BX, 10 | |||
JZ | again | ;若已接受了10个字符,则丢弃随后的字符 | ||
.IF AL>='a' && AL<=’z’ SUB AL, 20H .ENDIF |
||||
MOV | BUFF[BX], AL | |||
INC | BX | ;保存当前输入,并移动有关指针 | ||
MOV | DL, '#' | |||
MOV | AH, 2 | |||
INT | 21H | ;在屏幕上显示字符”#” | ||
JMP | again | |||
next: | ||||
CALL | Clear | ;清屏幕,见例8.2中的过程定义 | ||
CMP | BX, 5 | |||
JNZ | error | ;若输入的字符串长度不为5,则密码错误 | ||
LEA | SI, PSW1 | |||
LEA | DI, BUFF | |||
MOV | CX, BX | |||
CLD | ||||
REPE | CMPSB | ;比较字符串PSW1和BUFF | ||
.IF ZERO? | ;若字符串的相应字符相同 | |||
MOV BP, OFFSET MSG1 | ;显示字符串首地址 | |||
MOV BL, 09H | ;显示字符颜色:蓝色 | |||
MOV CX, 0AH | ;显示字符串长度:10 | |||
.ELSE | ||||
MOV BP, OFFSET MSG2 | ;显示字符串首地址 | |||
MOV BL, 8CH | ;显示字符颜色:闪烁、亮红色 | |||
MOV CX, 10H | ;显示字符串长度:16 | |||
.ENDIF | ||||
MOV | AL, 0 | |||
MOV | BH, 0 | |||
MOV | DH, 5 | |||
MOV | DL, 20 | ;在位置(5,20)的位置开始显示字符串 | ||
MOV | AH, 13H | |||
INT | 10H | ;使用中断10H之功能13H来显示字符串 | ||
.EXIT 0 | ||||
END |