📄 jml023.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 + -