📄 mima.asm
字号:
stack SEGMENT stack
DW 128 DUP(?)
stack ENDS
data segment
k1 db 'Input keycode(F3)$'
k2 db 'modify keycode(F1)$'
k3 db 'Exit(F2)$'
k4 db 'Input old keycode(F3)$'
k5 db 'Return(F1)$'
k6 db 'key error$'
k7 db 'Input new keycode(F3)$'
k8 db 'Reinput new keycode(F3)$'
k9 db 'input keycode:$'
k11 db 'return!$'
ts1 db 'key error!$'
ts2 db 'you are right!$'
ts3 db 'key modification succeed!$'
key db 31h,32h,33h,34h,35h,36h ;初始化密码 123456
bc db 6 dup(?) ;存放第二次输入的密码
sr db 6 dup(?) ;存放输入的密码
time db 0 ;错误次数计数
data ends
code segment
assume ds:data,ss:stack,cs:code
start:mov ax,data
mov ds,ax
mov es,ax
s1: lea si,time
mov bl,[si]
cmp bl,3 ;判断密码输入错误次数是否为三
jne s2
call ext ;错误次数为三时程序结束
s2: call hh ;调用换行子过程
lea dx,k1
mov ah,09h
int 21h
call hh
lea dx,k2
mov ah,09h
int 21h ;显示菜单内容
call hh
lea dx,k3
mov ah,09h
int 21h ;显示菜单一
call hh
jmp xz ; 调用显示菜单内容子过程
return proc ;返回开始状态子过程
jmp s1
ret
return endp
return2 proc ;返回该密码菜单子过程
lea si,time
mov bl,[si]
cmp bl,3 ;判断错误次数是否为三
jne c1
call ext ;输入密码错误次数为三时程序结束
c1: jmp g2
ret
return2 endp
xz: mov ah,0h ;功能号
int 16h ;键盘bios中断功能调用
cmp al,0 ;判断是否为扩充吗
jne xz
cmp ah,3dh ;判断输入是否为F3
jne a0
call shuru ;调用输入密码子过程
call check ;调用判断密码子过程
call zq ;调用正确提示子过程
rn1: mov ah,0h ;功能号
int 16h ;键盘bios中断功能调用
cmp al,0 ;判断是否为扩充吗
jnz rn1
cmp ah,3bh ;判断输入是否为F1
jz g2
cmp ah,3ch ;判断输入是否为F2
jnz rn1
call ext ;调用程序结束子过程
a0: cmp ah,3bh ;判断输入是否为F1
jne a1 ;不是F1跳到编号a1处
jmp g2
call ext
a1: cmp ah,3ch ;判断输入是否为F2
je a3
call return
a3: call ext
g2: call hh
LEA SI,time
MOV BL,[SI]
CMP BL,3 ;判断错误次数是否为三
JNE g3
call ext
g3: lea dx,k4 ;显示密码修改菜单
mov ah,09h
int 21h
call hh
call xianshi
xz11: mov ah,0h ;选择
int 16h ;键盘bios中断功能调用
cmp al,0
jne xz11
cmp ah,3dh ;是F3?
jne a000
call shuru3 ;调用输入旧密码子过程
call check3 ;调用判断旧密码子过程
call xiugai ;条用输入新密码子过程
call ext
a000: cmp ah,3bh ;是F1?
jne a111
call return ;调用返回开始菜单子过程
a111: cmp ah,3ch ;是F2?
jne r111
call ext ;调用程序结束子过程
r111: jmp xz11
call ext
shuru3 proc ;输入旧密码子过程
lea si,time
mov bl,[si]
cmp bl,3;判断密码错误次数是否为三
jne c5
call ext;输入密码错误次数为三时程序结束
c5: call hh
lea dx,k9
mov ah,09h
int 21h ;提示输入密码
lea si,sr
mov cx,6 ;密码位数为6
mov bl,0 ;统计密码输入的个数
sh3: mov ah,08h ;功能号08h,输入密码不显示
int 21h ;DOS系统功能度调用
cmp al,0dh ;输入密码以回车键结束
je b13
mov [si],al ;保存输入的密码
inc si
inc bl
mov dl,2ah
mov ah,02h ; 输入一位密码后显示一个*号
int 21h
loop sh3
b13: cmp bl,6 ;判断输入的密码是否为六位
je rt4
lea si,time
mov bl,[time]
inc bl ;实现错误次数自加一
mov [time],bl
call return2
rt4: ret ;输入完毕返回
shuru3 endp
xiugai proc ;修改密码子过程
call hh
call hh
lea dx,k7
mov ah,09h
int 21h
call hh
call xianshi ;显示菜单内容
xz1: mov ah,0h ;
int 16h
cmp al,0
jne xz1
cmp ah,3dh ;F3?
jne a00
call shuru2 ;第一次输入新密码
call baochun ;保存第一次输入的新密码
call g1 ;调用重新输入新密码子过程
call hh
call hh
lea dx,ts3 ;显示密码修改成功后提示信息
mov ah,09h
int 21h
mov bx,50 ;密码修改成功后语音提示,设置声音频率50Hz
call sing ;调用发声子过程
call delay ;调用5秒准确延时子过程
call return ;调用返回开始菜单子过程
a00: cmp ah,3bh ;是F1?
jne a11
call return ;调用返回开始菜单子过程
a11: cmp ah,3ch ;F2?
jne xz1
call ext ;调用程序结束子过程
ret
xiugai endp
shuru proc ;开始输入密码子过程
lea si,time
mov bl,[si]
cmp bl,3;判断错误次数是否为三
jne c2
call ext;输入
c2: call hh
lea dx,k9 ;提示输入密码
mov ah,09h
int 21h
lea si,sr
mov cx,6
mov bl,0
sh: mov ah,08h
int 21h
cmp al,0dh
je b1
mov [si],al
inc si
inc bl
mov dl,2ah
mov ah,02h
int 21h
loop sh
b1: cmp bl,6
je r1
call error ;调用密码错误提示子过程
mov bx,200 ;密码错误语音提示,设置声音频率200Hz
call sing ;调用发声子过程
call delay
call hh
call return
r1: ret ;密码输入完毕返回
shuru endp
delay proc ;实现5秒的准确延时子过程
mov ah,2ch ;取系统时间
int 21h
mov bh,dh
add bh,05h ;时间秒数加五
q1: mov ah,2ch
int 21h
cmp bh,dh;延时五秒到了吗?没有就继续去取系统时间
jz rt3
jmp q1
rt3: ret
delay endp
error proc ;密码错误提示子过程
call hh
lea dx,k6 ;显示提示信息
mov ah,09h
int 21h
lea si,time
mov bl,[time]
inc bl ;错误次数自加一
mov [time],bl
ret
error endp
check proc ;开始密码判断子过程
mov cx,6
lea si,sr
lea di ,key
bj: mov bl,[si]
mov bh,[di]
cmp bl,bh
jz next
call error ;调用密码错误提示子过程
mov bx,200 ;设置声音频率200Hz
call sing
call delay2
call return
next: inc si
inc di
loop bj
lea si,time;密码正确后 ,错误次数清零
mov bl,0
mov [si],bl
ret
check endp
g1 proc ;第二次输入新密码子过程
r22: call hh
call hh
lea dx,k8
mov ah,09h
int 21h
call hh
call xianshi ;显示提示菜单
xz2: mov ah,0h ;选择
int 16h
cmp al,0
jne xz2
cmp ah,3dh ;是F3?
jne a01
call shuru2 ;调用第二次输入新密码子过程
call check2 ;调用两次输入密码判断子过程
call baochun2;两次输入一致,保存新密码 ,修改成功
jmp r2
a01: cmp ah,3bh ;是F1?
jne a12
call return
a12: cmp ah,3ch ;F2?
jne r22
call ext
r2: ret
g1 endp
shuru2 proc ;第二次输入新密码子过程
call hh
lea dx,k9
mov ah,09h
int 21h
lea si,sr
mov cx,6
mov bl,0
sh1: mov ah,08h
int 21h
cmp al,0dh
je b11
mov [si],al
inc si
inc bl
mov dl,2ah
mov ah,02h
int 21h
loop sh1
b11: cmp bl,6
je r110
call xiugai
call hh
r110: ret
shuru2 endp
hh proc near ;换行子过程
mov dl ,0ah
mov ah,02h
int 21h
mov dl, 0dh
mov ah,02h
int 21h
ret
hh endp
xianshi proc ;显示菜单子过程
lea dx,k5
mov ah,09h
int 21h
call hh
lea dx,k3
mov ah,09h
int 21h
call hh
ret
xianshi endp
check3 proc ;判断旧密码子过程
mov cx,6
lea si,sr
lea di ,key
bj4: mov bl,[si]
mov bh,[di]
cmp bl,bh
jz next3
lea si,time;实现错误次数自加一
mov bl,[time]
inc bl
mov [time],bl
jmp g2
next3: inc si
inc di
loop bj4
lea si,time;密码正确后,错误次数清零
mov bl,0
mov [si],bl
ret
check3 endp
baochun proc ;保存第一次输入的新密码子过程
mov cx,6
lea si,sr
lea di ,bc
bj1: mov bl,[si]
mov [di],bl
inc si
inc di
loop bj1
ret
baochun endp
ext proc
mov ah,4ch
int 21h
ret
ext endp
check2 proc ;判断密码修改时新密码两次输入是否一致子过程
mov cx,6
lea si,sr
lea di ,bc
bj3: mov bl,[si]
mov bh,[di]
cmp bl,bh
jz next1
call xiugai
next1: inc si
inc di
loop bj3
ret
check2 endp
baochun2 proc ;保存新密码子过程
mov cx,6
lea si,bc
lea di ,key
bj2: mov bl,[si]
mov [di],bl
inc si
inc di
loop bj2
ret
baochun2 endp
zq proc ;正确提示子过程
call hh
call hh
lea dx,ts2
mov ah,09h
int 21h
call hh
lea dx,k2
mov ah,09h
int 21h
call hh
lea dx,k3
mov ah,09h
int 21h
call hh
mov bx,500;语音提示,设置声音频率500Hz
call sing ;调用发声子过程
ret
zq endp
sing proc ;发声子过程
IN AL,61h;读b口状态
MOV AL,00000011b;启动通道二的定时器和扬声器
out 61h,AL ;代替原字节
mov al,0b6h ;置控制字,计数器二为方波发生器
out 43h,al
mov ax,34dch ;置基本时钟频率为1.19MHz
mov dx,12h
div bx ;求计数初值N
OUT 42h,AL ;先送计数初值低八位
MOV AL,AH
OUT 42h,AL ;再送计数初值高八位
IN AL ,61h ;读8225端口b
OR AL,03h ;设置pb0、pb1为'1'
OUT 61h,AL ;启动扬声器发声
call delay2 ;调用发声保持子过程
IN AL,61h
AND AL,0fch
OUT 61h,AL ;发生停止
ret
sing endp
delay2 proc ;发声保持子过程
mov dx,0ffffh
d1: mov cx,0fffh
d2: mov al,ah
loop d2
dec dx
jnz d1
ret
delay2 endp
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -