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

📄 mima.asm

📁 利用汇编语言编写的六位电子密码锁程序
💻 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 + -