📄 mima4.asm
字号:
DATA SEGMENT
NUM EQU 3
TIMES DB NUM
TIMES1 DB NUM
HeadMsg DB ' ',0DH,0Ah
DB '+----------------------------------------------+',0dh,0ah
DB '| Simple input password system for asm program |',0dh,0ah
DB '| have a fun.^-^. |',0dh,0ah
DB '| Poor Programmer:IVY Date:April,2 2009 |',0dh,0ah
DB '+----------------------------------------------+',0dh,0ah
DB 0DH,0AH,0AH,' PLEASE INPUT PASSWORD:','$'
Msg0 DB 0DH,0AH,0AH,' PLEASE INPUT PASSWORD AGAIN:','$'
Msg1 DB 0DH,0AH,' PASSWORD IS RIGHT!! ','$'
Msg2 DB 0DH,0AH,' PASSWORD IS ERROR!! ','$'
Msg3 DB 0DH,0AH,'DO YOU WHANT TO MODIFY THE PASSWORD (Y/N)','$'
Msg4 DB 0DH,0AH,'PLEASE INPUT THE NEW PASSWORD :','$'
Msg5 DB 0DH,0AH,'PLEASE CONFIRM THE PASSWORD:','$'
Msg6 DB 0DH,0AH,0AH,'NOT MARCH!! PLEASE CONFIRM IT AGAIN:','$'
Msg7 DB 0DH,0AH,' PASSWORD MODIFICATION IS SUCCESSFULL!','$'
Msg8 DB 0DH,0AH,' YOU HAVE INPUT THE WRONG PASSWORD OVER 3 TIMES!'
DB 0DH,0AH,' PLEASE REINPUT AFTER 5 SECONDS','$'
Msg9 DB 0DH,0AH,0AH,' PASSWORD MODIFICATION IS FAILED! ','$'
ENDMsg DB 0DH,0AH,0AH,' PRESS ANY KEY TO EXIT ','$'
ORINGE DB 31H,32H,33H,34H,35H,36H
In_Str DB 20 DUP (?)
KEY1 DB 20 DUP (?)
KEY2 DB 20 DUP (?)
FREQ1 DW 440,261,400,261
FREQ2 DW 493,392,493,392,493,392
FREQ3 DW 493,493,493,493,493
TIME1 DW 800,400,800,400
TIME2 DW 400,200,400,200,400,200
TIME3 DW 800,800,800,800,800
DATA ENDS
;***************定义一个宏,显示字符串 *************
SHOW_STR MACRO b
LEA DX,b
MOV AH,09H
INT 21H
ENDM
;******************主程序****************************
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
MAIN PROC FAR
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV SI,0
MOV DI,0
CALL ENTER
SHOW_STR HeadMsg
MOV BX,OFFSET In_Str
CALL GET_KEYS
CALL CHEAK1
CALL MODIFY
SHOW_STR ENDMsg
QUIT: MOV AH,4CH
INT 21H
MAIN ENDP
;******************换行子程序**********************
ENTER PROC NEAR
PUSH AX
PUSH DX
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
POP DX
POP AX
RET
ENTER ENDP
;****************显示单个字符*******************
SHOW_CHAR PROC NEAR
MOV AH,02H
INT 21H
RET
SHOW_CHAR ENDP
;**********************5秒精准延时***************
DELAY PROC NEAR
MOV AH,00H
INT 1AH
ADD DX,91
MOV BX,DX
RE:
MOV AH,00H
INT 1AH
CMP DX,BX
JNZ RE
RET
DELAY ENDP
;***************************录入6位密码******************
GET_KEYS PROC NEAR
MOV CX,6
GET_KEY:
MOV AH,00H ;从键盘等待读字符
INT 16H
CMP AL,1BH ;是否是ESC键
JE BACK
MOV BYTE PTR[BX],AL
MOV DL,'*'
PUSH AX
CALL SHOW_CHAR ;调用单个字符显示
POP AX
INC BX
LOOP GET_KEY
JMP RE0
BACK:MOV AH,4CH
INT 21H
RE0:RET
GET_KEYS ENDP
;********************判断初始密码是否正确*************
CHEAK1 PROC NEAR
MOV CX,6
LEA SI,ORINGE
LEA DI,In_Str
CLD
REPE CMPSB ;如果相等重复比较
JNE GO ;?????为啥判断不了?因为在同一段比较所以判断不了。使es=ds
CALL ENTER ;两串相同就提示输入正确
SHOW_STR Msg1
CALL ENTER
CALL RING1
JMP RET0
;发出提示音1
GO: CALL ERROR
RET0: RET
CHEAK1 ENDP
;********************输入错误,报警程序************
ERROR PROC NEAR
DEC TIMES
CMP TIMES,0
JZ NO ;输错三次,跳转到no锁定
CALL ENTER
SHOW_STR Msg2
CALL ENTER
SHOW_STR Msg0
CALL RING2 ;发出提示音2
MOV BX,OFFSET In_Str
CALL GET_KEYS
CALL CHEAK1
JMP RET_E
NO: CALL ENTER
SHOW_STR Msg8
;CALL DELAY ;输错三次报警并锁定5秒后返回主程序
CALL RING3 ;发出提示音3
CALL MAIN
RET_E: RET
ERROR ENDP
;********************修改密码***************************
MODIFY PROC NEAR
WAITE:
SHOW_STR Msg3
MOV AH,0 ;从键盘读字符,AH扫描吗,ALASCII码
INT 16H
CMP AL,'Y'
JE MODI
CMP AL,'y'
JE MODI
CMP AL,'N'
JE EXIT0
CMP AL,'n'
JE EXIT0
JMP WAITE
MODI:
CALL ENTER
SHOW_STR Msg4 ;提示输入新密码
LEA BX,KEY1 ;新密码保存到key1
CALL GET_KEYS
CALL ENTER
SHOW_STR Msg5
LP: LEA BX, KEY2 ;再次输入 保存到key2
CALL GET_KEYS
LEA SI,KEY1
LEA DI,KEY2
MOV CX,6
CLD
REPE CMPSB ;比较两次输入
JNE REINPUT ;不一样再次输入
CALL ENTER
SHOW_STR Msg7 ;提示修改成功
CALL ENTER
JMP RETM
REINPUT:
DEC TIMES1
CMP TIMES1,0
JZ EXIT0 ;最多输入三次
SHOW_STR Msg6 ;提示not march再次输入
JMP LP
EXIT0:
SHOW_STR Msg9 ;提示修改失败
CALL RING3
;输错三次报警并锁定5秒后返回主程序
RETM:
RET
MODIFY ENDP
;************扬声器发声子程序*******************
GENSOUND PROC NEAR
PUSH DX
PUSH BX
PUSH CX
PUSH AX
MOV AL,10110110B ;8253控制字:通道2,先写低字节,后写高字节
;方式3,二进制计数
OUT 43H,AL
MOV DX,0012H ;被除数高位
MOV AX,34DCH ;被除数低位
DIV DI ;计数值=533H×896÷ f=1234DCH÷ f
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,61H
MOV AH,AL
OR AL,03H
OUT 61H,AL ;接通扬声器发声
;GL: MOV CX,2801 ;10MS
;GL1:LOOP GL1
;DEC BX
;JNZ GL
;;POP BX
;;POP CX
CALL DELAY ;延时5s
MOV AL,AH ;关闭扬声器
OUT 61H,AL
POP AX
POP CX
POP BX
POP DX
RET
GENSOUND ENDP
;****************报警提示音程序**************
RING1 PROC NEAR
;PUSH DS
;PUSH CX
;PUSH BX
MOV SI,OFFSET FREQ1
MOV DI,OFFSET TIME1
L1: MOV CX,[SI]
CMP CX,-1
JE EXIT1
MOV BX,[DI]
CALL GENSOUND
ADD SI,2
ADD DI,2
JMP L1
EXIT1:
;POP BX
;POP CX
;POP DS
RET
RING1 ENDP
;****************************************
RING2 PROC NEAR
;PUSH DS
;PUSH CX
;PUSH BX
MOV SI,OFFSET FREQ2
MOV DI,OFFSET TIME2
L2: MOV CX,[SI]
CMP CX,-1
JE EXIT2
MOV BX,[DI]
CALL GENSOUND
ADD SI,2
ADD DI,2
JMP L2
EXIT2:
;POP BX
;POP CX
;POP DS
RET
RING2 ENDP
;****************************************
RING3 PROC NEAR
;PUSH DS
;PUSH CX
;PUSH BX
MOV SI,OFFSET FREQ3
MOV DI,OFFSET TIME3
L3: MOV CX,[SI]
CMP CX,-1
JE EXIT3
MOV BX,[DI]
CALL GENSOUND
ADD SI,2
ADD DI,2
JMP L3
EXIT3:
;POP BX
;POP CX
;POP DS
RET
RING3 ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -