📄 last.asm
字号:
JZ MODIFYOK ;三次输入的不一样则按任意键就会结束程序
MOV AH,09H ;Not match and press any key to return.
MOV DX,OFFSET STRING3
INT 21H
MOV AH,00H ;键盘扫描码 ah
INT 16H
JMP WAITING1
MODIFYOK: MOV CX,COUNT
MOV SI,OFFSET KEYBAK1
MOV DI,OFFSET KEYWORD
REP MOVSB
OK: MOV SI,OFFSET TEABLE3 ;success sound
MOV DI,OFFSET TIME
L5: MOV CX,[SI]
CMP CX,0
JE REMENU
MOV BX,[DI]
CALL GENSOUND
ADD SI,2
ADD DI,2
JMP L5
REMENU: MOV AH,09H ;sucess and press any key to return.
MOV DX,OFFSET STRING31
INT 21H
MOV AH,00H ;键盘扫描码 ah
INT 16H
JMP WAITING1
DISPLAY0: JMP DISPLAY1
WAITING00: JMP WAITING0
MUSIC: MOV AH,09H ;显示字符串notes
MOV DX,OFFSET NOTES
INT 21H
MOV SI,OFFSET TEABLE2
MOV DI,OFFSET TIME
L3: MOV CX,[SI]
CMP CX,-1
JE WAITING00
MOV BX,[DI]
CALL GENSOUND
ADD SI,2
ADD DI,2
MOV AH,06
MOV DL,0FFH
INT 21H
JNE WAITING00
JMP L3
INPUT: MOV AH,09H ;显示字符串Input Password:
MOV DX,OFFSET STRING4
INT 21H
MOV BX,OFFSET BUFFER ;输入秘码
CALL GETKEYS ;获得输入秘码,保存到buffer
MOV CX,COUNT ;是否输入了正确的秘码
CMPKEY2: MOV SI,OFFSET KEYWORD
MOV DI,OFFSET BUFFER
REPZ CMPSB
JZ INPUTOK ;两次输入的不一样则按任意键就会结束程序
DEC TIMES
CMP TIMES,0
JZ EXIT
MOV AH,09H ;显示字符串Password is wrong!,Pleas input again.
MOV DX,OFFSET STRING6
INT 21H
JMP INPUT
INPUTOK: JMP OK
WAITING000: JMP WAITING00
DISPLAY1: MOV CH,0 ;URRENT TIME IS’
MOV CL,16
LEA BP,TIME1
MOV DH,46
MOV DL,46
CALL DISP
MOV CH,0 ;;显示登录系统时间
MOV CL,8
LEA BP,TIME2
MOV DH,47
MOV DL,46
CALL DISP
MOV AH,2 ;Dos功能调用,2H 获得系统时间
INT 1AH ;Dos功能调用(1AH)CH:CL 时:分
;DH:DL 秒:1/100秒
MOV AX,CX
MOV CX,2
LEA SI,CTIME1 ;小时的转换
CALL NUMTOASCII ;数字转化为ASCII
MOV AH,AL ;分钟转化为ASCII
MOV CX,2
LEA SI,CTIME1+3
CALL NUMTOASCII
MOV AH,DH ;秒的转换
MOV CX,2
LEA SI,CTIME1+6
CALL NUMTOASCII
MOV CH,0 ;URRENT TIME IS’
MOV CL,12
LEA BP,CTIME0
MOV DH,46
MOV DL,64
CALL DISP
MOV CH,0 ;;显示登录系统时间
MOV CL,8
LEA BP,CTIME1
MOV DH,47
MOV DL,64
CALL DISP
MOV AH,06
MOV DL,0FFH
INT 21H
JNE WAITING000
JMP DISPLAY1
EXIT: MOV AH,09H ;显示字符串waring time
MOV DX,OFFSET WARINGS
INT 21H
MOV SI,OFFSET TEABLE1 ;waring sound
MOV DI,OFFSET TIME
L4: MOV CX,[SI]
CMP CX,0
JE OVER
MOV BX,[DI]
CALL GENSOUND
ADD SI,2
ADD DI,2
JMP L4
OVER: MOV AH,4CH
INT 21H
MAIN ENDP
GETKEYS PROC NEAR
MOV CX,COUNT ;设置循环计数为6,能够保存六个秘码
GETKEY: MOV AH,00H ;等待输入秘码
INT 16H
MOV BYTE PTR [BX],AL ;将输入的秘码保存到Bx指向的地址处
MOV AH,02H ;在当前光标位置显示*
MOV DL,'*'
INT 21H
INC BX
LOOP GETKEY
RET
GETKEYS ENDP
NUMTOASCII PROC NEAR ;这个函数完成了,从AX提取出它的16位的内容,保存在SI为首地址的地方里面,CX的表示 ;CX是个数。AX是从AH开始有效的.
PUSH AX
PUSH BX
PUSH SI
LP: PUSH CX
MOV CH,0
MOV CL,4
ROL AX,CL ;;循环左依次移取小时的十位和个位
MOV BL,AL
AND BL,0FH
OR BL,30H
MOV [SI],BL ;;存放转换后的ASCII在TIME2中
POP CX
INC SI
LOOP LP
POP SI
POP BX
POP AX
RET
NUMTOASCII ENDP
DISP PROC NEAR
PUSH AX
PUSH BX
MOV AH,13H ;;显示字串(ES:BP 串地址,CX=串长,DH:DL=行:列)
MOV AL,0
MOV BH,0
MOV BL,2
INT 10H
POP BX
POP AX
RET
DISP ENDP
GENSOUND PROC NEAR
PUSH DX
MOV AL,0B6H
OUT 43H,AL
MOV DX,8H
MOV AX,3208H
DIV CX
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,61H
MOV AH,AL
OR AL,3
OUT 61H,AL
L2: PUSH DX
PUSH AX
MOV DX,8H
MOV AX,0F05H
S1: SUB AX,1
SBB DX,0
JNZ S1
POP AX
POP DX
DEC BX
JNZ L2
MOV AL,AH
OUT 61H,AL
POP DX
RET
GENSOUND ENDP
CODE ENDS
END MAIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -