📄 clock.asm
字号:
.MODEL SMALL
.DATA
keep_ip dw 2 dup(?)
count dw 0
hour dw 0
min dw 0
sec dw 0
row db 0
clom db 0 ;光标的行和列
.CODE
main proc far
start:
push ds
sub ax,ax
push ax
mov ax,@data
mov ds,ax
;保存原来的中断1CH
mov al,1ch
mov ah,35h
int 21h
mov keep_ip ,bx
mov keep_ip+2,es
push ds
mov count,18
;设置新的中断1CH
mov dx,offset clock
mov ax,seg clock
mov ds,ax
mov al,1ch
mov ah,25h
int 21h
;程序驻留用DOS中的31H号中断
mov ah,31h
mov al,0
int 21h
;恢复中断1CH
push ds
mov ax,keep_ip+2
mov ds,ax
mov dx,keep_ip
mov al,1ch
mov ah,25h
int 21h
main endp
;时钟中断程序
clock proc near
mov ax,@data
mov ds,ax
push ax
push bx
push cx
push dx
push ds
push es
mov ah,2ch
int 21h
mov bh,0
mov bl,ch
mov hour,bx
mov bh,0
mov bl,cl
mov min,bx
mov bh,0
mov bl,dh
mov sec,bx
dec count
jnz exit
;保存光标 用INT 10H中的3号中断
mov bh,0
mov ah,3
int 10h
mov row,dh
mov clom,dl
;设置光标 用INT 10H中的2号中断
mov bh,0
mov dh,0
mov dl,46h
mov ah,2
int 10h
;计数和进位处理
inc sec
cmp sec,60
jnz noclear
mov sec,0
inc min
cmp min,60
jnz noclear
mov min,0
inc hour
cmp hour,24
jnz noclear
mov hour,0
noclear:
call show
mov count,18
;恢复光标 用INT 10H中的2号中断
mov ah,02
mov bh,0
mov dh,row
mov dl,clom
int 10h
exit:
pop es
pop ds
pop dx
pop cx
pop bx
pop ax
iret
clock endp
show proc near
mov ax,hour
call bindec
mov bx,0
mov al,':'
mov ah,0eh
int 10h
mov ax,min
call bindec
mov bx,0
mov al,':'
mov ah,0eh
int 10h
mov ax,sec
call bindec
ret
show endp
;将2为位数的整数转换为字符显示
bindec proc near
mov cx,10d
call decdiv
mov cx,1
call decdiv
ret
bindec endp
decdiv proc near
mov dx,0
div cx
;显示单个字符用INT 10H中的0E号中断
mov bx,0
add al,30h
mov ah,0eh
int 10h
mov ax,dx
ret
decdiv endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -