例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 | ||||