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

📄 pass.asm

📁 学分管理系统的分析
💻 ASM
字号:
include macro.lib
extrn  printf:far,printf1:far,printf2:far,box:far,clearscreen_rw:far,putchar:far
extrn  fill:far,putimmage:far,getimmage:far,vertical:far
extrn  showbmp:far,draw_jiao:far
extrn  clearscreen_in:far
extrn  busy:byte,openkeyboard:byte,color:word,movflag_key:byte,old_pos_x:word,new_pos_x:word
extrn  new_pos_y:word,old_pos_y:word,closeintr:byte
extrn  store_b:far,restore_b:far
extrn  BACKFLAG1:BYTE,BACKFLAG2:BYTE,BACKFLAG3:BYTE
extrn  mousex:word,mousey:word
extrn  beep:far,printf3:far
extrn  restore_m:far,store_m:far
extrn  rectangle:far
public pass,modifypassword


data  segment para public 'data'
passico   db   'picture\pass.bmp',0
passfile  db  'data\pass.dat',0
password  db   20 dup(?)
buf	  db   20 dup(?)
flag1     db   0
flag2     db   0
flag3     db   0
flag4     db   0
value     db   0
content   db  '请输入用户密码:',0,0
error     db  '您的密码不正确,请继续',0,0
filelose  db  '密码文件丢失,您不能进入',0,0
newpass   db  '请输入新密码:',0,0
againinput  db  '确认新密码:',0,0
success   db  '你的密码已经成功修改',0,0
fail      db  '两次输入的密码不一致,密码未能修改',0,0
open_error  db  '打开密码文件出错',0,0
yes               db    '确定',0,0
yeshelp           db    '确定后进行下一步操作',0,0
cancle            db    '取消',0,0
canclehelp        db    '放弃此次操作',0,0
filecode      dw   ?
store_si      dw   ?
true_length   dw   ?

length_read	 dw   ?
num_input     db   3

data  ends

code  segment public  'code'
	assume cs:code,ds:data,es:data
.386
;==============================================================	

;入口参数:无
;出口参数:CF, CF=0,登陆不成功,CF=1 ,登陆成功
pass   proc  far
	pusha
	push  ds
	push  es
	mov  ax, data
	mov  ds, ax
	mov  es, ax
	
	mov  closeintr,1
	box_jiao  350,250,600,400,<RGB 128,128,128>
	box_jiao  353,253,597,397,<RGB 232,23,23>
	box_jiao  370,320,580,350,<RGB 232,23,23>
	out_hz	  370,280,content,<RGB 255,255,255>

	openpicture 355,270, passico,P_COPY
	RGB	  255,0,0
	mov	  ax, 253
	mov	  bx, 390
	mov	  cx, 36
	mov	  dx, 1
	call	  draw_jiao
	mov  closeintr,0
	openfile  passfile,0         ;从文件读入密码
	jc        read_error
	mov       filecode , ax
	readfile  filecode, password, 20

	closefile filecode
     

lopa:
	lea       di,  buf           ;从键盘读入用户输入密码
	mov	  ax,  372
	mov	  bx,  325
	mov	  dx,  20
	call	  getpassword
	jnc	  exit
     
	cmpstr	  password,buf,20
	jne	  password_error
	mov   closeintr,1
	setxy 0,0,799,599
	CALL clearscreen_rw
	mov   closeintr,0
	stc
	jmp       exit                  ;密码正确,将标志位置为1,退出
	
password_error:
	slow_zi  370,370,error,<RGB  255,0,0>	;密码出错处理
	dec      num_input
	jz       next
	mov      ah,8
	int      21h
	out_hz	 370,370,error,<RGB 0,0,0>
	background  372,323,578,348,<RGB 0,0,0>
	jmp	 lopa
	
read_error:
        out_hz    420,370,filelose,<RGB  255,0,0>
        delay     200
next:
	mov   closeintr,1
	setxy 0,0,799,599
	CALL clearscreen_rw
	mov   closeintr,0
	clc
        jmp       exit
	
exit:	
	pop  es
	pop  ds
	popa
	ret
pass   endp	
;==============================================================	
;得到用户密码
;入口参数:ax--x,bx--y,di存储密码的缓冲区,dx--length:密码长度
;出口参数:CF=0,DI 无效,CF=1,DI有效
getpassword  proc  near
	push ds
	push es
	mov  cx, data
	mov  ds, cx
	mov  es, cx
	mov  new_pos_x,ax
	mov  old_pos_x,ax

	mov  new_pos_y,bx
	mov  old_pos_y,bx
	call store_b
	mov  length_read, dx
	mov  openkeyboard ,1
