📄 pass.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 + -