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

📄 1111.asm

📁 汇编masm的时钟程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
  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 

⌨️ 快捷键说明

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