lopp:	mov  ah,1
	int  16h
	jz   lopp   ;没有按键
	
	mov  ah,0
	int  16h    ;读键
	
	cmp  al, ENTERKEY
	je  exit_a
	
	cmp  al, ESCKEY
	je  exit_n
	
	cmp  al, 0        ;无效字符,响铃
	jne  next1
	alarm
	jmp  lopp         ;返回,继续循环
	
next1:	
	cmp   al, BACKSPACE
	jne   next3
	cmp   dx,length_read
	jne   next2          ;无输入字符,如回退则响铃
	alarm
	jmp   lopp
next2:	
	mov   closeintr,1
	inc   dx	    ;回退一格
	sub   new_pos_x,8
	mov   movflag_key,1
	mov   al,0
	std  
	stosb
	mov   al, '*'
	mov   bp, 0h
	mov   bx, new_pos_x
	mov   cx, new_pos_y
	
	call  putchar
	mov   closeintr,0
	jmp   lopp
	
next3: 	
	dec   dx
	jnz   next4
	alarm
	inc   dx
	jmp   lopp
next4:
	mov   closeintr,1
	mov   movflag_key,1
	cld   
	stosb
	mov   al, '*'
	mov   bp, 0ffffh
	mov   bx, new_pos_x
	mov   cx, new_pos_y
	call  putchar
	add   new_pos_x,8
	mov   closeintr,0
	jmp   lopp
	
exit_n: 
	mov   openkeyboard,0
 	clc          ;置无效标志
 	jmp  exit	
exit_a:
	mov   openkeyboard,0
	std	     ;在字符串末尾加一个0
	mov  al,0
	stosb
	sub  length_read ,dx ;计算出实际输入的字符个数
	stc	     ;置有效标志
exit:
	pop  es
	pop  ds		
	
	ret
getpassword   endp
;===============================================================
;===============================================================
;修改密码
modifypassword	proc   far
 	pusha
 	push  ds
 	push  es
 	mov    ax, data
 	mov    ds, ax
 	mov    es, ax
 	 	
 	setxy  300,100,500,500
 	call  clearscreen_in
 	
	box_jiao  200,150,700,400,<RGB 128,128,128>
	box_jiao  203,153,697,397,<RGB 232,23,23>
	box_jiao  220,220,680,250,<RGB 232,23,23>
	out_hz	  220,180,newpass,<RGB 255,255,255>
	out_hz    220,255,againinput,<RGB  255,255,255>
	box_jiao  220,290,680,320, <RGB	232,23,23>
	openpicture 205,170, passico,P_COPY
	RGB	  255,0,0
	mov	  ax, 153
	mov	  bx, 240
	mov	  cx, 36
	mov	  dx, 1
	call	  draw_jiao         ;布置对话框
	box_jiao   224,350,424,375,<RGB 125,0,32>
	out_hz	   304,355,yes,<RGB 0,0,255>
	box_jiao   480,350,685,375,<RGB 125,0,32>
	out_hz	   560,355,cancle,<RGB 0,0,255>
 	
	.while  1
	update	   224,222,678,248,flag1,< getpass 230,225,password,20>,next1
next1:
	update	   224,292,678,317,flag2,< getpass 230,295,buf,20     >,next2
next2:	
	submenu    224,350,424,375,flag3,yes,yeshelp,queding1 ,next3,BACKFLAG1
next3:
	submenu    480,350,685,375,flag4,cancle,canclehelp,quxiao1 ,next4,BACKFLAG1
next4:
	.ENDW
	cmp   value ,1
	jne   exit    
    	cmpstr	  password,buf,20
	jne       next
	slow_zi	220,420,success,<RGB 0,255,0>
	openfile  passfile,1                 ;写的方式打开密码文件
	jc        openerror
	mov       filecode, ax
	mov       bx, ax
	mov	  ah, 40h
	mov       cx, 20
	lea       dx, password
	int       21h
	closefile filecode
	jmp       exit        
next:	slow_zi	220,420,fail ,<RGB 255,0,0>
	delay     200
	jmp  exit
openerror:
	out_hz  200,420,open_error,<RGB 255,0,0>
	     	
	delay 200
exit:	mov   BACKFLAG1,1
	mov   BACKFLAG2,1

	mov   BACKFLAG3,1
	mov   busy ,1
	setxy 200,150,700,450
 	call  clearscreen_in
 	call  store_m
 	mov   busy ,0
 	pop  es
 	pop  ds
 	popa
 	ret
modifypassword	endp
;=============================================================== 	
;==============================================================
queding1  proc  near
       mov  value, 1
       mov  BACKFLAG1,1
       ret
queding1   endp
quxiao1	 proc  near
       mov  value, 0
       mov  BACKFLAG1,1
       ret
quxiao1	 endp
;=============================================================== 	
code  ends
	end	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -