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

📄 jml023.asm

📁 本程序是用汇编语言实现数字时钟功能的.通过修改8259中断控制器的中断屏蔽寄存器(21H号端口) 打开时间中断, 实时中断, 键盘中断
💻 ASM
字号:
;数字时钟程序
;Sept.20,1994
;****************** 宏定义块 ******************
;输入一个字符   结果在 AL中
getchar macro
        mov    ah,01h
        int    21h
        endm
;------------------------------
;显示一个字符   字符为char
prt     macro   char
        mov     dl,char
        mov     ah,02h
        int     21h
        endm
;------------------------------
;显识一个字符串  串起始地址为:stradr
disp    macro   stradr
        lea     dx,stradr
        mov     ah,09h
        int     21h
        endm
;------------------------------
;光标置位        光标位置为(行,列):curadr
setcur  macro   curadr
        push    bx
        mov     bx,0
        mov     dx,curadr
        mov     ah,02h
        int     10h
        pop     bx
        endm
;------------------------------
;保存光标位置      光标位置同上
getcur  macro   curadr
        push    bx
        push    cx
        mov     bx,0
        mov     ah,03h
        int     10h
        mov     curadr,dx
        pop     cx
        pop     bx
        endm
;*******************************************************
stack   segment para stack 'stack'
        dw  80 dup(?)
stack   ends
;-----------------------------------------------------
data    segment
oldvect dw 2dup(?)                                           ;旧中断矢量存放地址
msg     db 'Please input the start time:(hh:mm:ss) $'        ;输入提示
errmsg  db 0ah,0dh,'invalid number ',0ah,0dh,'try again $'   ;错误信息
curaddr dw ?                                                 ;光标位置
alt     db 5                                                 ;修正参数
count   db 18                                                ;时间常数
ht      db ?                                                 ;
hs      db ?                                                 ;小时
        db ':'
mt      db ?                                                 ;
ms      db ?                                                 ;分
        db ':'
hst     db ?                                                 ;
hss     db ?                                                 ;秒
        db ' $'                                              ;串结束标志
data    ends
;------------------------------------------------------
code    segment
begin   proc    far
        assume  cs:code,ds:data,ss:stack,es:data
start:  push    ds
        sub     ax,ax
        push    ax
        mov     ax,data
        mov     ds,ax
        mov     es,ax
;****************************************************
        lea     si,ht                                ;SI<-时间起始地址
        disp    msg                                  ;显示提示信息
        getcur  curaddr                              ;存光标位置
        mov     cx,03h                               ;确定外循环次数
lop:    push    cx
        mov     cx,02h                               ;确定内循环次数
loop1:  setcur  curaddr                              ;置光标
        getchar                                      ;输入字符
        getcur  curaddr                              ;保存当前光标
        cmp     al,'0'
        jl      err
        cmp     al,'9'
        jg      err                                  ;如输入字符不在'0'-'9'则进行出错处理
        mov     [si],al                              ;保存字符
        inc     si
        jmp     terlop
err:    disp    errmsg                               ;显示出错信息
        dec     curaddr
        setcur  curaddr                              ;恢复光标
        jmp     loop1
terlop: loop    loop1
        prt     [si]                                 ;显示时间分隔符
        inc     curaddr
        inc     si
        pop     cx
        loop    lop
        mov     ax,0070                              ;数字时钟显示位置
        mov     curaddr,ax
;----------------------------------------------------        
;关中断        
        cli
        in      al,21h
        or      al,01h
        out     21h,al
;-------------------------------------------------------
;保存1C中断向量
        mov     ax,351ch
        int     21h
        mov     oldvect,bx
        mov     ax,es
        mov     [oldvect+2],ax
;-------------------------------------------------------
;置新1C中断向量___ TIMER过程的地址
        push    ds
        mov     dx,offset timer
        mov     ax,seg timer
        mov     ds,ax
        mov     al,1ch
        mov     ah,25h
        int     21h
        pop     ds
;------------------------------------------------------
;修改8259中断控制器的中断屏蔽寄存器(21H号端口)
;打开时间中断, 实时中断, 键盘中断
        in      al,21h
        and     al,0f8h
        out     21h,al
        sti
;-------------------------------------------------------
;显示时钟
loop2:  setcur  curaddr
        mov     ch,10h
        mov     ah,01h
        int     10h
        disp    ht
        mov     al,hss
wwww:   cmp     al,hss                        ;秒位发生变化则重新显示
        jz      wwww                          ;数字钟,否则等待
        jmp     loop2
begin   endp

;*******************************************************
;新1CH中断服务程序______时间处理程序
timer   proc    near
        push    ds            ;保存数据段寄存器
        push    ax            ;保存累加器
        mov     ax,data
        mov     ds,ax
        mov     es,ax
        dec     count         ;计数器减一
        jz      next        
        jmp     backup        ;不为 0则返回
next:   mov     count,12h     ;重置初值
        dec     alt           ;修正标志减一
        jnz     conti         ;<>0,继续
        inc     count         ;为 0修正
        mov     alt,05h       ;置修正初值
conti:  inc     hss           ;以下为时间处理从秒位开始
        cmp     hss,'9'
        jle     backup
        mov     hss,'0'
        inc     hst
        cmp     hst,'6'
        jl      backup
        mov     hst,'0'
        inc     ms
        cmp     ms,'9'
        jle     backup
        mov     ms,'0'
        inc     mt
        cmp     mt,'6'
        jl      backup
        mov     mt,'0'
        inc     hs
        cmp     hs,'3'
        jnz     conti1
        cmp     ht,'1'
        jnz     conti1
        mov     hs,'1'
        mov     ht,'0'
        jmp     backup
conti1: cmp     hs,'9'
        jle     backup
        mov     hs,'0'
        inc     ht
backup: mov     al,20h                   ;发EOI指令
        out     20h,al
        pop     ax                       ;恢复原寄存器
        pop     ds
        iret
timer   endp
code    ends
        end     start
 begin
 cmp     mt,'6'
        jl         bx
        pop     ax                       ;恢复原寄存器
        pop     es
        pop     ds
        iret
;t_end   db ?
timer   endp
code    ends
        end     start

⌨️ 快捷键说明

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