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

📄 codemusic.asm

📁 3、编写口令程序 要求: 1) 口令是随系统时间而变动的。(在输入口令前应先把当时的系统时间显示在屏幕上) 2)口令输入有次数限制。(口令与时间有关
💻 ASM
字号:
;*************
; 口      令 *
;*************
;宏定义
;>>>>>>>>>>>>清屏>>>>>>>>>>>>>>>>>
clear macro al1,ch1,cl1,dh1,dl1,bh1
            push ax
            push bx
            push cx
            push dx
            
            mov ah,6
            mov al,al1
            mov ch,ch1
            mov cl,cl1
            mov dh,dh1
            mov dl,dl1
            mov bh,bh1
            int 10h
            
            pop dx
            pop cx
            pop bx
            pop ax
            endm
;>>>>>>>>>>>>>光标定位>>>>>>>>>>>>>>>>>>>>>>>>
SetGb macro dh1,dl1
     push ax
     push bx
     push dx
     
     mov dh,dh1
     mov dl,dl1
     mov bh,0
     mov ah,02h
     int 10h
     
     push ax
     push bx
     push dx
     endm
;>>>>>>>>>>>>>>>>>>提示信息>>>>>>>>>>>>>>>>>>>>>>>    
Show_mess macro mess
     push ax
     push dx
     
     mov ah,09
     lea dx,mess
     int 21h
     
     pop dx
     pop ax
     endm
;>>>>>>>>>>>>输出>>>>>>>>>>>>>>>>>>>>>>>>>>
OutPut macro dl1
       push ax
       push dx
       
       mov ah,02h
       mov dl,dl1
       int 21h
       
       pop dx
       pop ax
       endm  
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
change macro c1,c2,c3
     mov al,c1
     cbw
     div bh
     add al,'0'
     mov DisTime[c2],al
     add ah,'0'
     mov DisTime[c3],ah  
     endm     
;数据区          
data segment
     DisTime  db 00,00,':',00,00,':',00,00,'$'  ;显示时间
     Count    db 1                              ;统计输入密码的次数
     CodeNum1 db 1,2,3,4,5,6        ;保存产生的六位密码 
     CodeNum2 db 0,0,0,0,0,0                    ;保存用户输入密码
     right    db 0                              ;标号 判断两次密码是否一样 
                                                ;0为一样 1为不一样   
     
     mess1    db 'The current time is : $'
     mess2    db 'The code number is  : $'
     mess3    db 'Please input the code number : $'
     mess4    db 'The code you have input is wrong ! $'
     mess5    db 'You have three times  $'
     mess6    db 'Locking !!! $'
     mess7    db 'Do you want to leave(y or n)? $'
     mess8    db 'Music Go! $'
     mess9    db 'First Song Input  1 $'
     mess10   db 'Second Song Input 2 $'
     mess11   db 'Third Song Input  3 $'
     mess12   db 'Press any key to begin... $'
     mess0    db 'Code And Music $'                 ;放在最前面有问题,放着就没有了
;自动演奏的歌曲频率和延时
MUS_FREQ1 DW 440,392,330,392,523,440,392,440
         DW 330,392,440,392,330,262,220,392
         DW 330,2 DUP(294),330,2 DUP(392),440,330
         DW 294,262,392,330,294,262,220,262,196
         DW -1
MUS_TIME1 DW 37,12,3 DUP(25),2 DUP(12),50
         DW 25,2 DUP(12 ),2 DUP(25),4 DUP(12 ),50
         DW 37 ,12 ,25,2 DUP(12 ),2 DUP(25),50
         DW 37 ,5 DUP(12 ),100
         
MUS_FREQ2 DW 392,523,392,330,2 DUP(262,330,392),2 DUP(523)
         DW 349,3 DUP(440),330,3 DUP(392),294,349,330,294,262
         DW 392,523,392,330,2 DUP(262,330,392),2 DUP(523)
         DW 349,3 DUP(440),330,3 DUP(392),294,349,330,294,262
         DW 392,3 DUP(523),494,587,392,392,3 DUP(587),523,659,392
         DW 3 DUP(523),330,3 DUP(392),294,349,330,294,262
         DW -1
MUS_TIME2 DW 12 ,3 DUP(25,2 DUP(12 )),2 DUP(25)
         DW 2 DUP(19,6,2 DUP(12 )),4 DUP(12 )
         DW 25,12 ,3 DUP(25,2 DUP(12 )),2 DUP(25)
         DW 2 DUP(19,6,2 DUP(12 )),5 DUP(12 )
         DW 2 DUP(19,6,4 DUP(12 ),25)
         
         DW 25,2 DUP(12 ),19,6,6 DUP(12 ),25
MUS_FREQ3 DW 262,262,294,330,330,349,392,440,392,330
         DW 392,349,330,294,349,330,294,262
         DW 262,262,294,330,330,349,392,440,392,330
         DW 392,349,330,294,330,294,262,196
         DW 392,349,330,294,196,196,349,330,294,262
         DW 392,349,330,294,196,196,349,330,294,262
         DW 262,262,294,330,330,349,392,440,392,330
         DW 392,349,330,294,330,294,262
         DW -1
MUS_TIME3 DW 3 DUP(25,2 DUP(12)),50
         DW 2 DUP(25,2 DUP(12),50)
         DW 3 DUP(25,2 DUP(12)),50
         DW 2 DUP(25,2 DUP(12)),2 DUP (50)
         DW 3 DUP(25,2 DUP(12)),50
         DW 3 DUP(25,2 DUP(12)),50  
         DW 3 DUP(25,2 DUP(12)),50
         DW 2 DUP(25,2 DUP(12)),50
data ends
;代码段
code segment
     assume cs:code,ds:data
start:
     mov ax,data
     mov ds,ax
     
     ;清全屏
     clear 0,0,0,24,79,7  
           
     ;标题
     clear 0,2,25,3,50,04h      
     SetGb 3,30                 
     Show_mess mess0  
       
     ;操作区
     clear 0,5,15,20,60,68h     
     clear 0,6,16,19,59,74h
     
     ;显示时间
     SetGb 8,22
     clear 0,7,22,10,50,7ah               
     Show_mess mess1 
     SetGb 10,30
     call ShowTime
     
     ;显示密码
     SetGb 12,22
     clear 0,11,22,14,50,72h              
     Show_mess mess2
     call SetCode
     SetGb 14,30    
     lea di,CodeNum1
     mov cx,6
   kk:
     mov ah,02h
     mov dl,[di]
     add dl,30h
     int 21h
     inc di
     loop kk  
     ;jmp music
     
     ;输入密码
     SetGb 15,22
     Show_mess mess3 
again:  
     cmp count,3
     ja  stop  
     SetGb 17,30 
     clear 0,16,30,17,50,70h             
     call InCode   
     call CodeCmp             ;判断
     cmp right,1              ;输入密码错误
     je  try                  
     jmp music1                ;输入密码正确,开始听歌
stop:
     clear 0,16,30,17,40,74h     ;清除错误数据
     SetGb 17,28
     Show_mess mess6             ;提示信息
     mov dx,40000                ;延时
   d11:   
     mov cx,20000
   d22:
     loop d22
     dec dx
     jnz d11 
     clear 0,16,25,17,50,74h      ;清除提示信息
     mov count,1                  ;统计输入次数,最多三次
     jmp leave
try:
     mov right,0                  ;默认输入的密码正确
     inc count                    ;统计输入次数,最多三次
     clear 0,16,30,17,55,74h      ;清除错误数据
     SetGb 17,22 
     Show_mess mess4              ;提示信息
     SetGb 18,22 
     Show_mess mess5
     mov dx,40000                 ;延时
   d211:   
     mov cx,20000
   d222:
     loop d222
     dec dx
     jnz d211 
     clear 0,16,22,18,59,74h       ;清除提示信息,重新开始输入密码
     jmp again    
leave:                             ;询问是要离开还是重新开始
     clear 0,6,16,19,59,74h
     SetGb 10,23
     clear 0,9,23,10,59,72h     
     Show_mess mess7
  Get1:
     SetGb 12,36
     mov ah,01h
     int 21h
     cmp al,'Y'
     je  outgo
     cmp al,'y'
     je  outgo
     cmp al,'N'
     je  start3
     cmp al,'n'
     je  start3
     mov dx,30000                ;延时
   d311:   
     mov cx,20000
   d322:
     loop d322
     dec dx
     jnz d311 
     jmp Get1
start3:
     jmp start
outgo:
    jmp exit
music1:
    clear 0,6,16,19,59,76h
    
    SetGb 10,30
    clear 0,9,30,10,59,74h
    Show_mess mess8            
  GetL: 
    SetGb 14,25                  ;效果
    clear 0,7,30,8,59,74h
    Show_mess mess12
    mov dx,40000                 ;延时
   d411:   
     mov cx,20000
   d422:
     loop d422
     dec dx
     jnz d411
     mov ah,0bh
     int 21h
     inc al
     clear 0,7,30,8,59,7ch
     jne GetL   
music2:
     clear 0,6,16,19,59,74h
     
     SetGb 8,30
     clear 0,7,30,8,59,72h
     Show_mess mess8              ;开始音乐
     
     SetGb 12,24                  ; first song 
     clear 0,11,24,12,59,76h
     Show_mess mess9 
     
     SetGb 14,24                  ;second song 
     clear 0,13,24,14,59,79h
     Show_mess mess10
     
     SetGb 16,24                  ;third song 
     clear 0,15,24,16,59,74h
     Show_mess mess11
  Get2:
     SetGb 14,50
     mov ah,01h
     int 21h
     
     cmp al,1bh
     je  leave3
     cmp al,31h
     jb  Get2
     cmp al,33h
     ja  Get2
      
     cmp al,31h
     je  first
     cmp al,32h
     je  second
     jmp third
first:
     lea si,MUS_FREQ1
     lea bp,MUS_TIME1
  freq1:
     mov di,[si]
     cmp di,-1
     je  leave3
     mov bx,ds:[bp]
     call playmusic
     add si,2
     add bp,2
     mov ah,0bh
     int 21h
     inc al
     jnz freq1
second:
     lea si,MUS_FREQ2
     lea bp,MUS_TIME2
   freq2:
     mov di,[si]
     cmp di,-1
     je  leave3
     mov bx,ds:[bp]
     call playmusic
     add si,2
     add bp,2
     mov ah,0bh
     int 21h
     inc al
     jnz freq2
third:
     lea si,MUS_FREQ3
     lea bp,MUS_TIME3
    freq3:
     mov di,[si]
     cmp di,-1
     je  leave3
     mov bx,ds:[bp]
     call playmusic
     add si,2
     add bp,2
     mov ah,0bh
     int 21h
     inc al
     jnz freq3    
leave3:
     jmp leave                
exit:
     mov ah,4ch
     int 21h    
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;显示当前时间
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ShowTime proc  
     push ax
     push bx
     push cx
     push dx
        
     mov ah,2ch
     int 21h
     
     mov bh,10
     change ch,0,1
     change cl,3,4
     change dh,6,7
     
     mov ah,09h
     lea dx,DisTime
     int 21h
     
     pop dx
     pop cx
     pop bx
     pop ax
     ret
ShowTime endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;设置密码                           
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SetCode proc                         ;产生密码
        mov ah,2ch
        int 21h
     
        mov bh,10
        mov al,dh
        cbw
        div bh
        add al,30h
        mov CodeNum1[0],al
        add ah,30h
        mov CodeNum1[1],ah 
        
        mov bh,10
        mov al,cl
        cbw
        div bh
        add al,30h
        mov CodeNum1[1],al
        add ah,30h
        mov CodeNum1[2],ah 
        
        mov bh,10
        mov al,dh
        cbw
        div bh
        add al,30h
        mov CodeNum1[3],al
        add ah,30h
        mov CodeNum1[4],ah 
        ret
SetCode endp   
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;显示当前时间
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
InCode proc                    ;从键盘输入密码
       lea di,CodeNum2
       mov cx,6
    Get3:
       mov ah,08h
       int 21h
       OutPut '*'              ;输入星号
       cmp al,0dh
       je  qq
       mov [di],al
       inc di
       loop Get3
qq:       
       ret
InCode endp    
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;密码比较函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
CodeCmp proc 
    lea si,CodeNum1
    lea di,CodeNum2
    mov cx,6
  Get4:
    mov al,[si]
    add al,30h
    cmp al,[di]
    jne gg
    inc si
    inc di
    loop Get4
    jmp hh
gg:
    mov right,1 
hh:   
    ret
CodeCmp endp  
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;音乐函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
playmusic proc 
       PUSH AX
       PUSH BX
       PUSH CX
       PUSH DX
       PUSH DI

       MOV AL,0B6H
       OUT 43H,AL
       MOV DX,12H
       MOV AX,348CH
       DIV DI
       OUT 42H,AL
       MOV AL,AH
       OUT 42H,AL
       IN AL,61H
       MOV AH,AL
       OR AL,03h
       OUT 61H,AL
WAIT1:  
       CALL WAITF
       DEC BX
       JNZ WAIT1                                     ;判断是否播放完毕
       MOV AL,AH                                     ;完毕则关闭扬声器
       OUT 61H,AL
       POP DI
       POP DX
       POP CX
       POP BX
       POP AX
       ret
playmusic endp  
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;音乐延时函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
WAITF PROC NEAR
;延时程序
       PUSH AX
       MOV CX,18663
WAITF1:
       IN AL,61H                          
       AND AL,10H                                    ;检查PB4口
       CMP AL,AH                                     ;判断AL变化否
       JE WAITF1                                       ;等待AL变化
       MOV AH,AL                                    ;保存PB4的新状态(AL中)
       LOOP WAITF1
       POP AX
       RET
WAITF ENDP 
code ends
     end start     

      

⌨️ 快捷键说明

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