汇编时钟(菜菜)

FreeXploiT:菜菜

data segment
       m2       DB  '0'                ;分的十位
     m1       DB  '0'                ;分的个位
              DB  ':'                ;间隔
     s2       DB  '0'                ;秒的十位
     s1       DB  '0'                ;秒的个位
              DB  ':'                ;间隔
     ms2      DB  '0'                ;百分秒位
     ms1      DB  '0'                ;十分秒位
     ROW      DB   0                 ;行数
   
data ends
STACK  SEGMENT
       DW 16 DUP(0)
STACK  ENDS 
code segment
 assume  cs:code,ds:data,SS:STACK
start:
      call clall2              ;调用清全屏
 ag:  call clear               ;调用清显示部分屏幕
      call list                ;调用显示
      call second              ;调用一秒延时
      MOV      AH,0BH          ;检测有键按下否?
      INT      21H
      CMP      AL,00H          ;AL=0,无键按下
      JZ       ag              ;无键按下,转ag
      MOV      AH,08H          ;有键,读键值AL
      INT      21H
      cmp      al,'n'
      jnz      end1
 nao: call dingshi              ;调用定时子程序
      jmp ag
     
end1: cmp   al,'s'
       jnz  g1
      call  far ptr mb
       jmp  ag
   g1:    cmp         al,1bh
      jnz            ag
   mov ah,4ch
   int 21h
;--------------------------------------------------日期
list proc near

           push ax
           push bx
           push cx
           push dx

       mov ah,2ah
    int 21h                  ;系统功能调用,读系统日期
       push dx                   ;将DX入栈
       mov dl,0
again1:    sub cx,03e8h           ;CX保存年,将CX-1000
           js  next1              ;CX为负跳next1
           inc dl                 ;否则DL+1
           jmp again1             ;跳至CX-1000
next1:     add cx,03e8h           ;CX+1000送CX
           add dl,30h 
           mov ah,02h 
           int 21h                ;显示DL,即CX的千位
           mov dl,0               ;DL清零
again2:    sub cx,0064h           ;将CX-100
           js  next2
           inc dl
           jmp again2
next2:     add cx,0064h
           add dl,30h
           mov ah,02h
           int 21h                ;显示DL,即CX的百位
           mov dl,0
 again3:   sub cx,000ah           ;将CX-10
           js  next3
           inc dl
           jmp again3  
next3:     add cx,000ah
           add dl,30h
           mov ah,02h
           int 21h                ;显示DL,即DX的十位
           add cl,30h
           mov dl,cl
           mov ah,02h
           int 21h                ;显示CL的个位
           mov dl,'-'
           mov ah,02h
           int 21h                 ;显示“-”
                   
           pop dx                  ;弹出DX
           mov bl,dl               ;将DL送BL
           mov dl,0                ;将DL清零
again4:    sub dh,000ah            ;DH存月,将DH-10
           js  next4
           inc dl
           jmp again4  
next4:      add dh,000ah
           
            add dl,30h
            mov ah,02h
            int 21h                ;显示DH的十位,即月的十位
            add dh,30h
            mov dl,dh
            mov ah,02h
            int 21h                  ;显示DH的个位
            mov dl,'-'
            mov ah,02h
            int 21h
            mov dl,0
again5:     sub bl,000ah             ;DL存天
            js  next5
            inc dl
            jmp again5  
next5:      add bl,000ah
            add dl,30h
            mov ah,02h
            int 21h 
            add bl,30h
            mov dl,bl
            mov ah,02h
            int 21h
            mov dl,' '            ;显示空格
            mov ah,02h
            int 21h
;--------------------------------------时间
                  mov ah,2ch      ;系统功能调用,读系统时间
                  int 21h
                  push dx
                  mov dl,0
a1:        sub ch,000ah           ;CH存小时
           js  n1
           inc dl
           jmp a1  
n1:        add ch,000ah
          
           add dl,30h
           mov ah,02h
           int 21h
          
           add ch,30h
           mov dl,ch
                   
           mov ah,02h
           int 21h
         
          
           mov dl,':'
           mov ah,02h
           int 21h                 ;显示“:”
           mov dl,0
a2:       sub cl,000ah             ;CL存分钟
          js  n2
          inc dl
          jmp a2  
n2:       add cl,000ah
        
           add dl,30h
           mov ah,02h
           int 21h
          
           add cl,30h
           mov dl,cl
           mov ah,02h
           int 21h
           mov dl,':'            ;显示“:”
           mov ah,02h
           int 21h
          
           pop dx
           mov dl,0
          
a3:       sub dh,000ah           ;DH存秒
            js  n3
            inc dl
           jmp a3  
n3:        add dh,000ah
           add dl,30h
           mov ah,02h
           int 21h 
           add dh,30h
           mov dl,dh
           mov ah,02h
           int 21h

          pop dx
                   pop cx
                    pop bx
                   pop ax
          
 ret
