本篇博文主要介绍如何利用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
二、截图