⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mima4.asm

📁 基于80X86的asm汇编语言程序。电子密码锁
💻 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 + -