list endp 
;------------------------------------定时程序
dingshi proc near
       push ax
       push bx
       push cx
       push dx
    call clear               ;调用清显示部分屏幕
    mov dl, 'i'
        mov ah,02h
        int 21h
     mov dl, 'n'
     mov ah,02h
     int 21h

 mov ax,data
 mov dx,ax
 
 mov ah,01h
 int 21h
    sub al,30h
 mov bh,al
 mov ah,01h
 int 21h
    sub al,30h
 mov bl,al
 mov dl,':'
 mov ah,02h
 int 21h
 mov ah,01h
 int 21h
     sub al,30h
 mov dh,al
 mov ah,01h
 int 21h
    sub al,30h
 mov dl,al                              ;存输入数据,BHBL:DHDL
 push dx
 
;----------------------------------------小时的十位的判断
shi10:           mov ah,2ch
             int 21h
                mov dl,0
dao1:          sub ch,0ah
               js  dao2
               inc dl
               jmp dao1
dao2:      
                     
           cmp bh,dl                            ;判断小时的十位
           jnz shi10
;-----------------------------------------小时的个位的判断
 shi:            mov ah,2ch
            int 21h
               mov dl,0
 dao3:         sub ch,0ah
               js  dao4
               
               jmp dao3
dao4:       add ch,0ah
            cmp ch,bl                              ;判断小时的个位
            jnz shi

           
;--------------------------------------------分钟的十位的判断
                   
fen10:  mov ah,2ch
    int 21h
             
        mov dl,0
dao5:    sub cl,0ah
        js  dao6
        inc dl  
        jmp dao5  
dao6:   mov bl,dl                             ;将DL中的分的十位送BL
     
        pop dx                                  ;将输入的DH,DL弹出
        cmp bl,dh                             ;判断分的十位
        push dx
        jnz fen10
;--------------------------------------------------分钟的个位判断     
fen:            mov ah,2ch
            int 21h
                mov dl,0
dao7:           sub cl,0ah
                js  dao8
                   
               jmp dao7  
dao8:       add cl,0ah
            pop dx

            cmp cl,dl                              ;判断分的个位
            push dx
            jnz fen
pop dx
mov dl,'s'
mov ah,02h
int 21h
mov dl,'t'
mov ah,02h
int 21h
mov dl,'o'
mov ah,02h
int 21h
mov dl,'p'
mov ah,02h
int 21h                  ;定时结束,显示STOP
pop dx
pop cx
pop bx
pop ax
ret  
dingshi endp      
;-------------------------------
  SECOND   PROC  NEAR            ;1秒延时子程序
                  PUSH  AX
                  PUSH  BX
                  PUSH  DX
            MOV   AH,00H
            INT     1AH          ;读计时单位       
            ADD    DX,1        
            MOV    BX,DX
    L1:     MOV    AH,00H
            INT     1AH
            CMP    DX,BX          ;满1秒?,否,继续累计
            JNZ     L1
                    POP    DX
                    POP    BX
                    POP    AX  
            RET
  SECOND    ENDP
;-------------------------------------
clear  proc near
   ;save registers
       push ax
       push bx
       push cx
       push dx
  
   
;clear  screen

     ;定窗口显示时钟          
       mov ah,7    ;to scroll downward function
       mov al,0    ;code to blank scree
       mov bh,70h    ;reverse video attribute
       mov ch,0    ;upper left row
       mov cl,0    ;upper left column
       mov dh,0  ;lower right row
       mov dl,20  ;lower left column
       int 10h     ;call video ROM
   ;定位
       mov ch,0
       mov cl,24
       mov ah,01h
       int 10h
       mov dh,0
       mov dl,0
       mov bh,0
       mov ah,02h
       int 10h
   ;locate cursor
       mov dx,0   
       mov ah,2    ;to locate column
       int 10h     ;call video BIOS
  ;restore registers
       pop dx
       pop cx
       pop bx
       pop ax
       ret
clear endp
;------------------------
clall2 proc near
      push ax
      push bx
      push cx
      push dx
      mov ah,6    ;to scroll up screen
      mov al,0    ;blank screen
      mov bh,7    ;blank line
      mov ch,0    ;upper left row
      mov cl,0    ;upper left column
      mov dh,24   ;lower right row
      mov dl,79  ;lower left column
      int 10h     ;call video BIOS
      pop dx
       pop cx
       pop bx
       pop ax
       ret
clall2 endp

;---------------------------------------------
mb  PROC far
       push ax
       push bx
       push cx
       push dx
  

        MOV       AH,0              ;检测键盘,有键按下才开始
        INT       16H
        ;设置中断向量
        CLI                         ;清中断标志
        CLD                         ;清方向标志
        MOV       AX,0000H          ;设置中断向量
        MOV       DS,AX
        MOV       SI,0020H         
        LODSW
        MOV       BX,AX
        LODSW
        PUSH      AX                ;
        PUSH      BX                ;
        MOV       AX,DATA           ;
        MOV       DS,AX
        MOV       AX,0000H          ;
        MOV       ES,AX             ;
        MOV       DI,0020H          ;
        MOV       AX,OFFSET TIMER   ;
        STOSW
        MOV       AX,SEG TIMER      ;
        STOSW
        ;初始化8253              
        MOV       AL,00110110B      ;0计数器,工作方式3,先写最底有效字节,再写最高有效字节
        OUT       43H,AL
        MOV       AX,10923          ;设初值
        OUT       40H,AL
        MOV       AL,AH
        OUT       40H,AL
        IN        AL,21H
        PUSH      AX
        MOV       AL,0FCH           ;中断屏蔽,只对键盘irq1和电子时钟基准irq0开中断
        OUT       21H,AL
        STI

        call      clearall          ;清全屏     
       
