本篇博文主要介绍如何利用8253计数器计时。
8253计数器每秒大概计数18次。每计数一次就会向CPU发出中断请求。也即每55ms就会
发一次中断请求。CPU响应中断,调用的是int 1ch。
以下代码的作用时利用int 1ch中断计时60秒,在屏幕上显示00至59,然后程序自动退出。
一、代码
initint equ 1ch
data segment
addr dw ?,?
time dw ?
count db ?
divide db 10
data ends
sseg segment stack
dw 512 dup (?)
sseg ends
code segment
assume cs:code,ds:data,ss:sseg
start:
mov ax,data
mov ds,ax
mov ax,sseg
mov ss,ax
mov ax,0
mov es,ax
;保存1ch中断的原始地址
mov ax,es:[initint*4]
mov addr,ax
mov ax,es:[initint*4+2]
mov addr[2],ax
;加入新中断服务程序地址
cli
lea ax,isr
mov es:[initint*4],ax
mov ax,seg isr
mov es:[initint*4+2],ax
sti
mov time,0
mov count,0
again:
cmp time,60
jae exit
jmp again
;恢复原中断地址
exit:
cli
mov ax,addr
mov es:[initint*4],ax
mov ax,addr[2]
mov es:[initint*4+2],ax
sti
mov ah,4ch
int 21h
isr proc far
push ax
push cx
push dx
;告诉中断服务子程序变量在哪
mov ax,data
mov ds,ax
sti
inc count
cmp count,18 ;近似把18次中断记作一秒
jae go
back:
pushf
call dword ptr addr
cli
pop dx
pop cx
pop ax
iret
go:
mov count,0
;获得秒的十位和个位
mov ax,time
div divide
mov cl,al
mov ch,ah
;显示十位
mov ah,2
add cl,30h
mov dl,cl
int 21h
;显示个位
add ch,30h
mov dl,ch
mov ah,2
int 21h
;回车
mov dl,0dh
mov ah,2
int 21h
inc time
jmp back
isr endp
code ends
end start
二、截图