FOREVER:
        call      clear1             ;定位清屏
        call      show              ;显示秒表
      
       MOV      AH,0BH              ;检测有键按下否?
       INT      21H
       CMP      AL,00H              ;AL=0,无键按下
       JZ       FOREVER             ;无键按下,转LOP
       MOV      AH,08H              ;有键,读键值AL
       INT      21H
      
        CMP       AL,'d'
        JZ        EXIT              ;是d则退出
              
        cmp       al,'m'            ;是m则记录数据
        jnz       g
        MOV       AH,2
        MOV       BH,0
        MOV       DH,row
        MOV       DL,25
        INT       10H 
        call      show
        inc       row
        
    g:  cmp       al,'r'            ;是r则重新开始计时
        jnz       FOREVER
        mov       m2,'0'            ;归零
        mov       m1,'0'
        mov       s2,'0'
        mov       s1,'0'
        mov       ms2,'0'
        mov       ms1,'0'
        mov       row,0
        call      clearall
    
        JMP       FOREVER           ;显示秒表
EXIT:  
        pop dx
        pop cx
        pop bx
        pop ax
        ret
mb ENDP
;-------------------------------------------------
show    proc near
         push      ax
         push      bx
         push      cx
        
          
        MOV       BX,OFFSET m2  ;读m2首地址
        MOV       CX,8           ;循环8次
DISP1:  MOV       AL,[BX]        ;取bx对应的m2值
        CALL      DISPCHR        ;显示[bx]
        INC       BX             ;指向下一存储单元
        LOOP      DISP1         
       
       MOV       AL,0DH         ;回车
        CALL      DISPCHR
       
        pop       cx
        pop       bx
        pop       ax
        ret
show    endp

;----------------------------------------
clear1  proc near
       push ax
       push bx
       push cx
       push dx
  
;clear  screen

     ;定宽          
       mov ah,7    ;to scroll up screen
       mov al,0    ;blank screen
       mov bh,70h    ;blank line
       mov ch,1    ;upper left row
       mov cl,0    ;upper left column
       mov dh,0  ;lower right row
       mov dl,7  ;lower left column
       int 10h     ;call video BIOS
   ;din wei
       mov ch,0
       mov cl,24     
       mov dh,row
       mov dl,0
       mov bh,0
       mov ah,02h
       int 10h
   ;locate cursor
       mov dx,0   
       mov ah,2    ;to locate column
       int 10h     ;call video BIOS
 
       pop dx
       pop cx
       pop bx
       pop ax
       ret
clear1 endp
;------------------------
clearall proc near
       push ax
       push bx
       push cx
       push dx

       mov ah,6    ;to scroll up screen
      mov al,0    ;blank screen
      mov bh,7    ;blank line
      mov ch,0    ;upper left row
      mov cl,0    ;upper left column
      mov dh,24   ;lower right row
      mov dl,79  ;lower left column
      int 10h     ;call video BIOS
       pop dx
       pop cx
       pop bx
       pop ax
       ret
clearall endp
;------------------------------

DISPCHR  PROC      NEAR

         PUSH      BX
         MOV       BX,0     ;在0页显示
         MOV       AH,14    ;调用bios
         INT       10H
         POP       BX
         RET
DISPCHR  ENDP
;------------------------------

     
   
TIMER  PROC  FAR

         PUSH      AX
         INC       ms1
         CMP       ms1,'9'        
         JLE       TIMEXT
         MOV       ms1,'0'             ;大于‘9’,ms1位清零
         INC       ms2
         CMP       ms2,'9'
         JL        TIMEXT
         MOV       ms2,'0'             ;大于‘9’,ms2位清零
         INC       s1
         CMP       s1,'9'
         JLE       TIMEXT
         MOV       s1,'0'              ;大于‘9’,s1位清零
         INC       s2
         CMP       s2,'6'
         JL        TIMEXT
         MOV       s2,'0'              ;大于‘5’,s2位清零
         INC       m1
         CMP       m1,'9'
         JLE       TIMEXT
         MOV       m1,'0'              ;大于‘9’,m1位清零
         INC       m2
         CMP       m2,'6'
         JL        TIMEXT
         MOV       m2,'0'              ;大于‘5’,m2位清零
TIMEXT:  MOV       AL,20H
         OUT       20H,AL
         POP       AX
         IRET
TIMER  ENDP

;mov ah,4ch
;int 21h

code   ends
       end start

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值